我试图通过GA来解决问题并提出几个问题。
第一个问题是关于选择 - 我在许多实现中已经看到,根据得分/适合度先前选择对群体进行分类。真的有必要吗?例如,在锦标赛选择中,应该统一选择个人,因此排序似乎没有任何意义。或者让我们考虑选择轮盘赌轮。通过以下实现再次排序似乎是不必要的(伪代码):
totalFitness = sum individuals i.fitness
rouletteValue = totalFitness * random 0.0 1.0
selected = null
i = 0;
while rouletteValue >= 0.0
selected = individuals[i++]
rouletteValue -= selected.fitness
return selected
那么选择人口进行选择真的有必要吗?
另一个问题是快速收敛:我尝试使用交叉概率为0.9的简单GA,突变概率0.01,群体大小30和初始群体包含非常好的解决方案' (公知)。 Crossover总是生成两个子代,因此一次迭代如下(伪代码):
for i = 0 to population-size
mother = select-one population
while father != mother
father = select-one population
if should-crossover crossover-probability
(sister, brother) = apply-crossover mother father
else
sister = copy mother
brother = copy father
if should-mutate mutation-probability
apply-mutation sister
if should-mutate mutation-probability
apply-mutation brother
insert-at new-population i sister
insert-at new-population i+1 brother
i = i + 2
swap new-population population
同样由于问题的本质,交叉几乎从未提供比父母更好的结果。
所以,粗略地说,发生的事情是因为“良好的解决方案”。比起初始人口中的任何其他解决方案要好得多,它被选择用于比其他个体更频繁的复制(假设有30个人的概率为0.1)。如果没有应用交叉(概率为0.1),那么“好的解决方案”就是一个很好的解决方案。被转移到新的人口中。因此,人口规模平均为30,因此跳过1.5对。因此,在15次迭代之后,跳过了22个交叉。现在作为一个好的解决方案'选择概率为0.1然后在22次跳过交叉之后我会得到2个好的解决方案'插入新的人口。在这种情况发生后,良好的解决方案'扩散到快。
有没有办法克服这个问题?
答案 0 :(得分:0)
关于收敛问题 - 从您描述的参数判断,您正在收敛到种子已知良好的解决方案,因为您的人口远远不够大。
假设您的其余人口是随机生成的,那么这29个人将拥有立即产生更适合的后代的任何成分的可能性非常低。因此,结合10%的无交叉机会,已知良好的个体将始终占据主导地位。
要通过GA生成比您已知商品更合适的个体,您需要显着增加人口,并且可能也会增加交叉概率。您可能还需要削弱选择算法,以防止任何单个强大的个体在任何给定的一代中支配再现周期。