65.9K
CodeProject 正在变化。 阅读更多。
Home

更简单的 C# 遗传算法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.58/5 (10投票s)

2005年2月27日

2分钟阅读

viewsIcon

94300

downloadIcon

15665

一个充分利用 C# 2.0 的算法的简单演示

Sample Image - double f3 = (x * x * x + y * y * y + 3 * x * y);

引言

本文处理了对 Barry Lapthorn 的 简单 C# 遗传算法 的增强。它大量使用了“foreach”循环和 .NET2.0 C# 语言改进,因此需要 .NET 2.0 框架或更高版本。

该程序执行与 Barry 的程序相同的功能,并产生相同的结果。

我的修改

  • 使用泛型 List。
    允许使用类型安全的集合。
  • 尽可能使用 'foreach' 语句。
    它自 .NET 1.0 起就存在。
  • 对 'elitism'(遗传编程的概念)使用 'Genome' 对象的深度复制
    在这里,我需要一个 Genome 对象的副本来处理 elitism(遗传编程的一个概念)。我没有在 .NET 2.0 框架中找到任何有用的东西,所以我编写了自己的 Genome.DeepCopy 方法,该方法执行 Genome 对象的完全复制。也就是说,它返回一个新的 Genome 对象,其字段是原始对象的精确复制,但这两个 Genome 对象不共享任何字段或值(从 Genome 的复制不是指向前一个对象的指针)。
  • 使用委托进行排序(不再需要 'GenomeComparer' 类) 
     m_thisGeneration.Sort(delegate(Genome x, Genome y) 
    
         { return Comparer<DOUBLE>.Default.Compare(x.Fitness, y.Fitness); });
    在我看来,这是最有力的增强。在这里,代码使用匿名函数(使用 delegate 关键字)来执行排序。这使得代码更短、更清晰,并避免了使用 GenomeComparer 辅助类。

可以进行的改进

GA 参数的缩放,即允许其他数学函数与 GA(遗传算法)一起工作,而不仅仅是那些值在 0 到 1 之间的函数(双精度浮点精度)。

例如

double f3 = (x * x * x + y * y * y + 3 * x * y); 

我鼓励您访问此链接以访问 Barry Lapthorn 的网站:http://www.lapthorn.net/

我这样做是为了学习 visual c# express 2005。我希望有人能在我工作中找到一些有趣的内容。尽管如此,我并不认为自己是顶级的 OO 程序员 :-)

© . All rights reserved.