我发现像这样的遗传算法模拟非常迷人,我认为自己制作会很有趣。但大多数像这样的模拟的问题在于,它们通常只是爬山到一个可预测的理想结果,而这种结果本可以在人类指导下很容易地制作出来。一个有趣的模拟会有无数不同的解决方案,这些解决方案彼此之间会有很大的不同,并且会让观察它们的人感到惊讶。
那么我将如何尝试创建类似的东西呢?期望实现我所描述的目标是否合理?有没有我可以从中汲取灵感的“标准”模拟(从某种意义上说,生活游戏是标准化的)?
取决于你所说的有趣。这是一个相当主观的术语。我曾经为了好玩而编写了一个图形分析器。该程序将首先让您绘制您选择的任何 f(x) 并设置界限。第二步是在 x 的随机生成函数中创建一棵树,其中包含最常见的二元运算符 (+-*/)。该程序将创建一个这样的随机函数池,测试它们与原始曲线的拟合程度,然后对池中的一些函数进行杂交和变异。
结果非常酷。一个完全奇怪的函数通常是查询函数的一个很好的近似值。也许不是最有用的程序,但仍然很有趣。
I think EvoLisa is a GA that produces interesting results. In one sense, the output is predictable, as you are trying to match a known image. On the other hand, the details of the output are pretty cool.
为了获得有趣的紧急行为(不可预测但有用),可能需要给遗传算法一个有趣的学习任务,而不仅仅是一个简单的优化问题。
例如,您提到的 Car Builder(虽然本身非常好)只是使用固定道路作为适应度函数。这使得遗传算法很容易找到最佳解决方案,但是如果道路会发生轻微变化,则该最佳解决方案可能不再适用,因为解决方案的适应度可能已经增长依赖于景观中微不足道的小细节并且不是稳健的对其进行更改。实际上,汽车也不是在一条固定的测试道路上进化,而是在许多不同的道路和地形上进化。使用不断变化的道路作为(动态)适应度函数,由随机因素生成,但在斜坡等的某些现实边界内,将是一个更现实和有用的适应度函数。
好吧,对于初学者来说,遗传算法不会爬山,否则它会卡在第一个局部最大值/最小值。
另外,你怎么能说它不会产生令人惊讶的结果呢?看看这里的这辆车,例如在我尝试的一次运行中生产的第 7 代左右。这是一辆非常古老的自行车模型。当人类花了几千年才想出相同的模型时,你怎么能说这不是一个令人惊讶的结果呢?