有没有人从.Net Genetic Algorithm Framework看到令人信服的结果?
我发现遗传算法框架提供的旅行商问题演示中的随机化很差。以下调用在x 100种子染色体群体中生成相同的基因shuffle顺序:
chromosome.Genes.ShuffleFast();
如果我单步执行代码,基因顺序看起来是随机的,因此我怀疑ShuffleFast()中存在时间/ Rdn()错误,否则我忽略了设置步骤。
我试图通过预先填充染色体基因序列来解决这个问题,这在TSP结果中产生了微小的变化。然而,该运行的控制台日志仍然显示GAF在400个人口世代中仅发现了4个潜在的解决方案。这与GA YouTube视频不一致,这些视频显示遗传算法实现在具有大量抖动的建议解决方案中归巢。我引用这一点作为进一步表明GAF存在随机数生成的系统性内部问题。
遗传算法框架通过作者博客得到了很好的记录,所以我试图保持开放的心态作为原因。
重现步骤=从nuget下载GAF,编译和放大在创建染色体for-loop之后使用断点调试默认项目,检查population.Solutions。 Windows 7,VS2015,.Net 4.5& 4.61。调试或发布。
答案 0 :(得分:2)
查看反汇编程序中的代码,有两个版本的ShuffleFast
被定义为扩展方法:一个将Random
对象作为参数,另一个使用{{3创建一个新对象并使用它。它们在其他方面是相同的,做标准的Fisher-Yates洗牌。
因此,您需要构建自己的Random
,然后将其传递到:
Random r = new Random();
...
chromosome.Genes.ShuffleFast(r);
otherChromosome.Genes.ShuffleFast(r);
...
这样,您只有一个随机数流,并且只要您运行程序,该流就会根据当前时间播种。
答案 1 :(得分:1)
很抱歉对这个问题的回复很晚。问题确实存在于GAF。 Shuffle方法使用System.Random数字生成器,并在每次调用方法时创建一个新的。这会导致播种问题。我已经在GAF修了这个(今晚),这将在下一个版本中。我建议使用以下代码作为解决方法。
var rnd = GAF.Threading.RandomProvider.GetThreadRandom ();
myList.ShuffleFast (rnd);
使用上述代码创建的每个随机数生成器创建一个随机数生成器,每个线程带有一个单一种子。然后可以将其传递给Matthew所描述的Shuffle()方法。