C#中的遗传编程

时间:2020-03-05 18:40:13  来源:igfitidea点击:

我一直在寻找一些C#的良好遗传编程示例。任何人都知道良好的在线/书籍资源吗?想知道那里是否有用于进化/遗传编程的图书馆?

解决方案

回答

MSDN去年发表了一篇有关遗传编程的文章:遗传算法:Windows形式的适者生存

回答

我在Mike 9 Swanson的channel9上看到了一个很好的高层讨论,网址是http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/

回答

我们是指实际的遗传程序设计,而不是一般的遗传算法吗?

如果是这样,C#/。net并不是最好的语言。例如,LISP一直是GP的支柱。

但是,如果必须的话,我们可能会想要动态生成CIL / MSIL。我们可以使用System.Reflection.Emit进行此操作,但是我建议使用Mono.Cecil。它缺少好的文档(好像反射发射具有它们)。但是它提供了更好的装配发射和反射。

另一个问题是,在.net框架中加载代码并随后将其处置是一件很简单的事情。至少,我们不能卸载装配件。我们可以卸载appdomain,但是将代码加载到单独的appdomain中并在外部调用它的整个过程可能会变得很混乱。 .NET 3.5的System.Addin内容应使此操作更容易。

回答

我们也许可以使用LINQ表达树来实现基因编程-与随机IL生成相比,它更有可能生成可用的东西。

回答

我建议不要实际生成程序集,除非我们绝对需要,特别是如果我们刚开始实施遗传算法时。

当目标语言具有功能并且可以动态键入时,遗传算法最容易实现。这通常就是为什么大多数遗传算法研究都使用LISP编写的原因。结果,如果要用C#实现,最好定义自己的迷你"树语言",让算法生成树,并在需要运行算法的每次迭代时解释树。

我上大学时做了一个这样的项目(C#中的遗传算法的实现),这就是我采用的方法。

以这种方式进行操作将为我们提供的优势是,只有一种表示形式(AST表示形式)可以同时适用于执行和遗传算法"复制"步骤。

或者,如果我们尝试生成程序集,则可能最终将给应用程序增加大量不必要的复杂性。当前,除非销毁了整个应用程序域,否则CLR不允许从应用程序域中卸载程序集。这意味着我们将需要在算法的每次迭代中为每个生成的程序启动一个单独的应用程序域,以避免在应用程序中引入巨大的内存泄漏。通常,整个过程只会增加一堆额外的刺激性。

另一方面,被解释的AST与其他任何对象一样都是可垃圾回收的,因此我们无需费心地使用多个应用程序域。如果出于性能原因要对最终结果进行代码生成,则可以在以后添加对该结果的支持。但是,我建议我们使用DynamicMethod类来执行此操作。它将允许我们在运行时动态地将AST转换为已编译的委托。这将使我们能够部署单个DLL,同时使代码生成工作尽可能简单。而且,DynamicMethod实例是可回收的垃圾,因此我们最终可能会将它们用作遗传算法的一部分,以加快处理速度。

回答

我正在阅读《遗传程序设计现场指南》(免费PDF下载)。也可以作为平装本获得。它讨论了使用Java编写的称为TinyGP的库的使用。我们可能会从中获得一些收益。我尚未开始进行任何实际编程,但希望将某些概念应用到C#中。

回答

我在C#中维护ECJ的端口。这很棒。

回答

在开发了自己的遗传编程教学方法应用程序之后,我找到了一个完整的遗传编程框架,称为AForge.NET遗传学。它是Aforge.NET库的一部分。它是根据LGPL许可的。