library(ggplot2) library(gganimate) linscale.initpopulation <- function(n) { return(runif(10)) } linscale.scale <- function(population, a, b) { return(a * population + b) } linscale.relfitness <- function(population) { return(population / sum(population)) } linscale.tracegens <- function(popul, a, b, n) { lenpopul <- length(popul) df <- data.frame( generation = 0 ,individual = 1:lenpopul ,fitness = popul ,relfitness = linscale.relfitness(popul) ) for(i in 1:n) { popul <- linscale.scale(popul, a, b) df <- rbind(df, data.frame( generation = i ,individual = 1:lenpopul ,fitness = popul ,relfitness = linscale.relfitness(popul))) } return(df) } linscale.experiment <- function(avals, bvals, n, popul=c()) { df <- data.frame( generation = integer() ,individual = integer() ,fitness = double() ,relfitness = double() ,a = double() ,b = double()) if(length(popul) == 0) { popul <- linscale.initpopulation(10) } for(a in avals) { for(b in bvals) { dftmp <- linscale.tracegens(popul, a, b, n) dftmp["a"] <- a dftmp["b"] <- b df <- rbind(df, dftmp) } } return(df) } linscale.plot <- function(df) { pdf(file="linscale.pdf", onefile=TRUE) for(g in unique(df$generation)) { p <- ggplot(data=df[df$generation == g, ]) + geom_col(aes(x=individual, y=relfitness)) + facet_grid(b ~ a, labeller = label_both) + labs(title=sprintf("generation: %i", g)) print(p) } dev.off() } linscale.animate <- function(df) { anim <- ggplot(data=df) + geom_col(aes(x=individual, y=relfitness)) + facet_grid(b ~ a, labeller = label_both) + labs(title="generation: {closest_state}") + transition_states(generation) anim_save("linescale.gif", animation=anim) } data.population <- linscale.initpopulation(10)