C#中的遗传编程

C#中的遗传编程

Genetic Programming in C#

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


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


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


除非您绝对需要,否则我建议不要实际生成程序集,尤其是在您刚刚开始实施遗传算法的情况下。

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

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

以这种方式进行操作将为您提供一个优点,即仅使用一种表示形式(AST表示形式),该表示形式最适合执行和遗传算法"复制"步骤。

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

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


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


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


如果您通常对遗传算法或启发式优化感兴趣,则可能需要看一下HeuristicLab。它已经发布了数年,距离我们发布新版本已有1.5年。它使用C#4编程,并具有良好的GUI。已经有很多算法可用,例如遗传算法,遗传规划,进化策略,局部搜索,禁忌搜索,粒子群优化,模拟退火等等。还有一些实现的问题,例如车辆路线问题,旅行推销员,实函数优化,背包,二次分配问题,分类,回归等等。也有教程,并且我们集成了协议缓冲区,因此您可以与外部程序进行通信以评估解决方案。它是根据GPL授权的。该软件在2009年获得了Microsoft Austria的Microsoft创新奖。

我们还写了一本书,主题是:遗传算法和遗传编程。


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

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

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

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


您可以尝试GeneticSharp。

它具有所有经典的GA操作,例如选择,交叉,突变,重新插入和终止。

这是非常可扩展的,您可以定义自己的染色体,适应度函数,种群生成策略以及上面所有引用的操作。

它可以用于许多类型的应用程序中,例如C#库和Unity 3D游戏,在GTK#应用程序和Unity 3D Checkers游戏中有运行它的示例。

它在Win和OSX中也可以使用。

这是如何使用该库的基本示例:

1
2
3
4
5
6
7
8
9
10
var selection = new EliteSelection();
var crossover = new OrderedCrossover();
var mutation = new ReverseSequenceMutation();
var fitness = new YourFitnessFunction();
var chromosome = new YourChromosome();
var population = new Population (50, 70, chromosome);

var ga = new GeneticAlgorithm(population, fitness, selection, crossover, mutation);

ga.Start();

曼宁的书:"。NET中的元编程"通过表达式树专门介绍了GP的大部分内容。


如果您对功能全面的Evolutionary Computation框架感兴趣,我已将ECJ分支到C#.NET 4.0。该软件包包括原始ECJ Java项目中的所有内容,包括所有工作示例。

我还编写了500个单元测试来验证转换的许多方面。但是还需要更多测试。特别是,分布式计算方面尚未经过全面测试。那是因为我打算从使用ECJ的简单套接字转换为使用WCF和WF的更强大的策略。我还将重做该框架以利用TPL(任务并行库)。

无论如何,您可以在此处下载初始转换:

http://branecloud.codeplex.com

我还在将与"合成智能"研究相关的其他几种框架从Java转换为.NET(在我可以找到时间的时候)。


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


我在C#中维护ECJ的端口。太好了。


推荐阅读