遗传编程在C#中

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

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

MSDN去年就有一篇关于遗传编程的文章: 遗传algorithm:适用于Windows Forms的Fittest的生存

我build议不要实际生成组件,除非你绝对需要,特别是如果你刚刚开始实施遗传algorithm。

当目标语言function化和dynamicinput时,遗传algorithm最容易实现。 这就是为什么大多数遗传algorithm研究是在LISP中编写的。 因此,如果你打算用C#实现它,你可能最好定义你自己的迷你“树型语言”,让algorithm生成树,然后在运行algorithm的每一次迭代时解释树。

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

这样做会给你的优势,只有一个代表工作(AST表示),是最适合执行和遗传algorithm“繁殖”的步骤。

或者,如果您尝试生成程序集,则可能最终会为应用程序添加大量不必要的复杂性。 目前,CLR不允许从应用程序域卸载程序集,除非整个应用程序域被销毁。 这意味着您需要在algorithm的每次迭代中为每个生成的程序创build一个单独的应用程序域,以避免在应用程序中引入巨大的内存泄漏。 一般来说,整个事情只会增加一堆额外的刺激。

另一方面,AST的解释就像其他任何对象一样,都是垃圾收集的,所以你不需要在多个应用程序域中闲逛。 如果出于性能方面的原因,您想要编码的最终结果,您可以稍后添加支持。 不过,我build议你使用DynamicMethod类来做到这一点。 它将允许您在运行时dynamic地将AST转换为已编译的委托。 这将使您能够部署一个单一的DLL,同时保持代码生成的东西尽可能简单。 此外,DynamicMethod实例是垃圾收集的,所以你最终可以将它们作为遗传algorithm的一部分,以加快速度。

您可以使用LINQexpression式树来实现遗传程序devise – 更有可能产生比随机IL代更有用的东西。

你的意思是实际的遗传编程,而不是一般的遗传algorithm?

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

但是,如果你必须的话,你可能要dynamic生成CIL / MSIL。 你可以使用System.Reflection.Emit来做到这一点,但是我build议使用Mono.Cecil 。 它缺乏好的文档(就好像reflection散发了它们一样)。但它提供了更好的组装发射和reflection。

另一个问题是在.net框架中加载代码并稍后处理它并不重要。 至less,你不能卸载程序集。 你可以卸载appdomains,但是将代码加载到一个单独的appdomain中,然后在外部调用它的整个过程会变得非常混乱。 .NET 3.5的System.Addin的东西应该更容易。

如果您对遗传algorithm或启发式优化感兴趣,您可能需要查看HeuristicLab 。 它开发了几年,自从我们发布了新版本以来的一年半。 它在C#4中编程,并有一个很好的GUI。 遗传algorithm,遗传编程,进化策略,局部search,禁忌search,粒子群algorithm,模拟退火等等已经有很多algorithm可用。 车辆path问题,旅行商问题,实函数优化问题,背包问题,二次分配问题,分类问题,回归问题等等都存在着一些问题。 还有教程,我们有协议缓冲集成,所以你可以与外部程序进行通信解决scheme评估。 它是根据GPL授权的。 2009年该软件获得了微软奥地利微软创新奖。

我们还写了一本关于这个主题的书: 遗传algorithm和遗传编程 。

我正在阅读“遗传编程领域指南” (免费PDF下载)。 它也可以作为平装书。 它讨论了使用Java编写的名为TinyGP的库。 你可能会得到一些里程。 我还没有开始做任何实际的编程,但希望能够应用C#中的一些概念。

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

我还写了500个unit testing来validation转换的许多方面。 但是还需要更多的testing。 特别是分布式计算方面没有得到充分的testing。 那是因为我打算从ECJ简单地使用套接字转换成使用WCF和WF的更强大的策略。 我也将重新构build利用TPL(任务并行库)的框架。

无论如何,你可以在这里下载最初的转换:

http://branecloud.codeplex.com

我也正在将其他几个从Java到.NET的框架转换成与“综合智能”研究(当我能find时间)有关的过程。

你可以试试GeneticSharp 。

它具有所有经典GA操作,如select,交叉,变异,重新插入和终止。

它是非常可扩展的,你也可以定义你自己的染色体,适应度函数,种群生成策略和所有引用的操作。

它可以用于许多types的应用程序,如C#库和Unity 3D游戏,有样本在GTK#app和Unity 3D跳棋游戏中运行 。

它也适用于Win和OSX。

这里是一个基本的示例如何使用库:

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(); 

我有一个免费的产品,可以帮助。 遗传algorithm框架.Net 4.0是一个带有一些支持性文章的.Net 4.0程序集。

Manning的书“ .NET中的元编程 ”通过expression式树来描述GP的大部分内容。

我用C#维护一个ECJ的端口。 这很棒。