什么是遗传编程?

时间:2010-12-07 19:11:22

标签: algorithm genetic-programming evolutionary-algorithm

我已经非常成功地完成了遗传算法的相当多的工作,并且迄今为止忽略了遗传编程。据我所知,大多数程序仍由程序员编写,我很想知道什么是遗传编程?

我想到的一些可能的解释是:

  1. 搜索空间太大,无法在噪音中找到有用的程序
  2. 大多数真实的应用程序无法提供足够的数据来进行这种空间的适应性评估。
  3. 很难将许多实际应用的功效降低到单一适应度量。换句话说,编写合适的适应度函数可能需要与编写实际程序相同的工作量。
  4. 有什么想法吗?

14 个答案:

答案 0 :(得分:39)

这是我在自己的研究中一直在考虑的事情,我想说有很多原因:

  1. GP领域的绝大多数研究都集中在生成公式而不是大多数程序员生成的软件。该领域有许多计算机科学家,但很少有人专注于制作你期望的那种程序,因此该领域的进展缓慢。

  2. 使用LISP有一个重要的重点,因为它可以产生很好的树形结构,易于操作,不幸的命令式程序被忽略,因为它们涉及解决一些棘手的问题。对于程序员要认真对待GP,它必须制作强制性程序。

  3. 真正的程序包含循环结构,但是在GP中很难实现循环而没有各种丑陋的约束来阻止无限循环。

  4. 遗传编程不能很好地扩展。这对于小问题很好,可用语言很少,但正如你在第一点所说的那样 - 搜索空间变得非常快。

  5. 与人类程序员相比,GP可能会非常慢。然而,它是非常可并行的,因此随着更多的处理器内核成为常态,可能会大大受益。

  6. 另一个有效的答案是很难相信代码已经自动生成。这是事实,但在实践中我怀疑这会产生很大影响,因为GP首先无法制作正确的程序。

答案 1 :(得分:25)

遗传编程的难点在于写出一个好的评分函数:

  • 评分函数必须正确判断算法是否具有所需的属性。这比听起来更难 - 比编写测试套件困难得多。该算法可以适应您评分函数的任何怪癖并进行优化。试图进化strcmp?您的算法可能会根据您的通过/失败测试用例的长度发现数学模式。

  • 评分功能必须能够判断被测算法是否部分有效。遗传编程依赖于“爬山”。一个微小的有益突变需要导致分数的微小增量改善。如果您的评分函数只能输出true / false,那么您将随机搜索,而不是基因搜索。

如果你尝试一下,你会发现遗传编程是横向思维的终极目标:你的程序将倾向于以你没想到的各种方式解决问题,其中大多数是出乎意料的(对于严重的问题)应用程序)可能没用。一个着名的案例涉及尝试使用基本电子元件演变振荡器。判断电路的简单性和输出是否振荡。它产生了一些如此简单的东西,研究人员确信它无法工作,但确实如此:它正在拾取和放大环境中的无线电波。

编辑引用:

  格雷厄姆罗,邓肯。 “收音机出现在电子汤中。”新科学家,第175卷,第2358页,第19页(2002年8月31日)。可在http://www.newscientist.com/news/news.jsp?id=ns99992732

在线获取

然而,链接现在似乎已被打破。

新链接为http://www.newscientist.com/article/dn2732-radio-emerges-from-the-electronic-soup.html

答案 2 :(得分:9)

我知道我参加这个派对已经迟到了,但我想提出几点意见。我和John Koza在他的遗传编程4书上有过不可思议的好运。

我们大多数人每天都做的编程 - 挂钩GUI事件,推动像素,数据库等等,肯定是不是 GP打算构建的程序类型。< / p>

John Koza对他的大约一百台机器(如果我没记错的话)的集群所做的是寻找有趣问题的解决方案(想想NP-hard)。令人遗憾的是,我们程序员日常工作的大部分问题都不是非常有趣或困难的问题,大多只是烦躁和耗时。

本杰克逊所说的关于基因工程电子振荡器的内容与Koza博士和团队实际做的最接近。 GP系列丛书中有许多电路示例。

