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

Kit*_*itB 15 haskell genetic-algorithm

我正在尝试使用基本遗传算法(随机通用采样,1点交叉,Canonical GA)来演化迭代囚徒困境的最优策略.我在Haskell中实现了这个算法,并且最近添加了图表输出.不幸的是,生成的图表不符合此问题的预期模式,因此看起来我有一个错误.

我在这个问题上看到的所有拟合图都看起来像这样:

我朋友的图表看起来很正常

其他例子可以在关于迭代囚徒困境的演化稳健策略中看到,PJ Darwen和X. Yao(1993)p6-7

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

我的图看起来很奇怪

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

在两个相同的值之间翻转

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

如果您想检查它,我的代码就在这个git存储库中.

现在提出一个问题:你们中的任何人都可以在我的GA实现中提出我可能做错的事情,使图表看起来像这样吗?

例如,我认为它不太可能是适应度函数,因为我使用相同的适应度函数进行输出,它正在最大化,因此即使适应度函数在某种程度上是错误的,它仍然会最大化错误的函数(尽管我是我确定在这里错了,我对遗传算法很陌生)

我想要了解哪些功能的建议,我正试图解决这个问题.

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

编辑:选择出错了,但这并没有引起所有问题,只是人口中的同质性.

ham*_*mar 3

您有一个函数maybeFlip,它将以给定的概率将等位基因更改为相反的等位基因。因此,当突变率为 1 时,您将不断地在两个相反的方向之间来回翻转所有等位基因。这解释了图表中看到的之字形图案。

另外,swapData.Tuple:)