0

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

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

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

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

4

2 回答 2

1

有两种选择,我能想到:

  1. 如您所述,如果生成的值超出范围,请重试。当然,算法可能会循环堆叠,在这种情况下,即使经过数百万代,人口也可能不会进化。

  2. 由于您正在最大化,因此您应该在目标函数中为 n 的非法值添加负惩罚。这样,您将偏向您的算法以远离非法数字。我需要查看您的实施情况才能发表具体评论。但希望这会有所帮助。

于 2013-04-24T23:57:41.227 回答
1

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

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

于 2013-04-24T23:57:49.480 回答