什么是遗传编程?

zen*_*nna 57 algorithm genetic-programming evolutionary-algorithm

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

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

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

有任何想法吗?

Tom*_*tle 40

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

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

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

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

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

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

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


Ben*_*son 25

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

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

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

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

编辑引用:

Graham-Rowe,邓肯."收音机出现在电子汤中." 新科学家,第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


小智 9

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

我们大多数人每天都做的那种编程 - 连接GUI事件,推动像素,数据库等等,肯定不是 GP打算构建的程序类型.

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

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

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

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

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


And*_*ner 5

我会说1.和3.

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

关于第1点,我会说搜索空间具有无限多个维度.