遗传算法 - 收敛

时间:2015-06-17 12:53:34

标签: java algorithm function genetic-programming convergence

我对遗传算法和整体GA有几个问题。

我创建了一个GA,当给定指向曲线时,它会尝试找出产生此曲线的函数。

以下是一个例子 点

{{-2, 4},{-1, 1},{0, 0},{1, 1},{2, 4}}

功能

x^2

有时我会给它一些永远不会产生函数的点,或者有时会产生一个函数。它甚至可以取决于初始树的深度。

有些问题:

  • 为什么树深度在尝试评估点数时非常重要 产生令人满意的功能?
  • 为什么我有时会过早收敛而GA永远不会 如果循环会爆发吗?
  • 我该怎样做才能防止过早收敛?
  • 退火怎么样?我该如何使用它?

你能快速查看我的代码并告诉我它是否有明显的错误吗? (这是测试代码,我需要做一些代码清理。)

https://github.com/kevkid/GeneticAlgorithmTest

资料来源:http://www.gp-field-guide.org.uk/

编辑: 看起来托马斯的建议运作良好我得到了非常快的结果,并且不那么早熟的收敛。我觉得增加基因库可以提供更好的结果,但我不确定它是否真的在每一代都变得更好,或者它是随机的事实允许它找到正确的解决方案。

编辑2: 根据托马斯的建议,我能够让它正常工作,似乎我遇到了幸存者和扩大我的基因库的问题。另外,我最近在我的GA测试中添加了常量,如果有其他人想要查看它。

2 个答案:

答案 0 :(得分:2)

为了避免过早收敛,您还可以使用多个子群体。每个子群体将独立发展。在每一代结束时,您可以在子群体之间交换一些个体。

我为遗传编程变体进行了多子群体的实施:http://www.mepx.org/source_code.html

答案 1 :(得分:1)

我没有时间深入挖掘您的代码,但我会尝试回答我在GAs上所记得的内容:

  

有时我会给它一些永远不会产生函数的点,或者有时会产生一个函数。它甚至可以取决于初始树的深度。

我不确定这里的问题是什么,但是如果你需要一个结果,你可以尝试选择提供给定点距离最小的函数(可以是总和,平均值,点数)等等,取决于你的需要)。

  

为什么树深度在试图评估点并产生令人满意的函数时很重要?

我不确定你的树深度是什么,但它可能影响两件事:

  • 准确度:即深度越高,溶液可能越准确或者给出突变的可能性越多
  • 性能:取决于您所说的树,更高的深度可能会提高性能(允许对功能进行更多有根据的猜测)或减少它(需要生成和比较更多解决方案)。
  

为什么我有时会过早收敛,如果循环,GA永远不会爆发?

这可能是由于突变太少。如果你有一组解决方案都围绕局部最优收敛,那么只有轻微的突变可能不会使得到的解决方案远离局部最优解以便突破。

  

我该怎样做才能防止过早收敛?

您可以允许更大的突变,例如当解决方案开始趋同时。或者,您可以将全新的解决方案投入到混合中(想想是"移民")。

  

退火怎么样?我该如何使用它?

退火可以用来逐渐改善您的解决方案,一旦他们开始收敛到某一点/最佳,即您以更加可控的方式改进解决方案,而不是随机的"突变。

您还可以使用它来突破局部最优值,具体取决于它们的分布方式。例如,您可以使用您的GA直到解决方案开始收敛,然后使用退火和/或更大的突变和/或全新的解决方案(您可以使用不同的方法生成几组解决方案并在最后进行比较),创建您的新的人口,如果收敛被打破,用GA开始新的迭代。如果解决方案仍然收敛于同样的最佳值,那么您可以停止,因为预计不会有更大的改进。

除此之外,启发式算法仍然可以达到局部最优,但这是他们提供的权衡:性能与准确性。