You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

89 lines
2.2 KiB

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)