X86 进化算法有可能创建机器代码吗?

X86 进化算法有可能创建机器代码吗?,x86,genetic-algorithm,genetic-programming,evolutionary-algorithm,X86,Genetic Algorithm,Genetic Programming,Evolutionary Algorithm,这是一个大家都感兴趣的问题,因为我不想解决一个具体的问题。我环顾四周,试图找到一些涉及这一领域的文章,但我甚至在努力拼凑一些好的搜索词 让我们从我所知道的开始吧:我接受过大学水平的人工智能教育,包括遗传编程和更广泛的进化算法课程,尽管自十年前毕业以来,我很少与它们打交道。我想知道这些方法是否可以用来创建机器代码来解决问题(可能是x86或某些“任意”指令集)。我们是否可以自行发展算法,比如计算平方根的算法,或者在屏幕上画出令人愉悦的图像?进化算法能否用于创建整个编译器,从而创建优化的代码(大小、速

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

让我们从我所知道的开始吧:我接受过大学水平的人工智能教育,包括遗传编程和更广泛的进化算法课程,尽管自十年前毕业以来,我很少与它们打交道。我想知道这些方法是否可以用来创建机器代码来解决问题(可能是x86或某些“任意”指令集)。我们是否可以自行发展算法,比如计算平方根的算法,或者在屏幕上画出令人愉悦的图像?进化算法能否用于创建整个编译器,从而创建优化的代码(大小、速度等)

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

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


尼克

让自然进化起作用的一件事是它是非常开放的;你只需要找到一种方法,任何一种方法,来传递你的基因,并且有一系列不同的成功率

相比之下,程序被期望做一些非常具体的事情,通常要么有效,要么无效。对于遗传算法来说,小的改变需要能够带来小的(或大的)改进,以便在适应度方面有所提升。但健身计划的前景是可怕的

换言之:有无限多的程序“几乎”对列表进行排序,这与对列表进行排序的程序完全不同,因此不能通过一个小的变异将其变成一个列表。大多数对列表进行排序的程序也会因为一次变异而严重崩溃,而不会产生几乎正确的结果,不管这意味着什么。这些组合意味着很难通过微小的渐进进化产生这样的算法(或任何算法)


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

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

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

约翰·科扎(John Koza)很久以前就建立了可以使用基因编程来创建程序的理论。他就这个问题写了两本厚厚的书


大多数GP都是用LISP编写的,原因是机器代码是非常结构化的,因此不可能将基因组映射到表型映射“让00000为MOV,让00001为JNE,等等”。相反,您必须使用更复杂的编码。S表达式成为了真正显而易见的构建块

我用遗传算法解了二次方程,也读了遗传算法,你也可以随机画图。机器码不是GAs的好原始基因组,因为绝大多数随机序列都是天生畸形的(甚至不会运行,更不用说做有用的事情了)这并不是说GAs不能用来进化有趣的代码,但你需要仔细选择基因组的性质(特别是它的解释)和你希望应用的适应度函数。您可以尝试使用机器代码,但我怀疑您会遇到严重的收敛问题。我认为这完全取决于您所说的“创建机器代码”是什么意思。您始终可以创建一些虚拟指令集,将其编译或转换为机器代码。举个例子:(虽然严格来说,他们是在编译C#/.NET,但从偷来的)我在一些文章或一本书中读过关于用GAs生成最佳表达式的文章或书。这是可能的。实际上,排序网络(一组预定义的比较,保证对
n
值进行排序)是使用进化技术生成的高性能程序的首批成功示例之一。Danny Hillis使用进化技术生成非常好的分拣网络: