我一直在为 C# 寻找一些好的遗传编程示例。有人知道好的在线/书籍资源吗?想知道是否有用于进化/遗传编程的 C# 库?
12 回答
在开发了自己的遗传编程教学应用程序后,我找到了一个完整的遗传编程框架,称为AForge.NET Genetics。它是Aforge.NET 库的一部分。它在 LGPL 下获得许可。
MSDN 去年有一篇关于基因编程的文章:Genetic Algorithms: Survival of the Fittest with Windows Forms
我建议不要实际生成程序集,除非您绝对需要,特别是如果您刚刚开始实施遗传算法。
当目标语言是函数式和动态类型时,遗传算法最容易实现。这就是为什么大多数遗传算法研究都是用 LISP 编写的。因此,如果您打算在 C# 中实现它,您最好定义自己的迷你“树语言”,让算法生成树,并在运行算法的每次迭代时只解释树.
我在大学时做过一个这样的项目(用 C# 实现遗传算法),这就是我采用的方法。
这样做会给您带来优势,即只有 1 个表示可以使用(AST 表示),该表示最适合执行和遗传算法“复制”步骤。
或者,如果您尝试生成程序集,您可能最终会为应用程序添加大量不必要的复杂性。目前,除非整个应用程序域被销毁,否则 CLR 不允许从应用程序域卸载程序集。这意味着您需要在算法的每次迭代中为每个生成的程序启动一个单独的应用程序域,以避免在您的应用程序中引入巨大的内存泄漏。一般来说,整个事情只会增加一堆额外的刺激。
另一方面,解释的 AST 就像任何其他对象一样是可垃圾收集的,因此您不需要在多个应用程序域中胡闹。如果出于性能原因您想对最终结果进行代码生成,您可以稍后添加对它的支持。但是,我建议您使用DynamicMethod类来执行此操作。它将允许您在运行时动态地将 AST 转换为已编译的委托。这将使您能够部署单个 DLL,同时保持代码生成尽可能简单。此外,DynamicMethod 实例是可垃圾回收的,因此您最终可以将它们用作遗传算法的一部分来加快处理速度。
您也许可以使用 LINQ 表达式树来实现遗传编程——它比随机 IL 生成更有可能生成可用的东西。
我在http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/上看到 Mike Swanson 在 channel9 上对它进行了很好的高级讨论
如果您一般对遗传算法或启发式优化感兴趣,您可能想看看HeuristicLab. 它已经开发了好几年,距离我们发布新版本已有 1.5 年。它是用 C# 4 编程的,并且有一个漂亮的 GUI。已经有许多算法可用,如遗传算法、遗传编程、进化策略、局部搜索、禁忌搜索、粒子群优化、模拟退火等等。还实现了几个问题,如车辆路线问题、旅行推销员、实函数优化、背包、二次分配问题、分类、回归等等。还有教程,我们集成了协议缓冲区,因此您可以与外部程序进行通信以进行解决方案评估。它是在 GPL 下获得许可的。2009年该软件获得了微软奥地利的微软创新奖。
我们还写了一本关于这个主题的书:遗传算法和遗传编程。
您是指实际的遗传编程,而不是一般的遗传算法?
如果是这样,C#/.net 不是最好的语言。例如,LISP 一直是 GP 的中流砥柱。
但是,如果必须,您可能会想要动态生成 CIL / MSIL。您可以使用System.Reflection.Emit来做到这一点,但我推荐Mono.Cecil。它缺乏好的文档(好像反射发射有它们)。但它提供了更好的组装发射和反射。
另一个问题是,在 .net 框架中加载代码并随后将其处理掉并非易事。至少,您不能卸载程序集。您可以卸载应用程序域,但是将代码加载到单独的应用程序域并在外部调用它的整个业务会变得非常混乱。.NET 3.5 的 System.Addin 东西应该使这更容易。
如果您对功能齐全的进化计算框架感兴趣,我已经将 ECJ 分叉到 C# .NET 4.0。该包包括原始 ECJ Java 项目中的所有内容,包括所有工作示例。
我还编写了 500 个单元测试来验证转换的许多方面。但是还需要更多的测试。特别是,分布式计算方面没有经过充分测试。那是因为我计划从 ECJ 对套接字的简单使用转换为使用 WCF 和 WF 的更强大的策略。我还将重新设计框架以利用 TPL(任务并行库)。
无论如何,您可以在此处下载初始转换:
http://branecloud.codeplex.com
我还在将其他几个与“合成智能”研究相关的框架从 Java 转换为 .NET(当我有时间的时候)。
本
Manning 的书:“ .NET 中的元编程”通过表达式树专门介绍了 GP 的大部分内容。
你可以试试GeneticSharp。
它具有所有经典的 GA 操作,如选择、交叉、变异、重新插入和终止。
它非常可扩展,您也可以定义自己的染色体、适应度函数、种群生成策略以及上面所有引用的操作。
它可用于多种应用程序,如 C# 库和 Unity 3D 游戏,在GTK# 应用程序和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();
我在 C# 中维护了一个 ECJ 端口。这很棒。