2011-04-07 58 views
6

这是一个通用的问题,尽管我很确定它的一些部分已经得到解答,但我需要的是意见而不是广泛的讨论。我打算做进化计算和遗传编程的硕士论文,我希望Linux/C++专家的意见是否可以从遗传程序创建源代码文件,调用gcc编译它们,如果它们失败编译以捕获失败的原因,如果它们编译执行编译的程序(作为新的进程),然后能够向该程序发送输入并捕获输出和任何引发的异常(或崩溃)。我知道这个话题太广泛了,但我想知道是否有人认为这是可撤销的,很难尝试,或者即使可以有更好的方式来做到这一点。C++遗传编程:调用链接器/编译器,执行编译后的程序和管道输入/输出

+0

根本不傻,但非常耗时。在智力上具有挑战性的部分是想出一个很好的C++ DNA进化。你原始汤的主题/目标是什么? – 2011-04-07 18:23:29

+0

是否有限制做到这一点是C++?我认为如果你打算让软件发生变化,可能会有更好的选择... – 2011-04-07 18:26:34

+0

这不会起作用。发生突变并最终有助于改善是极不可能的。编译器不会忍受单个字母的变化,它们被设计为做相反的事情。 – 2011-04-07 18:43:16

回答

1

是的,有可能这样做,而且其实很简单。你将源代码输出到一个临时文件(mkstmp),fork/exec一个编译过程(输出到一个临时文件),你的fork/exec生成的程序,在此之前你dup2pipe插入一个输入和一个输出。这是基本的Unix编程,在C中做这件事并不复杂。

代码生成本身可能会更难以正确,但这很大程度上取决于项目。

此外,我们拥有几个月以来的现代化工具:我相信Clang可能是最值得关注的东西。如果您计划执行的代码很简单(或者不简单,但是结构化),那么您也可以直接输出LLVM代码。这并不难,并且使您能够及时生成高效的编译代码。

+0

非常感谢您的链接!我没有想过使用其他编译器。 它自己的代码生成将是一个GP进化的过程,所以如果它没有编译,它就会死亡。如果编译和崩溃,段,引发异常等,它会死亡。即使它编译和运行顺利,它仍然必须按照每种情况下所需做的来生存。我想我可以改用Clang。代码生成将完全取决于所需任务的世代和复杂性。 – 2011-04-07 21:24:37

1

你想在这个遗传程序中优化什么?除了寻找运行的程序外,您还需要寻找什么标准?我不太明白...

要清楚,我问这个问题的原因是因为我只理解使用遗传算法试图解决某种优化问题。在这种情况下,你会有某种启发式方法,你可以评估过程中的所有孩子,然后根据启发式和选择标准培育新的后代。我不明白产生这个源的预期结果是什么,或者你会如何创建启发式来评估它。

+0

它不是一个试图优化某些东西的遗传算法,它是一种机器学习 - 人造生命,试验看看机器是否有可能演化复杂的计算机代码,从中可以学习和演化更复杂的代码。程序功能,类别等将在每种情况下都应符合特殊标准进行评估,并且这样做有望能够创建“规则集”。例如,在我的第一步中,我会尝试发展一个函数,返回两个输入中哪一个更大。稍后,引擎应该能够使用该功能。 – 2011-04-07 21:18:36

+0

好吧,如果你想使用遗传算法,在某个时间点,你将不得不根据你想优化的东西形成你的问题。你还需要形式化启发式评估你正在生成的源代码。我不明白为什么你在做什么与遗传算法有关。不过很酷的是,它似乎试图通过随机更改源代码行来“发展”计算机,但似乎并没有任何背后的方法。 – jberg 2011-04-07 21:22:50

+0

有一种方法!此外,它不是一种优化算法,它是一种演化算法,用于创建可行,有意义且可用的代码。通过以下方式进行评估:a)编译错误检查b)异常检查c)无法完成任何可能的目标(输入和输出检查)。就像我说过的,我之前做过这件事,我的担心不是评估本身,而是与编译器和被调用的过程进行沟通,以便进行实际评估。此外,它不是一个GA,它是一个GP,没有字符串编码,固定的字符串,等等。参见:http://www.genetic-programming.org – 2011-04-08 01:41:06