8

这是一个普遍感兴趣的问题,因为我不是试图解决一个特定的问题。我环顾四周,试图找到一些涵盖该领域的文章,但我什至很难将一些好的搜索词放在一起。

让我们从我所知道的开始:我接受过大学水平的人工智能教育,包括基因编程和更广泛的进化算法类,尽管自从我十年前毕业以来,我并没有经常接触它们。我想知道这些方法是否可以用来创建机器代码来解决问题(也许是 x86,或者一些“任意”指令集)。我们能否发展算法本身,例如可以计算平方根或在屏幕上绘制令人愉悦的图像?是否可以使用进化算法来创建创建优化代码(针对大小、速度等)的整个编译器?

此外,我经常认为遗传编程或进化算法本身并不是物种进化的良好证据。涉及进化算法的问题解决方法似乎总是需要将智能写入其中。一个人如何创建一个真正的进化算法,从而真正产生真正有趣和令人惊讶的结果?

TLDR:进化算法的使用在创建一种机器代码时是否有用,以前有没有进化算法的例子通常产生真正有趣和令人惊讶的结果?

缺口

4

3 回答 3

6

使自然进化发挥作用的一件事是它是非常开放的。你只需要找到一种方式,任何方式,传递你的基因,而且成功率各不相同。

相比之下,程序被期望做一些非常具体的事情,通常要么工作要么不工作。对于遗传算法,小的变化需要能够贡献小的(或大的)改进,以便在适应度环境中攀升。但是程序的健身环境是可怕的。

换句话说:有无数个程序“几乎”对列表进行排序,这些程序对列表进行排序的程序完全不同,因此不能通过一个小的突变变成一个。大多数对列表进行排序的程序也会因为一个突变而严重破坏,而不是产生几乎正确的结果,无论这意味着什么。这些结合起来意味着很难通过小渐进程度的进化来产生这样的算法(或任何算法)。

至少,当我尝试做类似的事情时,我认为这是我学到的。我很想被证明是错误的。

于 2012-08-12T19:47:50.027 回答
4

GP可以生成可执行代码吗?当然!只需使用 LISP。

John Koza 很久以前就确立了您可以使用基因编程来创建程序。http://www.genetic-programming.com/johnkoza.html他写了两本关于这个主题的厚书。

大多数 GP 在 LISP 中完成的原因是机器代码非常结构化,因此对于您的基因组到表型映射“让 00000 是 MOV,让 00001 是 JNE 等”是不可行的。相反,您基本上必须使用更复杂的编码。S 表达式作为真正明显的构建块出现。

于 2012-08-13T20:01:11.013 回答
1

我知道至少一种称为FINCH的方法,它是一种进化 Java 字节码的方法。他们的网站上有一些演示文稿和参考出版物。我认为字节码可能比 x86 机器码更容易进化,因为它是堆栈机器而不是寄存器机器的代码。寄存器机器要复杂得多,因为您需要将写指令的寄存器与读指令对齐。在堆栈机器上,您只需将一个值压入堆栈,下一个操作就会读取它。

于 2012-08-13T19:41:39.190 回答