我正在使用R的genalg
库,并试图在运行二进制泛型算法时保存所有代。在库中似乎没有一种内置的方法,所以我试图通过评估函数保存每个染色体,x
。
为了测试这个方法,我尝试在评估函数中插入print(x)
,以便能够看到所有被评估的染色体。然而,印刷染色体的数量并不总是与我所怀疑的相匹配。
我以为印刷染色体的数量将等于群体大小的迭代次数,但似乎并不是一直都在尝试。
问题是,我想知道每个染色体属于哪一代(或迭代),我无法判断染色体的数目是否与iter
倍popSize
不同。
这是什么原因,以及我如何“修复”它。还是有另一种方法来保存每条染色体,以及它属于哪一种迭代?
下面是一个例子,我认为评估函数会打印2x5染色体,但只打印8条染色体。
library(genalg)
library(ggplot2)
dataset <- data.frame(
item = c("pocketknife", "beans", "potatoes", "unions", "sleeping bag", "rope", "compass"),
survivalpoints = c(10, 20, 15, 2, 30, 10, 30),
weight = c(1, 5, 10, 1, 7, 5, 1))
weightlimit <- 20
evalFunc <- function(x) {
print(x)
current_solution_survivalpoints <- x %*% dataset$survivalpoints
current_solution_weight <- x %*% dataset$weight
if (current_solution_weight > weightlimit)
return(0) else return(-current_solution_survivalpoints
}
iter = 2
popSize = 5
set.seed(1)
GAmodel <- rbga.bin(size = 7, popSize = popSize, iters = iter, mutationChance = 0.1,elitism = T, evalFunc = evalFunc)
发布于 2016-04-13 19:16:27
从函数代码来看,似乎在每一次迭代(生成)中都会从种群中选择一个染色体子集(在您的示例中为5
染色体),并且具有一定的概率(在您的例子中为0.1
)并进行变异。只对每一代变异的染色体调用评估函数(当然,对于第一次迭代中的所有染色体,以了解它们的初始值)。
注意,这个子集不包括精英组,在您的示例中,这个组定义为1
元素大(您错误地传递了elitism=TRUE
,TRUE被隐式转换为1
)。
无论如何,要了解每一代的总体情况,您可以通过monitorFun
参数传递一个监视器函数,例如:
# obj contains a lot of informations, try to print it
monitor <- function(obj) {
print(paste(" GENERATION :", obj$iter))
print("POPULATION:")
print(obj$population)
print("VALUES:")
print(obj$evaluations)
}
iter = 2
popSize = 5
set.seed(1)
GAmodel <- rbga.bin(size = 7, popSize = popSize,
iters = iter, mutationChance = 0.1,
elitism = 1, evalFunc = evalFunc, monitorFunc = monitor)
https://stackoverflow.com/questions/36606802
复制相似问题