进化算法是否有可能创建机器代码?

时间:2012-08-12 19:22:21

标签: x86 genetic-algorithm genetic-programming evolutionary-algorithm

这是一个普遍感兴趣的问题,因为我并不想解决具体问题。我环顾四周试图找到一些涵盖这个领域的文章,但我甚至在努力拼凑一些好的搜索词。

让我们从我所知道的开始:我在人工智能方面接受了大学水平的教育,包括遗传编程和更广泛的进化算法,尽管我还没有和他们玩过多少自从我十年前毕业以来。我想知道这些方法是否可用于创建机器代码来解决问题(可能是x86,或者某些'任意'指令集)。我们可以自己进化算法,例如可以计算平方根,还是在屏幕上绘制令人愉悦的图像?是否可以使用进化算法创建整个编译器来创建优化代码(用于大小,速度等)?

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

TLDR:进化算法的使用是否可以用于创建一种机器代码,是否有先前的演化算法一般的例子产生真正有趣和令人惊讶的结果?

尼克

3 个答案:

答案 0 :(得分:6)

使自然界中的进化发挥作用的一件事是,它是非常开放的;你必须找到一种方法,以任何方式传递你的基因,并且存在各种不同的成功率。

相反,程序预计会做一些非常具体的事情,通常是工作或不工作。对于遗传算法,小的变化需要能够贡献小的(或大的)改进,以便在健身领域攀登。但是节目的健身状况非常糟糕。

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

至少,这是我在尝试做类似事情时所学到的。我希望被证明是错的。

答案 1 :(得分:4)

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

John Koza很久以前就确定你可以使用遗传编程来创建程序。 http://www.genetic-programming.com/johnkoza.html他写了两本非常厚的书。

大多数GP在LISP中完成的原因是机器代码非常结构化,所以你的基因组到现象的映射是不可行的“让00000成为MOV,让00001成为JNE等”。相反,您基本上拥有来处理更复杂的编码。 S表达式成为非常明显的构建块。

答案 2 :(得分:1)

我知道至少有一种名为FINCH的方法,它是一种发展Java字节代码的方法。他们在自己的网站上有一些演示和参考出版物。我认为字节码可能比x8​​6机器码更容易发展,因为那是堆栈机器的代码,而不是寄存器机器。寄存器机器要复杂得多,因为您需要将写入指令的寄存器与读取指令对齐。在堆栈计算机上,您只需在堆栈上按下一个值,然后下一个操作就会读取它。