gpt4 book ai didi

r - 为什么实际的世代数与 R 中的遗传算法不一样

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:18:58 26 4
gpt4 key购买 nike

我正在使用 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)

最佳答案

查看函数代码,似乎在每次迭代(生成)中,以一定的概率(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)

关于r - 为什么实际的世代数与 R 中的遗传算法不一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606802/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com