在遗传算法中,执行向量交叉的最佳方法是什么?

我正在使用遗传算法“学习”跳棋/国际跳棋 AI 的最佳参数。这些参数存储在一个 double 类型的向量中。

[x1 x2 x3 x4 x5 x6 x7 x8 x9]

实际上,我使用两种简单的方法进行交叉:单点交叉和双点交叉。不幸的是,在我看来,这些方法还不够好。

例如,如果我有一个基因池,其中包含:

[10 20 1]
[30 10 9]
[100 1 10]

如果 x1 值的理论最优值为 50,我永远无法通过交叉找到它。我唯一的希望是产生一个 x1=50 的突变,该突变足够好,可以在下一代中传递。

那么,有没有更好的方法来对数字数组执行交叉?


回答:

看起来你遇到了编码问题,而不是交叉问题。如果你想要染色体有更多的变异性,那么可以将数据编码为字节序列(甚至比特)。
假设你有 3 个整数参数,那么你可以将它们表示为 3*4=12 字节的向量:

{114,2,0,214, // 第一个 32 位整数
14,184,220,7, // 第二个 32 位整数
145,2,32,12,  // 等等...
}

然后,在交叉之后,你的整数将以很大的变异性进化。你也可以不使用 1/2 点交叉,而是使用 均匀交叉 – 在每个染色体点,你将随机决定使用哪个基因版本。 在这种情况下,你将获得更多的变异性。但请记住,交叉中过多的变异性也是灾难性的,因为它会导致种群永远无法达到最佳解决方案,因为即使是次优解决方案也会被交叉操作中的巨大随机波动撕裂。 稳定 的进化是这里的关键词。

另一种方法是不使用遗传算法,而是使用 进化策略算法,该算法会更改染色体中的所有基因。但这种方法在不同基因版本的数量不是很大的情况下是可行的。因此,这可能不适合你的浮点数/双精度数问题。

希望能帮到你!

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注