Java 用遗传算法求解幻方:人口分数收敛快,但永远达不到目标?

Java 用遗传算法求解幻方:人口分数收敛快,但永远达不到目标?,java,genetic-algorithm,magic-square,Java,Genetic Algorithm,Magic Square,想更多地了解GA的愿望再次燃起,我决定从另一个方向开始:选择一个问题并尝试解决它,而不是阅读太多而无所事事 我选择了这个问题。 用于编码我正在使用的染色体,以及以下用于和的方法 我的文章有点奇怪,是根据互联网上的例子改编的 分数是根据行/列/对角线之和与魔法常数之差的平方来计算的 我注意到,它收敛得非常快,一旦达到1..7分(越少越好),就停止改进 我认为这是:它达到了一个局部最优,一个潜在的井,如果你可以这样称呼它,并且不会跳过附近的山,因为突变没有足够的不同? 我试着改变突变率5-80%,

想更多地了解GA的愿望再次燃起,我决定从另一个方向开始:选择一个问题并尝试解决它,而不是阅读太多而无所事事

我选择了这个问题。 用于编码我正在使用的染色体,以及以下用于和的方法

我的文章有点奇怪,是根据互联网上的例子改编的

分数是根据行/列/对角线之和与魔法常数之差的平方来计算的

我注意到,它收敛得非常快,一旦达到1..7分(越少越好),就停止改进

我认为这是:它达到了一个局部最优,一个潜在的井,如果你可以这样称呼它,并且不会跳过附近的山,因为突变没有足够的不同?

我试着改变突变率5-80%,在染色体群体中留下10-20%的精英群体,从16-32条染色体改变群体大小,但没有成功

我做错了什么?我可以使用哪些改进来使总体得分收敛到零

如果需要,我可以发布完整的源代码,如果有人觉得它有用或想玩它

更新:以下是大小为5的立方体的收敛速度,交叉率为60%,变异率为10%:


对于这一点,没有硬性的答案,但我建议将你的精英主义减少到不超过5%,并增加你的人口规模。我不太明白getPermutation()调用是如何选择潜在候选人的,但我也会随着人口规模的增加而增加锦标赛的规模(选择算法中的第8-16行)。如果你陷入局部最优,这意味着要么你的变异函数跳得不够远,要么你的种群没有足够的多样性


希望有帮助,祝你好运

在这种情况下,我使用了亚群体,效果很好。您基本上运行算法n次,并从每次运行中挑选最佳的个体。通过这些,您可以形成一个初始总体(而不是像通常的运行那样随机初始化),然后再次运行ga。最后一次跑步中的起始个体通常在不同的方面都是次优的,因为他们或多或少都有相同的适应度,所以当他们组合在一起时,他们倾向于将彼此从局部极小值中拉出来。在这里,使用精英主义也是一个好主意,这样就不会轻易失去已经进化的个体。

我还使用二进制编码处理幻方问题,遗传算法总是从定义搜索空间返回最佳解。我建议您考虑交叉和突变率以及基因组大小,因为这也会影响解决方案的正确性。保持突变率5%,交叉率80-90%,种群规模200,世代规模500-800。