C# 中的遗传编程 [关闭]
-
08-06-2019 - |
题
我一直在寻找一些很好的 C# 遗传编程示例。有人知道好的在线/书籍资源吗?想知道是否有用于进化/遗传编程的 C# 库?
解决方案
开发后 我自己的遗传编程教学应用程序, ,我找到了一个完整的遗传编程框架,叫做 AForge.NET 遗传学. 。它是的一部分 Aforge.NET 库. 。它已根据 LGPL 获得许可。
其他提示
MSDN 去年有一篇关于基因编程的文章: 遗传算法:Windows 窗体适者生存
我建议不要实际生成程序集,除非您绝对需要,特别是如果您刚刚开始实施遗传算法。
当目标语言是函数式且动态类型时,遗传算法最容易实现。这就是为什么大多数遗传算法研究都是用 LISP 编写的。因此,如果您打算用 C# 实现它,您最好定义自己的迷你“树语言”,让算法生成树,并在运行算法的每次迭代时解释树。
我在大学的时候做过一个这样的项目(遗传算法的C#实现),这就是我采取的方法。
这样做的好处是,您只需要使用 1 个表示(AST 表示),该表示最适合执行和遗传算法“再现”步骤。
或者,如果您尝试生成程序集,您可能最终会向应用程序添加大量不必要的复杂性。目前,CLR 不允许从应用程序域中卸载程序集,除非整个应用程序域被销毁。这意味着您需要在算法的每次迭代中为每个生成的程序启动一个单独的应用程序域,以避免在应用程序中引入巨大的内存泄漏。一般来说,整件事只会增加一些额外的刺激。
另一方面,解释的 AST 与任何其他对象一样都是可垃圾收集的,因此您无需在多个应用程序域中胡闹。如果出于性能原因您想要代码生成最终结果,您可以稍后添加对此的支持。但是,我建议您使用 动态方法 班级。它将允许您在运行时动态地将 AST 转换为已编译的委托。这将使您能够部署单个 DLL,同时保持代码生成内容尽可能简单。此外,DynamicMethod 实例是垃圾可收集的,因此您最终可以将它们用作遗传算法的一部分来加快速度。
您也许能够使用 LINQ 表达式树来实现遗传编程——它比随机生成 IL 更有可能生成可用的东西。
我在第 9 频道上看到了 Mike Swanson 的精彩高层讨论: http://channel9.msdn.com/posts/Charles/Algorithms-and-Data-Structures-Mike-Swanson-Genetic-Session-Scheduler/
您指的是实际的遗传编程,而不是一般的遗传算法吗?
如果是这样,C#/.net 就不是最好的语言。例如,LISP 一直是 GP 的支柱。
但是,如果必须的话,您可能会想要动态生成 CIL / MSIL。你可以使用以下方法来做到这一点 系统.反射.发射, ,不过我建议 莫诺·塞西尔. 。它缺乏好的文档(就好像反射发射有它们一样)..但它提供了更好的装配发射和反射。
另一个问题是,在 .net 框架中加载代码并随后对其进行处理并不简单。至少,您无法卸载程序集。您可以卸载应用程序域,但是将代码加载到单独的应用程序域并在外部调用它的整个过程可能会变得非常混乱。.NET 3.5 的 System.Addin 内容应该会让这变得更容易。
我有一个免费产品可能会有所帮助。 遗传算法框架.Net 4.0 是一个带有一些支持文章的 .Net 4.0 程序集。
如果您对功能齐全的进化计算框架感兴趣,我已将 ECJ 分叉为 C# .NET 4.0。该包包含原始 ECJ Java 项目中的所有内容,包括所有工作示例。
我还编写了 500 个单元测试来验证转换的许多方面。但还需要进行更多测试。特别是,分布式计算方面尚未经过充分测试。这是因为我计划从 ECJ 对套接字的简单使用转换为使用 WCF 和 WF 的更强大的策略。我还将重新设计框架以利用 TPL(任务并行库)。
无论如何,您可以在这里下载初始转换:
http://branecloud.codeplex.com
我还在将其他几个与“合成智能”研究相关的框架从 Java 转换为 .NET(当我有时间的时候)。
本
你可以试试 遗传锐利.
它具有所有经典的遗传算法操作,如选择、交叉、变异、重新插入和终止。
它具有很强的可扩展性,您也可以定义自己的染色体、适应度函数、种群生成策略以及上面引用的所有操作。
它可以在多种应用程序中使用,例如 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();
曼宁书:”.NET 中的元编程“通过表达式树专门介绍了 GP 的很大一部分。
我用 C# 维护了一个 ECJ 端口。这很棒。