源代码的遗传进化

时间:2013-02-07 22:05:43

标签: c# code-generation genetic-algorithm cil dynamic-assemblies

我很想知道在C#中编写“自编”的代码。我知道这在广义上是不可能的,但我正在考虑为动态程序集设置某种格式,该程序集定义除了某些目标函数的主体之外的所有内容。 然后算法或神经网络尝试填充函数体。然后执行程序集,然后新启动的程序集尝试调用目标函数,然后创建另一个基于相同代码的新程序集,希望更好地实现该目标函数。

鉴于这种行为,C#和动态程序集是一个合适的选择(我担心创建时间和执行程序集会花费的时间)。是否有一些语言专门用于动态创建要执行的代码,或者C#是否足够好?

此外,欢迎并欢迎任何有关整个装配体创建装配理念的方法或设置的评论! (如果你不知道,我很新)

谢谢!

4 个答案:

答案 0 :(得分:4)

我可能错了,但听起来很像你对Genetic Programming感兴趣。一个很好的基础是一些阅读(我建议this book on machine learning,这很棒)。

特别是对于遗传编程,您可以尝试GPdotNET,但对于更广泛的机器学习,我肯定会看Accord .NET Framework。 Accord背后的人写了一个great blog,这也很有用。

答案 1 :(得分:2)

如果你想“发展”源代码,你必须能够操纵它。使用抽象语法树最容易做到这一点。使AST容易操作的工具称为program transformation systems,它们可以编码可以作为基因突变的源到源转换规则。

我们的DMS软件重组工具包的一个这样的规则代码如下所示:

 swap_operators(x:product,y:term): sum-> sum
       "\x + \y " ->  "\x - \y" if  somecondition();

如果应用“+”,则将“+”替换为“ - ”。理想情况下,你有一堆这些“交叉”运算符(切换运算符,改变表达优先级,改变变量,改变控制结构等)和“某些条件”来控制交叉运算符是否作为演化的一部分应用步骤

您需要其他方法来编译/运行/评估演进程序的适用性。

要使用DMS执行类似的操作,您需要DMS读取(解析为AST)基线程序(“初始生成”),应用一组进化转换,为修改后的AST发出代码,编译并运行它们(DMS可以调用“编译”和执行等子进程),评估结果选择这一代的前N个,再次应用进化运算符,重复直到天堂或你的电费溢出。

答案 2 :(得分:0)

C#适用于遗传编程,特别是现在动态语言运行时在.NET框架中,可以通过C#的动态关键字访问。

GeneticProgramming .NET是一个可能让你离开的项目。几年前还有一篇关于使用C#和Windows Forms进行遗传编程的MSDN文章:Natural Selection with C#

答案 3 :(得分:0)

随机变换代码不会进行线性更改。你的小改动应该主要带你走向成功。所以它与蛮力无异。遗传算法将陷入混乱状态。