我在理解进化算法时遇到了问题。我尝试过多次使用这种技术,但我总是遇到同样的问题:退化为模拟退火。
让我说我的初始人口,括号中的适应性,是:
A(7),B(9),C(14),D(19)
交配和变异后,我有以下孩子:AB(8.3),AC(12.2),AD(14.1),BC(11),BD(14.7),CD(17)
在消除最弱者之后,我们得到了A,AB,B,AC
下一回合,AB将在8附近再次交配,将AC推出。下一轮,再次AB,推出B(假设突变改变适应性大多在> 1范围内)。
现在,在仅仅几圈之后,游泳池就会填充最初最适合的候选人(A,B)和那两个人的突变(AB)。无论初始池的大小如何,都会发生这种情况,只需要更长的时间。比如说,初始人口为50,需要50匝,然后所有其他人都被淘汰,将整个设置转换为更复杂的模拟退火。在一开始我也与自己交配,使问题恶化。
所以,我错过了什么?我的变异率是否太小,如果我增加它会消失吗?
这是我用它的项目: http://stefan.schallerl.com/simuan-grid-grad/ 是的,代码是错误的,界面很糟糕,但我现在懒得修复它 - 小心,它可能会锁定你的浏览器。更好地使用chrome,甚至认为firefox一次不比chrome慢(可能跟踪图像比较得到回报,是的!)。如果有人有兴趣,the code can be found here。
这里我只是放弃了ev-alg的想法,然后去模拟退火。
ps:我甚至不确定模拟退火 - 就像进化算法一样,只有一个人口大小,对吗?
答案 0 :(得分:3)
你似乎正在做的是产生所有可能的后代,然后选择最适合的。这既效率低下(因为你产生的候选人多于你需要的人数),也会导致过早收敛。
相反,你应该生成足够的后代来替换下一代的人口。选择适当数量的候选人作为父母(有利于更健康的个人)然后如果你留下后代并丢弃父母,你应该拥有与你开始时相同数量的个体(暂时覆盖elitism) - 这是你的下一代。重复,直到满足终止条件。
前一段中的“偏袒钳工个人”资格是故意模糊的。您可以通过多种不同的方式进行选择。看来你选择的是最适合的人。这是截断选择。它对某些类型的问题才真正有效。因为你无情地剔除了较弱的个体,所以经常会导致过早收敛。
理想情况下,你想给一个较弱的个体一些生存的机会,因为如果与合适的伴侣配对或以正确的方式进行变异,它可能会产生适合的后代。这就是为什么大多数选择策略都是概率性的。例如,roulette wheel selection为每个人分配一个与其健康分数成比例的概率。所以更健康的人会更频繁地存活,但弱者仍然有一些小的机会。
选择通常是替换,因此对于给定的一代,同一个人可能被选择为父母不止一次。
另一种常用的选择策略是tournament selection。您可能对我撰写的描述different selection strategies and elitism的文档感兴趣。
答案 1 :(得分:1)
在进化算法中,您不一定要与其他人一起跨越人口中的每个人来生成更多的后代。有许多方法可以确定育种阶段的结果,但最基本的方法是采用所有元素的适应性,并使用它们作为权重随机选择每个成员的合作伙伴。这通常最终会导致下一代具有与前一群体相同数量的成员,尽管一些交配方案最终会有更多(基于对手头问题的某种推理)并切断最低值(对于某种类型而言)域特定推理)。对于大多数问题,你也会抛弃上一代。
此外,您的健康需要由复制的目标决定,并且对于每个场景充分推导可能非常具有挑战性。