ue05
This commit is contained in:
113
ue05/ga.R
Normal file
113
ue05/ga.R
Normal file
@@ -0,0 +1,113 @@
|
||||
library(ggplot2)
|
||||
library(gganimate)
|
||||
library(grDevices)
|
||||
|
||||
rand.pupulation <- function(n) {
|
||||
return(matrix(runif(2*n), ncol=2))
|
||||
}
|
||||
|
||||
alpha.fixed <- function(alpha) {
|
||||
return(function() alpha)
|
||||
}
|
||||
|
||||
alpha.runif <- function() {
|
||||
return(function() runif(1))
|
||||
}
|
||||
|
||||
recom.singlearithm <- function(alpha_gen) {
|
||||
|
||||
return(function(parents) {
|
||||
alpha <- alpha_gen()
|
||||
gene_index <- sample(1:ncol(parents), 1)
|
||||
|
||||
gene_p1 <- parents[1, gene_index]
|
||||
gene_p2 <- parents[2, gene_index]
|
||||
|
||||
children <- parents
|
||||
|
||||
children[1,gene_index] <- alpha * gene_p2 + (1 - alpha) * gene_p1
|
||||
children[2,gene_index] <- alpha * gene_p1 + (1 - alpha) * gene_p2
|
||||
|
||||
return(children)
|
||||
})
|
||||
}
|
||||
|
||||
recom.wholearithm <- function(alpha_gen) {
|
||||
return(function(parents) {
|
||||
alpha <- alpha_gen()
|
||||
|
||||
children <- parents
|
||||
|
||||
children[1,] <- alpha * children[1,] + (1 - alpha) * children[2,]
|
||||
children[2,] <- alpha * children[2,] + (1 - alpha) * children[1,]
|
||||
|
||||
return(children)
|
||||
})
|
||||
}
|
||||
|
||||
next.population <- function(population, recom) {
|
||||
next_population <- matrix(, nrow=0, ncol=2)
|
||||
|
||||
parent_pairs <- matrix(sample(1:nrow(population), nrow(population)), ncol=2)
|
||||
|
||||
for(i in 1:nrow(parent_pairs)) {
|
||||
parents <- parent_pairs[i,]
|
||||
next_population <- rbind(next_population, recom(population[parents,]))
|
||||
}
|
||||
|
||||
return(next_population)
|
||||
}
|
||||
|
||||
experiment <- function(population, gen, recom) {
|
||||
df <- data.frame( x = population[,1]
|
||||
,y = population[,2]
|
||||
,generation = 0)
|
||||
|
||||
for(g in 1:gen) {
|
||||
population <- next.population(population, recom)
|
||||
|
||||
df <- rbind(df, data.frame( x = population[,1]
|
||||
,y = population[,2]
|
||||
,generation = g))
|
||||
}
|
||||
|
||||
return(df)
|
||||
}
|
||||
|
||||
plot.experiment <- function(df, filename) {
|
||||
pdf(file=filename, onefile=TRUE)
|
||||
|
||||
for(g in unique(df$generation)) {
|
||||
tmp_df <- df[df$generation == g,]
|
||||
|
||||
p <- ggplot(data=tmp_df, aes(x=x, y=y)) +
|
||||
geom_point() +
|
||||
labs(title=sprintf("generation: %d", g)) +
|
||||
xlim(0, 1) +
|
||||
ylim(0, 1)
|
||||
|
||||
hull <- chull(tmp_df$x, tmp_df$y)
|
||||
|
||||
p <- p + geom_polygon(data=tmp_df[hull,], alpha=0.25)
|
||||
|
||||
print(p)
|
||||
}
|
||||
|
||||
dev.off()
|
||||
}
|
||||
|
||||
all.experiments <- function() {
|
||||
population <- rand.pupulation(20)
|
||||
|
||||
df <- experiment(population, 10, recom.singlearithm(alpha.fixed(0.5)))
|
||||
plot.experiment(df, "single_fixed_alpha.pdf")
|
||||
|
||||
df <- experiment(population, 10, recom.singlearithm(alpha.runif()))
|
||||
plot.experiment(df, "single_rand_alpha.pdf")
|
||||
|
||||
df <- experiment(population, 10, recom.wholearithm(alpha.fixed(0.5)))
|
||||
plot.experiment(df, "whole_fixed_alpha.pdf")
|
||||
|
||||
df <- experiment(population, 10, recom.wholearithm(alpha.runif()))
|
||||
plot.experiment(df, "whole_rand_alpha.pdf")
|
||||
}
|
BIN
ue05/single_fixed_alpha.pdf
Normal file
BIN
ue05/single_fixed_alpha.pdf
Normal file
Binary file not shown.
BIN
ue05/single_rand_alpha.pdf
Normal file
BIN
ue05/single_rand_alpha.pdf
Normal file
Binary file not shown.
BIN
ue05/whole_fixed_alpha.pdf
Normal file
BIN
ue05/whole_fixed_alpha.pdf
Normal file
Binary file not shown.
BIN
ue05/whole_rand_alpha.pdf
Normal file
BIN
ue05/whole_rand_alpha.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user