是否有必要在遗传算法中使用二进制编码?

时间:2016-05-11 09:27:38

标签: c++ genetic-algorithm openframeworks voronoi evolutionary-algorithm

我正在做一个探索在建筑中使用遗传算法的项目,我们使用进化方法在3d中创建Voronoi镶嵌。这是使用ofxVoro ++ for openFrameworks(c ++)完成的。

我们的基因组染色体是3D中的点的矢量(列表)。我们已经实现了单点和双点交叉以及一个突变,它以一定的概率随机化这些点。在我看过的大多数例子中,基因组是二元编码的,我认为这会导致突变和交叉行为不同。

所以我的问题是:二进制编码(速度除外)还有其他好处吗?如何在c ++中处理这样的编码/解码?从二进制到3d点的列表。

祝你好运, 佛瑞德

3 个答案:

答案 0 :(得分:0)

您也可以使用实际编码,但在这种情况下,您使用的交叉和变异非常重要。如果你的交叉只是(p1 + p2)/ 2或p1 * a + p2 *(1-a),你就不会得到好的结果。

K.Deb在1995年提出了一个用于实际编码的良好交叉算子。以下是论文:http://www.complex-systems.com/pdf/09-2-2.pdf

答案 1 :(得分:0)

交叉和变异是不同的运营商。 Crossover使用现有的遗传。突变将新的遗传物质引入群体。在不了解有关您的算法的更多信息的情况下,随机化点听起来像突变。突变通常在非常低的百分比时间内进行(可能为1%),其中交叉可能相当高(50%)。

所以对于你的算法,我不会“修改”任何东西进行交叉。相反,对于交叉,我会尝试重新定位材料或者只是从父母那里获取不同部分的分数。

对于突变,向点添加或减少一小部分可能是有意义的,从而修改点(突变)。

如果不了解您的算法和染色体表示,很难提出建议。

答案 2 :(得分:0)

我在物流和财务问题上使用了不同的GA。我经常不使用二进制表示法。 我可以给你的第一个例子是TSP问题:

https://en.wikipedia.org/wiki/Travelling_salesman_problem

这里我使用标准表示:染色体是一个整数数组,每个值代表城市。

因此,它取决于您尝试解决的问题类型,如果您可以找到一种方法来实现没有二进制表示的GA,则不需要任何调整。 此外,我更喜欢自然表示,因为在调试代码时更容易理解,如果您的GA正常工作。