我正在构建一个简单的“你好,世界!”用于学习目的的遗传算法。我的种群是一组随机字符串。通过变异和交叉,琴弦演变成“你好,世界!”。出于某种原因,我的人口将处于健康水平,似乎永远不会进化。其他时候,我的人口会达到目标基因,“你好,世界”。我使用随机选择和一点交叉。虽然,这也发生在我使用锦标赛和轮盘赌轮盘选择。
问题:
为什么我的种群变得陈旧,即使我通过突变使种群多样化,也没有达到目标基因?这是因为遗传算法的随机性还是我的代码中的错误?
种群中的每一条染色体最终都将具有HellV,Wor'dL基因。即使经过一万代,基因也是一样的。其他时候,基因到达目标基因“你好,世界!”经过~33代。
种群规模:333
精英化:真实
精英化百分比:25%
变异概率:20%
交叉概率:95%
选择类型:随机
交叉类型:一点
编辑:我已经从这篇文章中删除了代码,而是添加了一个到我的github的链接,因为它有几百行代码。
遗传算法C
多亏@molbdnilo的评论,我才得以解决我的问题。
事实证明,这是因为C如何复制对象,这解释了为什么这段代码在Java中工作而不是在C中工作。
正如@molbdnilo所说:
从Java迁移到C时最常见的问题之一是C如何在Java传递引用的位置复制对象。
为了解决我的问题,我更改了以下方法声明:
1.int计算能力(染色体)代码>---
2.void突变(gax染色体)代码>---
3.std::对
总之,问题源于染色体传递给突变方法的方式。染色体是通过值传递的,而不是通过引用传递的,这导致染色体被复制,当mutate方法到达作用域的末尾时,更改被抛出。