遗传算法框架中的随机化不良

cam*_*ase 6 c# genetic-programming genetic-algorithm

有没有人从.Net 遗传算法框架中看到令人信服的结果?

我发现随遗传算法框架提供的旅行商问题演示中的随机化很差.以下调用在x 100种子染色体群体中生成相同的基因shuffle顺序:

chromosome.Genes.ShuffleFast();
Run Code Online (Sandbox Code Playgroud)

如果我单步执行代码,基因顺序看起来是随机的,因此我怀疑在ShuffleFast()中有一个时间/ Rdn()错误,否则我忽略了一个设置步骤.

我试图通过预先填充染色体基因序列来解决这个问题,这在TSP结果中产生了微小的变化.然而,该运行的控制台日志仍然显示GAF在400个人口世代中仅发现了4个潜在的解决方案.这与GA YouTube视频不一致,这些视频显示遗传算法的实现正在寻找具有大量抖动的建议解决方案.我引用这一点作为进一步表明GAF存在随机数生成的系统性内部问题.

遗传算法框架通过作者博客得到很好的记录,所以我试图保持开放的心态作为原因.

重现步骤=从nuget下载GAF,在创建染色体for循环后使用断点编译和调试默认项目,检查population.Solutions.Windows 7,VS2015,.Net 4.5和4.61.调试或发布.

Mat*_*dge 3

查看反汇编器中的代码,有两种版本的ShuffleFast定义为扩展方法:一种将Random对象作为参数,另一种使用默认构造函数创建一个新对象并使用它。它们在其他方面是相同的,执行标准的 Fisher\xe2\x80\x93Yates 洗牌。

\n\n

所以你需要构建自己的Random然后将其传入:

\n\n
Random r = new Random();\n...\nchromosome.Genes.ShuffleFast(r);\notherChromosome.Genes.ShuffleFast(r);\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样,您就只有一个随机数流,并且每当您运行程序时,该流都会根据当前时间进行播种。

\n