【问题标题】:Is it necessary with binary encoding in genetic algorithms?遗传算法中的二进制编码是否必要?
【发布时间】:2016-09-06 14:28:35
【问题描述】:

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

我们的基因组染色体是 3D 点的向量(列表)。我们已经实现了单点和两点交叉和突变,它以一定的概率随机化这些点。在我见过的大多数例子中,基因组是二进制编码的,我认为这会导致突变和交叉以不同的方式发挥作用。

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

最好的问候, 弗雷德

【问题讨论】:

  • 考虑到计算机上的所有内容都是二进制编码的,您已经这样做了。将染色体视为由 3d 点组成仅意味着所有操作都会产生位序列,这些位序列是浮点数/定点数的合法表示。
  • 在人工智能方面需要帮助? area51.stackexchange.com/proposals/93481/…
  • 没有。您不必使用二进制编码。使用任何你想要的东西。只需确保您有适当的变异和交叉运算符即可。

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


【解决方案1】:

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

K.Deb 在 1995 年提出了一个很好的实数编码交叉算子。这是论文:http://www.complex-systems.com/pdf/09-2-2.pdf

【讨论】:

    【解决方案2】:

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

    因此,对于您的算法,我不会“修改”任何用于交叉的东西。相反,对于交叉,我会尝试重新定位材料或简单地从父母那里获取不同部分的分数。

    对于突变,在点上添加或减去一个小数可能是有意义的,从而修改点(突变)。

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-08
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 2022-01-25
        • 1970-01-01
        相关资源
        最近更新 更多