1

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

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

此外,欢迎对创建程序集想法的整个程序集的方法或设置发表任何评论,并表示赞赏!(如果你看不出来,我很新)

谢谢!

4

4 回答 4

4

我可能错了,但这听起来很像您对遗传编程感兴趣。一个很好的基础是阅读(我会推荐这本关于机器学习的书,它很棒)。

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

于 2013-02-07T22:16:15.707 回答
2

如果你想“进化”源代码,你必须能够操纵它。使用抽象语法树最容易做到这一点。使 AST 易于操作的工具称为程序转换系统,这些工具可以编码源到源的转换规则,这些规则可以充当基因突变。

我们的 DMS Software Reengineering Toolkit 的一个这样的规则代码如下所示:

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

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

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

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

于 2013-02-07T23:18:23.417 回答
0

随机改变代码不会产生线性变化。你的小改变应该主要带你走向成功。所以它与蛮力没有区别。遗传算法将被草稿到混乱状态。

于 2013-08-15T14:32:22.017 回答
0

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

GeneticProgramming .NET是一个可以帮助您起步的项目。几年前还有一篇关于使用 C# 和 Windows 窗体进行遗传编程的 MSDN 文章:使用 C# 进行自然选择

于 2013-02-07T22:12:07.147 回答