遗传算法:命名驱动突变位置的部分

时间:2013-06-25 12:26:00

标签: algorithm genetic-algorithm gradient-descent

要设置我的问题,请允许我以示例开头:

假设一组1000个数组(也就是行向量)的长度相同。每个都填充-1和1之间的随机数。然后随机拉出500个这些行向量并将它们相加。我现在从总和开始,并希望对原始1000中的选择进行逆向工程。

我决定用遗传算法来解决这个问题。我启动了一个1000位长的字符串系列并运行mutate(又名,flip-a-random-bit)和交叉程序。然后,在十分之一秒后,我是75%的权利。然后,再过一个小时,我是76%的权利。从本质上讲,我一直在等待几十个位正确设置。可能是我的随机数生成器从未以可以合并到解决方案中的方式引入它们。

该算法在开始时表现很好,但未能进一步改进解决方案。我试着确保我的遗传家族有一个可能的位置。那没有用;你无法判断物品会从池中消失的速度。

似乎算法必须有一个额外的组件。必须有一些东西推动选择翻转位(aka,变异)位置。这件作品的技术术语是什么?梯度?它来自哪里?

4 个答案:

答案 0 :(得分:0)

我认为你的意思是“收敛速度”或“收敛速度”。你的文学问题有很多解决方案。我建议每次迭代都要降低突变率,直到你陷入局部最优(收敛速度太低,绝对或相对),然后重置或增加突变率以逃避局部最优。

另外,你做了什么样的选择?如果他们比孩子更好,你会保留父母吗?你选择最好的个人还是做轮盘赌选择(这会使次优解决方案有更多的熵)?

答案 1 :(得分:0)

这是一个非常全面的教程,应该帮助您了解培训过程和所涉及的融合。你是对的,它是一种梯度下降的形式。

http://informatics.indiana.edu/larryy/al4ai/lectures/03.IntroToGAs.pdf

该文件已移动,现在可以在此处找到:

http://shinyverse.org/al4ai/lectures/03.IntroToGAs.pdf

答案 2 :(得分:0)

遗传算法不是一种精确算法,它是一种启发式算法。这意味着无论你怎么努力,只有少数非常罕见的情况下,你才真正想要达到最佳解决方案。所以你正在以一定的速度交换精度。这并不意味着算法是一个失败者,只是它设计的问题不需要精确的解决方案,而是一个很好的近似。这也意味着必须具有算法的结束条件,而不是找到最佳条件。这意味着必须存在一个评估解决方案并告诉您它有多好的函数。

如果您想尝试增加一点精度,那么您将不得不使用特定问题的知识来调整您的启发式。这意味着,使用您对该问题的了解来设计更好的突变(不使用预定义的突变),并且还可以改进对种群的精细化,即选择算法。我再说一遍,这不能保证你会找到最佳状态。

在你的特定情况下,我会相信几分钟后你会陷入局部最大值。这意味着从这里开始,你不会变得更好。这有时可以通过向群体中注入一些随机元素来解决,以使算法脱离最大值。有时也可以通过刻意选择不好的解决方案来解决这个问题。

答案 3 :(得分:0)

所以基本上你有一个数字s,你想找到一个加起来为s的数字子集。这被描述为subset sum problem,这是knapsack problem的特例。

我认为你对遗传算法应用的阐述是错误的。要想象可以考虑从一组1000个项目中选择500个项目的可能解决方案的数量,请阅读以下数字[“超过500”的二项式系数]:

270288240945436569515614693625975275496152008446548287007392875106625428705522193898612483924502370165362606085021546104802209750050679917549894219699518475423665484263751733356162464079737887344364574161119497604571044985756287880514600994219426752366915856603136862602484428109296905863799821216320source)。

首先澄清一下:遗传算法和相关方法是元启发式,这意味着它们不适合找到最优解,而是在很短的时间内找到“好的”解决方案。要在NP难的问题中找到最佳解决方案,您必须在最坏的情况下尝试每一种可能的组合。有一些精确优化的方法可以智能地划分搜索空间并仅评估较少数量的解决方案,但仍需要数周时间才能得出最佳答案。

如果您需要找到这个确切的最佳值,我建议您寻找确切的方法,例如branch and bound。您可以使用例如众所周知的CPLEX优化器将您的问题描述为整数程序。请查看ILP formulation of the TSP上的示例,了解如何实现这一目标,并将其转化为您的问题。

如果您不需要找到确切的最佳值,您可以在遗传算法中监控几件事以提高其输出:

  • 使用足够大的人口规模和选择压力。您希望避免genetic drift的影响,仍然可以实现收敛。
  • 监控人口中的差异(多样性)。它快速下降吗?如果人口中的所有解决方案基本相同,则算法已收敛。一旦融合,你需要重新启动它,或者引入新的遗传信息来重振进化过程。
  • 改变突变的强度。在搜索开始时翻转多个比特,并在搜索结束时减少仅翻转几个比特。
  • 使用多个交叉点(我假设您使用的是单点交叉)。对于这么长的字符串,你可能想要使用10个交叉点。