В настоящее время я работаю с Генетическими Алгоритмами, и у меня есть следующий код, который создает один граф на итерацию моего алгоритма, оптимизирующего фитнес-функцию:
popSize <- 4
e<-5
d<-10
cromSize <- e+d
potDec<-2^d
fitness.f <- function(x){
abs((x-5)/(2+sin(x)))
}
eval <- function(x){
evaluation <- matrix(ncol = 2, nrow = nrow(x), rep(0,times = nrow(x)), dimnames = list(paste("I", c(1:nrow(x)), sep = ""), c("X", "Fit")))
for(i in 1:nrow(x)){
count <- 0
for(j in 1:cromSize){
count <- x[i,j]*(2^(cromSize-j)) + count
}
count<-count/potDec
evaluation[i,1] <- count
evaluation[i,2] <- fitness.f(count)
}
evaluation <- cbind(evaluation, x)
evaluation <- evaluation[order(evaluation[,2], decreasing = T),]
return(evaluation)
}
cross.f <- function(r, pcrossover){
if(runif(1)<=pcrossover){
hijos <- matrix(ncol = cromSize, nrow = 2, dimnames = list(paste("I",c((nrow(r)+1):(nrow(r)+2)), sep = ""),c()))
c <- r[sample(1:popSize,2),]
tam_cross <- sample(1:(cromSize-1),1)
for(i in 1:2){
for(j in 1:(cromSize-tam_cross)){
hijos[i,j] <- c[i,j]
}
for(k in (cromSize-tam_cross+1):cromSize){
if(i==1){
hijos[i,k] <- c[i+1,k]
}else{
hijos[i,k] <- c[i-1,k]
}
}
}
r <- rbind(r,hijos)
}
return(r)
}
mut.f <- function(r, pmutation){
c <- matrix(ncol = cromSize, nrow = 1, r[sample(1:popSize,1),], dimnames = list(paste("I",(nrow(r)+1), sep = ""),c()))
vecAle <- c(runif(cromSize))
count <- 0
for(j in 1:cromSize){
if(vecAle[j]<=pmutation){
count <- count+1
c[1,j]=abs(c[1,j]-1)
}
}
if(count>0){
r <- rbind(r,c)
}
return(r)
}
selection.f <- function(s){
fit <- eval(s)
aux <- fit[1:popSize,3:(3+cromSize-1)]
row.names(aux) <- paste("I", c(1:popSize), sep = "")
return(aux)
}
main.f <- function(maxIter){
min <- -0
max<-(2^e)+1
x <- c(0,1)
s <- matrix(ncol = cromSize, nrow = popSize, sample(x, cromSize*popSize, replace = T) , dimnames = list(paste("I", c(1:popSize), sep = ""), paste("C", c(1:cromSize), sep = "")))
layout(matrix(c(1,2), 2, 1, byrow = TRUE))
par(mai = c(.7,.7,.7,.4), mgp = c(1,1,0))
plot(fitness.f, xlim = c(min - 0.1, max - 1), main = "Iteración = 0", ylab = "Fit", yaxt = "n")
fit <- eval(s)
points(fit, col = "red")
plot(density(fit[,1]), main = "Densidad de población en la iteracion 0", xaxt = "n", yaxt = "n", xlab = "")
pcrossover <- 0.9
pmutation <- 0.3
for (i in 1:maxIter){
#debug(cross.f)
s <- cross.f(s, pcrossover)
s <- mut.f(s, pmutation)
#debug(selection.f)
s <- selection.f(s)
fit <- eval(s)
layout(matrix(c(1,2), 2, 1, byrow = TRUE))
par(mai = c(.7,.7,.7,.4), mgp = c(1,1,0))
plot(fitness.f, xlim = c(min - 0.1, max - 1), main = c(paste("Iteración =",i)), ylab = "Fit", yaxt = "n")
points(fit, col = "red")
poblacion <- density(fit[,1])
}
}
main.f(20)
Я новичок в Tidyverse, и я хотел бы знать, как я могу изменить графики внутри циклов for в ggplot2, чтобы сделать их более "аккуратными"?