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