定义遗传算法的停止点是否违反了算法的目的?


11

Wikipedia为此定义了GA的终止点:

通常,当生成了最大数量的世代或达到总体的满意适应性水平时,算法就会终止。如果算法由于最大数目的代数而终止,则可能会或可能不会达到令人满意的解决方案。

现在,如果它在达到满意的适应水平时终止,而您又是定义该适应水平的人,那么为什么您不能够一开始就自己创建“完美的”基因组,因为您已经知道了特征这个完美的基因组?

我想我在这里有点困惑。我认为GA的目的是不断发展,并向我们展示可能比我们想象的更好的解决方案,而我们的适应度功能只是在整个过程中对其有所帮助,而不是我们将其作为终止的基础”完美”状态。那不是破坏重点吗?


1
可能更适合cstheory。
Karl Bielefeldt)

甚至没有:)
slandau 2011年

1
@Karl:这个问题对于cstheory来说有点软。它可能会在那里关闭。
罗伯特·哈维

2
谢谢,@ Robert。现在我记得为什么我不去那里。我猜这是那些“裂缝之间”的问题之一。
Karl Bielefeldt

1
您也已经知道“完美伴侣”的特征:它们会让您感到完全快乐!但这还不足以找到它们(更不用说从头开始构建它们了……)。实验也是必要的。
Kilian Foth,2016年

Answers:


17

适应度函数评估算法的输出。看到理想的输出很可能会发现它,但不知道从任何给定输入生成该输出的步骤。那就是遗传算法最有用的地方。

例如,GA的一个常见有趣应用是制作动画,该动画可以有效地移动虚拟生物。很容易分辨出该生物是否以一定速度沿相对直线运动。那就是您的健身功能。要做到这一点,要说出“肌肉”运动的确切顺序要困难得多。


3
还应注意的是,您经常会在x代之后停下来,因为GA可能会无限期地旋转,因为它“卡住”了不满足您的最佳适应性评分的局部最小值/最大值。如果您的选择/交叉/变异功能针对问题集的调整不够好,可能会发生这种情况。
史蒂文·埃弗斯

@Karl我记得安德鲁·库克(Andrew Cooke)的遗传算法解决方案,它产生了第一个Malbolge“ Hello World”,然后丢失了更好的解决方案,并通过电子邮件发送给他stackoverflow.com/questions/5338627/…–
pageman

8

通常,您可以确定解决方案的适用性,但不能直接确定解决方案本身。假设您正在尝试进化快速的兔子,并且有少数基因会影响兔子的速度。您可以测试兔子的速度,但是枚举所有与速度相关的基因的组合是不切实际的。在这种情况下,您可能会有一个GA可以竞速兔子并繁殖最快的兔子。您可以永远这样做,但您可能希望在以下情况下停止:

  • 您发现比X快的兔子,或者
  • n代人的增量改进已降至某个阈值以下,或者
  • 你已经在m代中繁殖了兔子

5

GA的全部重点是为您提供具有该适用级别的问题的解决方案。使用其他更常规的搜索算法很难找到该解决方案,这通常就是为什么首先使用GA的原因。

或代替适应性值限制,您可以决定要运行多少代(运行的世代越多,找到更高适应性值的机会就越大)。例如,在旅行推销员问题中,获得一条需要穿越的城市之间的成本最低的路径。

通常,您的问题取决于您的停止条件是可接受的某个适应性水平还是某个时间限制(在最大时间段内运行GA或在时间紧迫性应用(例如寻路或AI应用)中运行GA的数量有限)域。


3

直观地讲,遗传算法的目的是为不适合直接逻辑分析的问题制定算法解决方案。一旦实现了这一目标,GA便无需进一步追求。

当然,如果需要更好的“适应性”,则可以让遗传算法继续运行,以查看是否可以找到更优化的解决方案,或者可以对遗传算法本身进行调整,以查看它是否可以收敛于更好的解决方案。


2

遗传算法需要某种方式来奖励具有更大传播能力的优良基因。如果您无法从不良基因中分辨出优质基因,那么您根本就无法使用遗传算法。

