C#中的遗传编程

时间:2008-08-17 23:25:46

标签: c# genetic-algorithm genetic-programming evolutionary-algorithm

我一直在为C#寻找一些好的遗传编程实例。谁知道好的在线/图书资源?想知道是否有进化/遗传编程的C#库?

13 个答案:

答案 0 :(得分:28)

在开发my own Genetic Programming didactic application之后,我找到了一个名为AForge.NET Genetics的完整遗传编程框架。它是Aforge.NET library的一部分。它是根据LGPL许可的。

答案 1 :(得分:23)

MSDN去年有一篇关于遗传编程的文章:Genetic Algorithms: Survival of the Fittest with Windows Forms

答案 2 :(得分:13)

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

当目标语言功能和动态输入时,遗传算法最容易实现。这通常是为什么大多数遗传算法研究都是用LISP编写的。因此,如果要在C#中实现它,最好定义自己的迷你“树语言”,让算法生成树,并在运行算法的每次迭代时解释树。 。

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

这样做将为您提供仅具有1个表示(AST表示)的优点,该表示最适合于执行和遗传算法“再现”步骤。

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

另一方面,解释AST与任何其他对象一样都是垃圾收集器,因此您不需要使用多个应用程序域。如果出于性能原因,您希望对最终结果进行代码生成,则可以稍后添加对该结果的支持。但是,我建议您使用DynamicMethod类执行此操作。它允许您在运行时动态地将AST转换为已编译的委托。这将使您能够部署单个DLL,同时保持代码生成的内容尽可能简单。此外,DynamicMethod实例是垃圾收集的,所以你最终可能会将它们作为遗传算法的一部分来加速那里的事情。

答案 3 :(得分:10)

您可能能够使用LINQ表达式树实现遗传编程 - 它更有可能生成比随机IL生成更有用的东西。

答案 4 :(得分:6)

我看到Mike Swanson在http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/

上对频道9进行了很好的高级别讨论

答案 5 :(得分:4)

我有一个可能有用的免费产品。 The Genetic Algorithm Framework .Net 4.0是一个.Net 4.0程序集,包含一些支持文章。

答案 6 :(得分:4)

如果您对遗传算法或启发式优化感兴趣,您可能需要查看HeuristicLab。它发展了几年,自我们发布新版本以来已有1.5年。它在C#4中编程,具有很好的GUI。已有许多算法可用,如遗传算法,遗传编程,进化策略,局部搜索,禁忌搜索,粒子群优化,模拟退火等。还存在一些问题,例如车辆路线问题,旅行推销员,实际功能优化,背包,二次分配问题,分类,回归等等。还有教程,我们集成了协议缓冲区,因此您可以与外部程序进行通信以进行解决方案评估。它是根据GPL许可的。 2009年,该软件获得了微软奥地利微软创新奖。

我们还写了一本关于这个主题的书:Genetic Algorithms and Genetic Programming

答案 7 :(得分:4)

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

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

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

另一个问题是,在.net框架中加载代码并稍后处理它并不是一件容易的事。至少,您无法卸载程序集。您可以卸载appdomains,但是将代码加载到单独的appdomain中并在外部调用它的整个过程可能会非常混乱。 .NET 3.5的System.Addin应该可以让这更容易。

答案 8 :(得分:3)

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

我还编写了500个单元测试来验证转换的许多方面。但是还需要更多的测试。特别是,分布式计算方面没有得到充分测试。那是因为我计划将ECJ简单使用套接字转换为使用WCF和WF的更强大的策略。我还将重新构建框架以利用TPL(任务并行库)。

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

http://branecloud.codeplex.com

我也正在将几个其他框架从Java转换为.NET,与“合成智能”研究相关(当我能找到时间时)。

答案 9 :(得分:3)

您可以尝试GeneticSharp

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

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

它可用于多种应用,例如C#库和Unity 3D游戏,有样本在GTK# appUnity 3D checkers game中运行。

它也适用于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();

答案 10 :(得分:3)

我现在正在阅读A Field Guide to Genetic Programming(免费PDF下载)。它也可以作为平装本。它讨论了用Java编写的一个名为TinyGP的库的使用。你可能会从中获得一些好处。我还没有开始做任何实际的编程,但我希望在C#中应用一些概念。

答案 11 :(得分:2)

Manning书:" Metaprogramming in .NET"通过表达树在GP上投入大量的部分。

答案 12 :(得分:1)

我在C#中维护一个ECJ端口。太棒了。