我正在尝试实现遗传算法以最大化n
变量的函数,使得每个变量都在[-n, n]
范围内。
为了使交叉不那么复杂,在生成初始总体时,我只生成从0
到2n
的数字,然后在评估适应度时,我从每个中减去n。由于n
可能很小,我决定使用位串而不是整数数组来表示染色体。
现在的问题是在交叉和变异期间产生非法值(大于2n
)。一种方法是在交叉和变异期间用合法值替换非法值。但这会有点复杂,也可能影响性能。
所以我想知道我是否可以在交叉和变异时离开检查和更换,而是在完成两者之后再进行检查。所以,在我拥有新一代之后,我将遍历每个人的染色体并替换非法字符串并计算适合度。另外,是否可以在不更换非法位串的情况下逃脱?
答案 0 :(得分:1)
有两种选择,我可以想到:
如您所示,如果生成的值超出范围,请再试一次。当然, 算法可以堆叠在一个循环中,在这种情况下,即使在数百万代之后,人口也可能不会发展。
由于您正在最大化,因此您应该为目标函数中的非法n值添加否定惩罚。这样,您将偏向您的算法以远离非法数字。我需要看看你的实现做出具体评论。但希望这会有所帮助。
答案 1 :(得分:1)
您不需要替换中间人群的非法位字符串 - 您只需要为最终人口执行此操作。一种解决方案是为位串保存最后几个(2或3)合法值,以便在替换最终填充中的非法位串时可以随机迭代这些值(而不是必须完全组成合法值)
顺便说一句,我总是更喜欢evolutionary computation遗传算法,因为我经常发现交叉会让我陷入一条死胡同。