And*_*rin 0 algorithm artificial-intelligence genetic-algorithm
我对 GA 感兴趣并想做我自己的。
这就是我想要实现的任务:
我得到了一个 16x16 的“世界”字段。我用随机基因创建了 16 个机器人。每个基因是一个包含 1-19 的 4 个数字的数组(16-19 将转向机器人方向,1-15 是机器人将在指定方向上前进的场量)。在这个词中,我采取随机位置并试图使从领导机器人到目标的距离尽可能小。
我创造新一代的方式:
挑选距离最小的 8 个机器人并将它们放入下一代(无交叉)
为我在“1)”中挑选的 8 个最好的机器人做交叉(所以我得到了 8 个新机器人)
问题是:在我所有尝试的 1/100 中,我只得到距离 == 0。但是我经常得到距离 1 和 2(我等到第 1000 代,然后我放弃,再试一次)有没有办法改善这一点?还是不能用 GA 做得更好?
有很多事情都出错了。
一些一般性评论
遗传算法通常是算法学家最后的选择。当 Dijkstra(最适合您的用例)、线性规划、特定约束满足技术等都失败时,您可以使用它们。据推测,您使用它们是因为您想探索这个区域。
使用遗传算法的人很少期望他们实现解决方案的全局最优。“好的”局部最优通常是你能做的最好的。GA 会很容易地找到这些,但很难“归零”解决方案。(加州大学伯克利分校的计算机科学家 Papadimitriou 已经表明,事实上,进化并没有最大化适应度,而是基因的可混合性。)
交叉与突变
交叉用于交换已知有效的基因组的大部分。突变改进了基因组的片段。粗略地说,crossover 帮助你结合两个好的解决方案,希望这能快速引导你找到一个更好的解决方案,而变异探索解决方案附近的空间。
Crossover 还可以通过将一个好的解决方案分解成两个单独没有意义的部分或组合两个产生无意义输出的部分来破坏一个好的解决方案。
在许多情况下,突变足以探索整个空间,尽管速度很慢。在您的空间中就是这种情况,因为分数随着与目标的距离而单调递减。在更复杂的空间中,交叉可以帮助您跳过局部最小值之间的障碍。
把它放在一起
我的建议是在给定的时间内减少种群中的交叉量。最初,交叉可能会帮助您快速获得进展。但是,随着时间的推移,尤其是在模拟接近尾声时,您将需要精细的改进。这种技术类似于模拟退火。