sync
This commit is contained in:
131
ue06/es.R
Normal file
131
ue06/es.R
Normal file
@@ -0,0 +1,131 @@
|
||||
library(reshape)
|
||||
library(tidyverse)
|
||||
library(ggforce)
|
||||
|
||||
normalize_landscape <- function(landscape) {
|
||||
min_val <- min(landscape)
|
||||
max_val <- max(landscape)
|
||||
range_val <- max_val - min_val
|
||||
|
||||
return((landscape - min_val) / range_val)
|
||||
}
|
||||
|
||||
plot_landscape <- function(landscape) {
|
||||
p <- ggplot(data=melt(landscape), aes(x=X1, y=X2, z=value)) +
|
||||
geom_contour_filled()
|
||||
|
||||
return(p)
|
||||
}
|
||||
|
||||
init_population <- function(landscape, n) {
|
||||
|
||||
population <- list()
|
||||
dims <- length(dim(landscape))
|
||||
|
||||
for(i in 1:n) {
|
||||
coords <- round(runif(dims, 0, 1) * dim(landscape))
|
||||
sigmas <- rnorm(dims)
|
||||
|
||||
population[[i]] <- matrix(c(coords, sigmas), ncol=2)
|
||||
}
|
||||
|
||||
return(population)
|
||||
}
|
||||
|
||||
next_generation <- function(landscape, population) {
|
||||
return(map(population, function(indiv) {
|
||||
return(select_indiv(landscape, list(indiv, create_child(indiv))))
|
||||
}))
|
||||
}
|
||||
|
||||
select_indiv <- function(landscape, indivs) {
|
||||
return(reduce(indivs, function(a, b) {
|
||||
if(eval_indiv(landscape, a) >= eval_indiv(landscape, b)) {
|
||||
return(a)
|
||||
}
|
||||
|
||||
return(b)
|
||||
}))
|
||||
}
|
||||
|
||||
eval_indiv <- function(landscape, indiv) {
|
||||
dims <- dim(landscape)
|
||||
|
||||
x <- indiv[1,1]
|
||||
y <- indiv[2, 1]
|
||||
|
||||
if(x > dims[1] || y > dims[2] || x < 1 || y < 1) {
|
||||
return(-1)
|
||||
}
|
||||
|
||||
return(landscape[indiv[1,1], indiv[2,1]])
|
||||
}
|
||||
|
||||
create_child <- function(parent) {
|
||||
new_sigmas <- mutate_sigmas(parent[,2])
|
||||
new_coords <- mutate_coords(parent[,1], new_sigmas)
|
||||
|
||||
return(matrix(c(new_coords, new_sigmas), ncol=2))
|
||||
}
|
||||
|
||||
mutate_sigmas <- function(sigmas) {
|
||||
global_rate <- 1 / sqrt(2 * length(sigmas))
|
||||
local_rate <- 1 / (2 * sqrt(length(sigmas)))
|
||||
|
||||
global_step <- global_rate * rnorm(1)
|
||||
|
||||
return(map_dbl(sigmas, function(s) s * exp(global_step + local_rate * rnorm(1))))
|
||||
}
|
||||
|
||||
mutate_coords <- function(coords, sigmas) {
|
||||
return(imap_dbl(coords, function(x, i) x + sigmas[i] * rnorm(1)))
|
||||
}
|
||||
|
||||
experiment <- function(landscape, population, gens) {
|
||||
df <- population_to_df(landscape, population, 0)
|
||||
|
||||
for(g in 1:gens) {
|
||||
population <- next_generation(landscape, population)
|
||||
|
||||
df <- rbind(df, population_to_df(landscape, population, g))
|
||||
}
|
||||
|
||||
return(df)
|
||||
}
|
||||
|
||||
population_to_df <- function(landscape, population, gen) {
|
||||
df <- reduce(imap(population, function(indv, i) indiv_to_df(landscape, indv, i)), rbind)
|
||||
df["generation"] <- gen
|
||||
|
||||
return(df)
|
||||
}
|
||||
|
||||
indiv_to_df <- function(landscape, indiv, index) {
|
||||
return(data.frame(x=indiv[1,1], y=indiv[2,1],
|
||||
sx=indiv[1, 2], sy=indiv[2,2],
|
||||
individual=index, value=eval_indiv(landscape, indiv)))
|
||||
}
|
||||
|
||||
plot_generation <- function(landscape, df) {
|
||||
p <-ggplot(data=df) +
|
||||
geom_contour_filled(data=melt(landscape), aes(x=X1, y=X2, z=value)) +
|
||||
geom_point(aes(x=x, y=y)) +
|
||||
geom_ellipse(aes(x0=x, y0=y, a=sx, b=sy, angle=0))
|
||||
|
||||
return(p)
|
||||
}
|
||||
|
||||
plot_experiment <- function(landscape, df, filename) {
|
||||
pdf(file=filename, onefile=TRUE)
|
||||
|
||||
for(g in unique(df$generation)) {
|
||||
tmp_df <- df[df$generation == g,]
|
||||
|
||||
p <- plot <- plot_generation(landscape, tmp_df)
|
||||
|
||||
print(p)
|
||||
}
|
||||
|
||||
dev.off()
|
||||
}
|
||||
|
BIN
ue06/evolution.pdf
Normal file
BIN
ue06/evolution.pdf
Normal file
Binary file not shown.
BIN
ue06/landscape.Rdata
Normal file
BIN
ue06/landscape.Rdata
Normal file
Binary file not shown.
Reference in New Issue
Block a user