遗传算法处理非法字符串

时间:2013-04-24 22:05:41

标签: algorithm genetic-algorithm

我正在尝试实现遗传算法以最大化n变量的函数,使得每个变量都在[-n, n]范围内。

为了使交叉不那么复杂,在生成初始总体时,我只生成从02n的数字,然后在评估适应度时,我从每个中减去n。由于n可能很小,我决定使用位串而不是整数数组来表示染色体。

现在的问题是在交叉和变异期间产生非法值(大于2n)。一种方法是在交叉和变异期间用合法值替换非法值。但这会有点复杂,也可能影响性能。

所以我想知道我是否可以在交叉和变异时离开检查和更换,而是在完成两者之后再进行检查。所以,在我拥有新一代之后,我将遍历每个人的染色体并替换非法字符串并计算适合度。另外,是否可以在不更换非法位串的情况下逃脱?

2 个答案:

答案 0 :(得分:1)

有两种选择,我可以想到:

  1. 如您所示,如果生成的值超出范围,请再试一次。当然, 算法可以堆叠在一个循环中,在这种情况下,即使在数百万代之后,人口也可能不会发展。

  2. 由于您正在最大化,因此您应该为目标函数中的非法n值添加否定惩罚。这样,您将偏向您的算法以远离非法数字。我需要看看你的实现做出具体评论。但希望这会有所帮助。

答案 1 :(得分:1)

您不需要替换中间人群的非法位字符串 - 您只需要为最终人口执行此操作。一种解决方案是为位串保存最后几个(2或3)合法值,以便在替换最终填充中的非法位串时可以随机迭代这些值(而不是必须完全组成合法值)

顺便说一句,我总是更喜欢evolutionary computation遗传算法,因为我经常发现交叉会让我陷入一条死胡同。