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