提问者:小点点

种群老化-遗传算法


我正在构建一个简单的“你好,世界!”用于学习目的的遗传算法。我的种群是一组随机字符串。通过变异和交叉,琴弦演变成“你好,世界!”。出于某种原因,我的人口将处于健康水平,似乎永远不会进化。其他时候,我的人口会达到目标基因,“你好,世界”。我使用随机选择和一点交叉。虽然,这也发生在我使用锦标赛和轮盘赌轮盘选择。

问题:
为什么我的种群变得陈旧,即使我通过突变使种群多样化,也没有达到目标基因?这是因为遗传算法的随机性还是我的代码中的错误?


种群中的每一条染色体最终都将具有HellV,Wor'dL基因。即使经过一万代,基因也是一样的。其他时候,基因到达目标基因“你好,世界!”经过~33代。

  • 注意:下面的代码在使用Java时按预期工作。当使用Java时,种群总是达到目标基因。另外,我今天刚开始学习C,所以很可能我的代码中有一个我没有看到的缺陷

种群规模:333
精英化:真实
精英化百分比:25%
变异概率:20%
交叉概率:95%
选择类型:随机
交叉类型:一点

编辑:我已经从这篇文章中删除了代码,而是添加了一个到我的github的链接,因为它有几百行代码。

遗传算法C


共1个答案

匿名用户

多亏@molbdnilo的评论,我才得以解决我的问题。

事实证明,这是因为C如何复制对象,这解释了为什么这段代码在Java中工作而不是在C中工作。

正如@molbdnilo所说:

从Java迁移到C时最常见的问题之一是C如何在Java传递引用的位置复制对象。

为了解决我的问题,我更改了以下方法声明:

1.int计算能力(染色体)---

2.void突变(gax染色体)---

3.std::对

总之,问题源于染色体传递给突变方法的方式。染色体是通过值传递的,而不是通过引用传递的,这导致染色体被复制,当mutate方法到达作用域的末尾时,更改被抛出。