汤姆城堡在这里所说的关于命令式计划并不完全正确。约翰和公司的这个开创性的例子是天线设计运行。它几乎是一个3D绘图程序,其中包含设计天线的LOGO绘图语言等命令。它具有moveto,lineto类型命令,用于在堆栈上推送和弹出矩阵。我上周刚看过的GP包jgap有直接支持:容器类型非终结符,可以包含void return语句,最后有一个return语句。我相信它甚至有类似局部变量的东西,虽然我看起来不太近。

早期GP运行的原始LISP设计是一种时常的痛苦,这当然是正确的。对于将GP运行的输出转换为更有用的代码,我觉得很烦恼。

TL; DR:GP实际上不是一个自动编程系统。这是一个自动发明系统。

答案 3 :(得分:5)

我会说1.和3.

特别是关于第3点,我会说在大多数情况下,编写实际程序甚至更容易,而不是提出合适的目标函数检查这是否导致正确或可接受的解决方案(您如何知道从遗传编程中获得的算法按预期工作?)

关于第1点,我会说搜索空间有无数个维度。

答案 4 :(得分:4)

三件事:

  1. 作为Andre says,编写一个足够的适应度函数非常困难。这是测试驱动开发的终极版本。您必须编写单元测试,以提供100%覆盖尚未写入的程序。即便如此,100%的覆盖率本身也不太可能。当我们解决了正式指定复杂系统所有方面的精确行为,然后验证给定程序是否满足该规范的问题时,我们可能有机会。
  2. 遗传编程是非确定性的,更适合生成近似解,而非精确解。
  3. 遗传编程,当应用于任何合理复杂性的问题时,在计算上非常昂贵。早在1999年,Genetic Programming Inc was using a 1,000-node cluster就是他们在该领域的工作。

答案 5 :(得分:4)

GP不能快速解决创造健身功能的人所不知道的新问题。因此,它目前只能用于解决我们已经知道如何解决的问题,但由于搜索空间的原因,它们并不是完全解决的理想选择。旅行推销员等。使用GA可以更快地解决这个问题。

原因其实很简单。为了解决新问题,你给GP提供的工具需要足够简单或足够完整,以便GP搜索空间成为真正遗传学的真正模拟。

与真正的遗传学一样,遗传编程受到与所有平台增长系统相同的增长模式的制约。这意味着GP将进展到包含核心实用程序的平台,它会平稳,然后需要很长时间才会遇到新的范例,以构建新的平台。

这个支持演化的视频展示了这些平台增长模式。 http://www.youtube.com/watch?v=mcAq9bmCeR0 开发新手需要很长时间,一旦完成,另一只手就会成为新手,并迅速发展成为更多手的最佳示例。 (我应该提一下,这个视频最有可能使用GA,而不是GP,但遗传学是遗传学的)

这与奇点理论(BTW)中的逻辑相同。

但这对GP来说意味着它对于研究而言非常有用,而不是对程序中的实际应用有用。除了一些简单的例外情况,其中的要求比GA可以解决的要求更为深入。比如一些调度程序。编程搜索空间非常小,并且需要很好地理解解决它的工具,并且可以有明确定义的适应度函数。

答案 6 :(得分:3)

这只是因为事实证明它在理论上是不可能的(至少对于正确的程序而言)。

让我们假设您拥有无限的计算能力,可以放弃搜索空间大小和缓慢问题以及其他“速度”问题。 现在你只面临两个问题: - 生成的程序会停止吗? - 如何确保生成的程序按照我希望的方式运行?

第一个问题是可计算性理论中的一个核心问题,并被称为 the halting problem。图灵在1936年证明,这个问题对于所有程序输入对都是不可判定的。 这意味着在某些情况下这是可能的,但不是所有情况都是如此。没有自动化过程可以确定程序是否停止。 所以对此,你做不了多少;)

第二个问题与程序正确性有关。在遗传编程中,通常通过示例值进行验证,这些示例值根本不构成任何正确性证明。 这与单元测试相当,对于许多示例都可以,但不是没有一般证明。例如,如果我写一个质数检查器,只用3 5 7和11进行测试,那么对每个奇数都返回true的程序将通过测试。