为了使遗传算法起作用,您必须允许较适合的解决方案优先于较不适合的解决方案进行重现。否则,您将只尝试随机解决方案。

这是根据我的经验得出的一个典型示例:开发第一个语音拨号系统时,我们很难找到一种算法,可以将口述姓名与相同姓名的存储副本进行匹配。有人告诉我们,从25个名字中选出一个名字就可以达到95%的准确性。我们有一个存储的语料库,每个人说25次,每次10次。

首先,我们开发了一种输入系统,该系统可测量口语单词的长度和几个标准化块中的频率能量。然后,我们开发了一种算法,为这些参数上的匹配分配权重,并通过这些权重比较了两组参数。

现在,我们迈出了最后一步-这些权重的值应该是多少?

我们创建了1000组随机权重,并针对语料库对其进行了测试。我们扔掉了表现最差的500强。对于剩下的500个,我们将每个重复一次,并在其中一个重复一遍,随机提高或降低其中一个权重。

我们在计算机上重复了此过程大约两个星期,直到最终它的一组权重达到了95%的准确性标准。然后我们对不在语料库中的数据进行了测试。准确率约为92%。因此,我们花了更长的时间才能使语料库的准确性达到98%,而权重集对不在语料库中的数据产生了95%的准确性。

因此,关键是,您必须具有适应度函数才能运行遗传算法。如果您没有办法从坏基因中分辨出好基因,那么如何确定好基因可以繁殖而坏基因却不能呢?


0

迭代直到解决方案与previos迭代没有太大不同为止。对于很多情况,请了解固定公差。

Solution in iteration n-6: 600
Solution in iteration n-5: 800
Solution in iteration n-4: 768
Solution in iteration n-3: 780 
Solution in iteration n-2: 778
Solution in iteration n-1: 778.23
Solution in iteration n: 780.18
Solution in iteration n+1: 780.1815

在此示例中,如果您的固定公差为0.01,则(n + 1)告诉您停止,因为abs(solution(n + 1)-solution(n))<0.01。

继续,这就是您的算法可以说的:这不会变得更好!


0

为了快速回答您的主要问题:知道要达到的目标与知道如何达到目标之间有很大的区别。

例如,更详细地讲,通过使用遗传/进化算法解决了最流行的问题之一,通常是课堂上的案例研究,在图中找到最佳路线。这通常用于网络中,以找到从一端到另一端的最便宜的路由。在定义成本(跃点数,每个跃点的成本等)时,您还定义了对结果感到满意的目标成本(适合度)。您的算法可能找不到最佳方法,但是会找到算法上可接受的最佳方法。我的意思是,寻找更好答案的成本/收益关系被禁止。

借助GA / EA,您会很快发现95%+的最佳答案是正常行为,但缩小最后5%的成本则成倍增加。因此,理论是您定义一个可接受的最佳值,以在最短的时间内获得最佳结果。由于发现的成本(例如最高的1%)可能会超过最高5%的收益,因此您可以定义可接受的最优值。

综上所述,您现在没有针对任何特定问题的答案,您只是为每个问题定义了可接受的最优值,在该点上找到更好的答案是不切实际的。


0

通过提供阴性和阳性测试用例作为适应度函数以及破损代码作为输入,已有一些研究使用遗传算法修复C语言中的错误。这是一个问题的例子可以由人来解决,但更容易遗传算法做。重要的是要注意:

尽管本文中介绍的方法并未从头开始开发新程序,但它们确实说明了如何开发旧版软件来修复现有故障。

然而,新的方案已经被从头开始,只是进化不是C.写在少数平凡的程序Malbolge深奥的编程语言都(据我所知)得到了进化,不能写。该语言太复杂,程序员无法使用,而且太复杂而无法从逻辑上有效地推导程序,因此其中编写的大多数程序都是由遗传算法生成的。适应度函数通常是到期望输出的编辑距离。

在某种程度上,这是很好的循环。通过观察复杂的遗传密码是由进化过程编写的,我们可以模拟进化过程以使用不同的复杂语言生成代码,甚至不知道代码是如何工作的!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.