Java 种群老化-遗传算法

Java 种群老化-遗传算法,java,c++,genetic-algorithm,Java,C++,Genetic Algorithm,我正在构建一个简单的“你好,世界!”遗传算法,用于学习。我的总体是一组随机字符串。通过变异和交叉,字符串进化为“你好,世界!”。出于某种原因,我的人口将坐在一个健身分数,似乎永远不会进化。其他时候,我的群体将达到目标基因“你好,世界”。我使用随机选择和单点交叉。尽管如此,当我使用锦标赛和轮盘赌轮盘选择时也会发生这种情况 问题: 为什么我的种群变得陈旧,即使我通过突变使种群多样化,也没有达到目标基因?这是因为遗传算法的随机性还是我的代码中的错误 例如 人口中的每一条染色体最终都会有“HellV,W

我正在构建一个简单的“你好,世界!”遗传算法,用于学习。我的总体是一组随机字符串。通过变异和交叉,字符串进化为“你好,世界!”。出于某种原因,我的人口将坐在一个健身分数,似乎永远不会进化。其他时候,我的群体将达到目标基因“你好,世界”。我使用随机选择和单点交叉。尽管如此,当我使用锦标赛和轮盘赌轮盘选择时也会发生这种情况

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

例如
人口中的每一条染色体最终都会有“HellV,Wor`dL”基因。即使在10000代之后,基因也是一样的。其他时候,这些基因在33代后到达目标基因“你好,世界!”

  • 注意: 下面的代码在使用Java时可以正常工作。当使用Java时,种群总是达到目标基因。而且,我今天刚开始学习C++,所以很有可能我的代码中有一个我看不到的缺陷。
人口规模:333
精英主义:真的
精英比例:25%
突变概率:20%
交叉概率:95%
选择类型:随机
交叉类型:一点

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


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

<> P>这是因为C++如何复制对象,这解释了为什么这个代码在爪哇工作,而不是C++。 如@molbdnilo所述:

<> P>从java到C++的最常见的问题之一是C++如何在java通过引用的地方复制对象。 为了解决我的问题,我更改了以下方法声明:

1.
int计算能力(染色体)
-->
整数计算能力(染色体常数和染色体)
在这个方法声明中,我告诉编译器我希望通过引用而不是通过值传递染色体,使用&,并使用const使其成为常量。这样做可以防止染色体被复制和改变

2.
无效突变(染色体)
-->
无效突变(染色体和染色体)
在这个方法声明中,我告诉编译器我想通过引用而不是通过值传递染色体,使用&。这样做可以防止染色体被复制。由于前面的方法声明没有指定染色体是通过引用传递的,所以正在制作、修改一个副本,然后在方法到达作用域的末尾后抛出。最终,这些变化从未发生过

3.
std::配对单点交叉(染色体染色体A,染色体染色体B)
-->
标准::配对单点交叉(GACOROMAR const&CHROOMOSOMEA,GACOROMAR const&CHROOMOSOMEB)
在这个方法声明中,我告诉编译器我希望通过引用而不是通过值传递染色体,使用&,并使用const使其成为常量。这样做可以防止染色体被复制和改变


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

这些自由函数是使用全局函数还是它们是类的成员?从java到C++的最常见的问题之一是C++如何在java通过引用的地方复制对象。(想否决向上投票的选民)你能提供一份支持吗?什么是染色体
?stuff是在哪里定义的?@molbdnilo,他们使用的是类的成员。我添加了大部分代码,因为很难确定问题的根源。尽管如此,我还是认为它来自变异或交叉。@Barry,我已经提供了Gachrome的头文件和实现文件。至于一个最小的、完整的、可验证的示例,如果不发布我的大部分代码,这是很难做到的,这正是我现在的问题。如果太多,我道歉。