更进一步的是使用自动校样。事实上,算法正确性的自动证明与数学自动化定理证明密切相关。您使用公理化系统描述您的程序,并尝试自动证明您的陈述的正确性。 在这里,你再次面临强大的理论障碍,即Gödel Incompleteness theorems。这些定理表明,即使是非常简单的公理化系统,能够对自然数进行算术,也没有能够证明关于这些自然数的所有定理的算法(称为有效程序)。 具体而言,这意味着即使对于简单的程序,您也无法证明其正确性。

即使没有经过验证的正确性,使用样本测试用例来验证遗传程序也很容易过度专业化,这种现象 在机器学习中被称为过度拟合。也就是说,学习的程序在提供的测试用例上会很好,但对于其他一些输入可能完全是弹道导弹。

答案 7 :(得分:2)

也许大多数程序员都是程序员,而不是计算机科学家?

遗传编程需要认真的智慧。您需要能够适当地解决问题,并且您需要一个适当的问题。而且您需要足够了解遗传算法是一种选择。而且问题还不一定是一个众所周知的解决方案。

并非所有东西都需要花哨的算法。在世界上编写的所有代码中,做“标准”webapps,操作系统,设备编程,真的需要遗传算法吗?

当谈到它时,大多数编程工作都致力于解决不需要复杂方法的简单问题。

答案 8 :(得分:2)

我认为其中很大一部分原因是风险管理。跟我说:当一个程序员坐下来编写一个程序时,他们至少知道它需要多长时间以及它们可以做什么。

当程序员坐下来编写一个程序来生成一个程序(使用遗传编程)时,不确定性就会浮出水面:目前还不清楚这个过程需要多长时间,目前还不清楚最终程序有多好

其他地方也存在不确定性:稍后调整程序或修复错误有多容易?生成的代码几乎不可能调试。

答案 9 :(得分:1)

原始汤是可疑的,没有吸引力。对于我的生产代码,我更喜欢智能设计。

答案 10 :(得分:1)

我个人对大学GP研究工作几年后的观点以及事后跟踪:GP无法扩展。

简单的健身功能代表的简单问题GP可以解决所有问题。 但如前所述 - 使用经典方法制定一个描述strcmp或计算器甚至简单文本编辑器的任务的适应度函数几乎是不可能的。

我确实认为GP健身功能的概念是完美的TDD,但是:-) 也许一些聪明的头脑会想出一种更好的方式来指导某一天的模拟进化,但这种情况尚未发生..

我对GP在隐式适应度函数方面有一些希望,我目前正在做一些“私人研究”。我们会看到它会走多远!

干杯, 杰

答案 11 :(得分:1)

有一些项目解决了GP中的上述问题。一个例子是opencog MOSES

答案 12 :(得分:0)

如今,编程正在以机器可读的方式定义精细规范。你告诉程序你想要它做什么以及结果应该如何。它不再多了。这意味着如果你想通过例如生成结果遗传编程你仍然必须以健身功能的形式做这个机器可读的精细规范。这将导致至少相同但可能更大量的工作。 因此,它只是一个错误的遗传编程领域,这个领域是针对容易定义但很难达到规范的问题而制定的。

编辑:你现在可以说,在大多数项目中,这种精细的规范无论如何都是以测试的形式完成的。我会说,对于遗传编程方法,测试是不精确的方式来指定你的需求。它们是基于示例的,而不是基于正式规范语言的编程。遗传编程可能会产生适合测试用例的结果,并且在新输入的实际情况下表现错误。因此,要获得与使用编程语言的规范一样精确的测试的规范级别,您将需要针对每种可能性的大量测试用例。所以最后你最终会做更多的工作而不是编程。

答案 13 :(得分:0)

GP和GA,或者一般的进化算法更像是爱好。它们不用于实际应用,除非例外。原因是这些算法基于随机性。没有确定得到一个好的答案。

此外,这个领域充斥着低于标准的研究工作,因为与其他数学上强烈的技术相比,它易于理解和实施。因此,学生只需找到一个目标,在某些工程或科学应用程序中进行优化,然后您就有了新的工作 - 即可发布。

只需将其会议的赞助商与其他AI / ML /优化会议的赞助商进行比较。很清楚它们在工业中的“当前”重要性。

但它是一个研究领域,它让我们努力工作。目前它只是一个爱好!