【问题标题】:Genetic Algorithm - convergence遗传算法 - 收敛
【发布时间】:2015-06-17 12:53:33
【问题描述】:

我有几个关于我的遗传算法和遗传算法的问题。

我创建了一个 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/

编辑: 看起来 Thomas 的建议效果很好,我得到了非常快的结果,而且过早收敛也更少。我觉得增加基因库会产生更好的结果,但我不确定它是否真的在每一代都变得更好,或者它是随机的事实是否允许它找到正确的解决方案。

编辑 2: 按照托马斯的建议,我能够让它正常工作,似乎我在获得幸存者和扩大我的基因库方面遇到了问题。如果其他人想看的话,我最近还在我的 GA 测试中添加了常量。

【问题讨论】:

  • @dcsohl 解决了这个问题
  • 嗯,如果我错了,请纠正我,但你总是可以通过以下求和来构造这样的函数 - y0*(x-x1)*(x-x2)*.../(x0-x1)*(x0-x2)*... + ...。所以不需要 GA。
  • 很好奇,您使用什么算法来确定给定的一组点是否适合封闭形式函数?例如,如果将示例中的最后 4 个交换为 5,您的算法会失败吗?
  • @PavelHoral 对,但我只是在使用这个问题,所以我可以更多地理解 GA。这是我第一次尝试编写 GA。它会失败(或给出不满意的答案)。 mohsenmadi 我根据树检查 x 值,这给了我一个 y 值,然后我根据已知值检查 y。所以如果 x=-2 并在 -2 处评估树给我 4 这是正确的答案。它给我的答案越正确,适应度就越高。
  • 并非所有问题都可以通过 GA 解决......而且这个问题看起来确实很难。我可以想到一个好的适应度函数,但是我想不出任何能够产生更好评分解决方案的合理交叉函数。你应该选择一个不同的问题来学习 GA。

标签: java algorithm function genetic-programming convergence


【解决方案1】:

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

我为遗传编程变体执行了多个亚群的实现:http://www.mepx.org/source_code.html

【讨论】:

  • 我不知道是什么物种……可能是同一个东西,名字不同。
【解决方案2】:

我没有时间深入研究您的代码,但我会尝试从我记得的关于 GA 的内容中回答:

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

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

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

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

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

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

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

如何防止过早收敛?

您可以允许更大的突变,例如当解决方案开始收敛时。或者,您可以将全新的解决方案加入其中(将其视为“移民”)。

退火呢?我该如何使用它?

一旦解决方案开始收敛到某个点/最佳值,退火可用于逐步改进解决方案,即您可以以比“随机”突变更可控的方式改进解决方案。

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

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

【讨论】:

  • 回应您的第一点:有时我会给它一个输入,例如指向 x^4 的点,它永远不会给我答案,并且会收敛到一个不正确的解决方案(根本不是解决方案)。对于您的第二点,树深度似乎给了我一个问题。当试图找到 x^4 的解决方案时,它可能永远不会在树深度为 10 时找到它(过早收敛到不令人满意的解决方案),但在树深度为 4 时在 20 代以下找到它。
  • @Kevin 嗯,我仍然不确定树深度的含义(如果我从快速浏览中正确理解了您的代码,我认为它类似于 AST)但是如果更高的深度促进过早收敛然后较低的深度可能只是促进更激进的突变,使算法能够突破局部最优,或者可能使收敛更加困难。我假设根据输入,较低的树深度实际上也可能阻止算法收敛到全局最优值,即解决方案的近似值可能不太准确。
  • 那么突变应该更激进吗?我正在做大约1%的突变率。它采用随机树并替换该树的随机点并生成随机子树。我读了一些关于 Premature Convergence 的文章,也许我的交叉需要更健壮(尝试统一交叉),现在它与 2 个父母交配并产生 2 个孩子,然后将最浅的树节点计数时间传递回交叉函数。我还将人口设置为很高的数字(10,000 名儿童)。
  • @Kevin 强大的交叉会产生与父母相似的孩子。如果他们聚集在同一个地方,孩子们也会这样做。这就是为什么您还要引入突变,以将解决方案(或至少几个解决方案)推离收敛点。突变越激进(即推动力越大),突变解越容易离开局部收敛空间。正如我所说,您可以使用动态突变率,即收敛性越高,突变率越高(或以离散步骤进行)。
  • 是的,听起来不错。我注意到突变的一个问题是它们的随机性。创建突变时,它永远不会传给下一代,因为它已从顶层树中删除。它们的适应度似乎很低,但我想做一个动态突变率会给它更多机会产生更好的树。
猜你喜欢
  • 2021-12-26
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
相关资源
最近更新 更多