diff --git a/ue05/ga.R b/ue05/ga.R new file mode 100644 index 0000000..1292d51 --- /dev/null +++ b/ue05/ga.R @@ -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") +} diff --git a/ue05/single_fixed_alpha.pdf b/ue05/single_fixed_alpha.pdf new file mode 100644 index 0000000..737d4f7 Binary files /dev/null and b/ue05/single_fixed_alpha.pdf differ diff --git a/ue05/single_rand_alpha.pdf b/ue05/single_rand_alpha.pdf new file mode 100644 index 0000000..c12a5d2 Binary files /dev/null and b/ue05/single_rand_alpha.pdf differ diff --git a/ue05/whole_fixed_alpha.pdf b/ue05/whole_fixed_alpha.pdf new file mode 100644 index 0000000..88b8fb4 Binary files /dev/null and b/ue05/whole_fixed_alpha.pdf differ diff --git a/ue05/whole_rand_alpha.pdf b/ue05/whole_rand_alpha.pdf new file mode 100644 index 0000000..00d134e Binary files /dev/null and b/ue05/whole_rand_alpha.pdf differ