为什么我的遗传算法看似随机行为?

时间:2011-10-17 10:30:14

标签: haskell genetic-algorithm

我正在尝试使用基本遗传算法(Iterated Prisoner's DilemmaStochastic Universal Sampling,Canonical GA)为1-point crossover制定最佳策略。我在Haskell中实现了这个算法,并且最近添加了图表输出。不幸的是,生成的图表不符合此问题的预期模式,因此看起来我有一个错误。

我在这个问题上看到的所有适合度图都是这样的:

My friend's graph, looking normal

其他例子可以在On Evolving Robust Strategies for Iterated Prisoner's Dilemma, P.J. Darwen and X. Yao (1993) p6-7

中看到

但是我的输出看起来像这样:

My graph looking very strange

如果我将突变率设置为1,我得到:

Flipping between two identical values

也许暗示我的选择功能并不像我想象的那么随机,因为图表意味着同质人口。

如果您想检查,我的代码在this git repository

现在提出一个问题:你们有没有人建议我在GA实现中做错了什么来使图表看起来像这样?

e.g。我认为它不太可能是健身功能,因为我使用相同的适应性输出功能,它正在最大化,所以即使健身功能在某种程度上是错误的,它仍然会最大化错误的功能(虽然我确定我可能在这里错了,我对遗传算法很陌生)

我想知道要查看哪些功能的建议,我正试图解决这个问题。

编辑:在我的组合函数中添加了一些调试代码后,它似乎总是被传递给相同的个体(即使将变异设置为1),所以可能选择在某处出错。

编辑:选择出错了,但这并没有造成所有问题,只是人口的同质性。

1 个答案:

答案 0 :(得分:3)

你有一个函数maybeFlip,它会以给定的概率将等位基因改为对面。因此,当突变率为1时,您将继续在两个对立面之间来回翻转所有等位基因。这解释了图表中的锯齿形图案。

此外,swap位于Data.Tuple:)