遗传算法处理非法字符串



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

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

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

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

我可以想到两个选项:

  1. 如您所示,如果生成的值超出范围,则再试一次。当然,该算法可能在一个循环中堆叠,在这种情况下,即使经过数百万代,种群也可能不会进化。

  2. 因为你是最大化的,你应该在目标函数中添加一个对非法n值的负惩罚。这样,您将使您的算法远离非法数字。我需要看一下你们的执行情况才能作出具体评论。但希望这能有所帮助。

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

顺便说一下,我一直更喜欢进化计算而不是遗传算法,因为我经常发现交叉只会把我带入死胡同。

最新更新