有没有办法改进我的遗传算法?

Is there a way to improve my genetic algorithm?

我对 GA 产生了兴趣,想做我自己的。
这是任务,我要实现:
我有一个 "world" 16x16 字段。我用随机基因创建了 16 个机器人。每个基因都是一个数组,包含 1-19 中的 4 个数字(16-19 将转向机器人方向,1-15 是机器人将沿指定方向移动的场数)。在这个词中,我采取了一个随机位置,并试图使领导者机器人到目标的距离尽可能小。

我创建新一代的方式:

  1. 选择距离最短的8个机器人并将它们放入下一代(不交叉)

  2. 对我在“1)”中选出的 8 个最好的机器人进行交叉(所以我得到了 8 个新机器人)

  3. 随机变异 2 个交叉机器人,并最终将它们放入下一代。现在我有 16 个新一代机器人。

问题是:我只有 1/100 次尝试得到距离 == 0。但是我经常得到距离 1 和 2(我等到第 1000 代然后我放弃,再试一次) 有没有办法改善这一点?还是不能用 GA 做得更好?

有很多地方出错了。

一些一般性评论

  1. 遗传算法通常是算法学家的最后一门课程。当 Dijkstra(最适合您的用例)、线性规划、特定约束满足技术等都失败时,您可以使用它们。据推测,您使用它们是因为您想探索这个区域。

  2. 使用遗传算法的人很少指望他们能实现一个解的全局最优。 "Good" 局部最优通常是您能做的最好的。 GA 会很容易地找到这些,但很难 "zeroing" 找到解决方案。 (加州大学伯克利分校的计算机科学家 Papadimitriou 已经表明,进化实际上并没有最大化适应性,而是基因的混合性。)

交叉与突变

交叉用于交换已知有效的基因组的大部分。突变改进了基因组的片段。粗略地说,交叉可以帮助您将两个好的解决方案结合起来,希望这会很快 bootstrap 您得到一个更好的解决方案,而突变则探索 space 附近的解决方案。

Crossover 也可以破坏一个好的解决方案,方法是将其分成两个单独没有意义的部分,或者将两个产生 non-sensical 输出的部分组合起来。

在许多情况下,变异足以探索整个 space,尽管速度很慢。在您的 space 中就是这种情况,因为分数会随着您与目标的距离而单调下降。在更复杂的 space 中,交叉可能会帮助您跳过局部最小值之间的障碍。

放在一起

我的建议是您在给定时间内减少种群中的交叉数量。最初,交叉可能会帮助你在进步中获得一些快速的收获。但是,随着时间的推移,尤其是在模拟接近尾声时,您会需要精细的改进。此技术类似于 simulated annealing.

是时候调试进化了!

最终的解决方案(路径)是什么样的?我想,他们只能去 NSEW。如果是这样,那么很容易陷入局部(相差一两个)解决方案。

此外,观察最佳解决方案如何随时间演变也会很有用。这可能非常有见地(而且看起来很有趣!)

祝调试顺利!

我想根据我使用 GA 的经验添加一些内容。 在我的研究中,我发现使用“精英选择”来创建 N+1 代通常也会在解决方案上创建一个平台:确实,您正在严格且非常快速地走向最佳解决方案,但您可以找到一个局部最小值并在那里保持阻塞(参见图中的橙色)。

所以我做了什么:我添加了一个随机步骤(不仅仅是最佳元素的交叉和变异),其中显然解决方案更糟糕但可以跳转到一个新的最小值,可以是全局的(你的零,图中的绿色跳跃)

你能做什么?尝试在 N+1 代中使用 7 个最好的元素,然后从第 N 代中选择 8 个随机元素(可能是最差的)。