|
|
@ -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") |
|
|
|
} |