【问题标题】:applying crossover and mutation to a graph (genetic algorithm)对图应用交叉和变异(遗传算法)
【发布时间】:2011-03-10 18:59:25
【问题描述】:

我正在玩一种遗传算法,我想在其中进化图。 你知道当染色体是图时应用交叉和变异的方法吗?

或者我是否缺少让我在位串上应用“常规”交叉和突变的图形编码?

非常感谢! 感谢任何帮助,即使它与我的问题没有直接关系!

曼努埃尔

【问题讨论】:

    标签: graph artificial-intelligence genetic-algorithm mutation


    【解决方案1】:

    我喜欢 Sandor's suggestion 使用 Ken Stanley 的 NEAT algorithm

    NEAT 旨在发展具有任意拓扑的神经网络,但这些基本上只是有向图。在 NEAT 之前有很多方法可以进化神经网络,但 NEAT 最重要的贡献之一是它提供了一种方法来在具有不同拓扑的两个网络之间执行有意义的交叉

    为了实现这一点,NEAT 使用连接到每个基因的historical markings 在交叉过程中“排列”两个基因组的基因(生物学家称之为synapsis)。例如:


    (来源:natekohl.net

    (在这个例子中,每个基因都是一个盒子,代表两个节点之间的连接。每个基因顶部的数字是该基因的历史标记。)

    总结:根据历史标记排列基因是一种无需昂贵的拓扑分析即可在两个网络之间执行交叉的原则方法。

    【讨论】:

    • NEAT 允许网络中包含循环/重复。在评估过程中如何处理?
    • @iliacholy 通常取决于您要解决的问题。对于控制任务(如极平衡机器人),循环连接可能很有用,因为它们可以提供一种计算值随时间导数的方法。在评估网络时,您可以在每个时间步执行一次值传播,或者继续传播值直到输出稳定......我不确定是否有任何单一的“正确”答案。 :)
    【解决方案2】:

    你不妨试试Genetic Programming。图将是最接近树的东西,而 GP 使用树……如果您仍想使用 GA 而不是 GP,那么看看如何在 GP 上执行交叉,这可能会让您了解如何执行它在您的 GA 图表上:


    (来源:geneticprogramming.com

    以下是树(和图)交叉的工作原理:

    1. 您选择 2 个样本进行交配。
    2. 您从一个父节点中选择一个随机节点并将其与另一个父节点中的随机节点交换。
    3. 生成的树就是后代。

    【讨论】:

      【解决方案3】:

      我不确定使用位串是否是最好的主意,我宁愿至少用真实值表示权重。不过位串也可以工作。

      如果你有一个固定的拓扑,那么交叉和变异都很容易(假设你只进化网络的权重):

      Crossover:从一个父级获取一些权重,其余的从另一个父级获取,如果您将权重表示为数组或列表,则可以很容易地完成。有关更多详细信息或替代方案,请参阅http://en.wikipedia.org/wiki/Crossover_%28genetic_algorithm%29

      变异:只需选择一些权重并稍微调整它们。

      发展其他一些东西(例如激活函数)与这些非常相似。

      如果您还想发展拓扑,那么事情会变得更加有趣。有很多额外的变异可能性,比如添加一个节点(很可能连接到两个已经存在的节点),拆分一个连接(而不是 A->B 有 A->C->B),添加一个连接,或者相反其中。

      但是交叉不会太容易(至少在节点数量不固定的情况下),因为您可能想要找到“匹配”节点(匹配可以是任何东西,但可能与类似的“角色",或网络中的类似位置)。如果您也想这样做,我强烈建议您学习现有的技术。我认识和喜欢的一个叫做 NEAT。您可以在
      http://en.wikipedia.org/wiki/Neuroevolution_of_augmenting_topologies
      http://nn.cs.utexas.edu/?neat
      找到有关它的一些信息 和http://www.cs.ucf.edu/~kstanley/neat.html

      【讨论】:

        【解决方案4】:

        正如其他人所提到的,在 GA 中交叉图(或树)的一种常见方法是交换子图(子树)。对于突变,只需随机更改一些节点(概率很小)。

        或者,如果您将图表示为邻接矩阵,那么您可以交换/改变矩阵中的元素(有点像使用二维位串)。

        【讨论】:

        • 我试图理解:从技术上讲,如何使用邻接矩阵交换子图?
        【解决方案5】:

        好吧,我从来没有玩过这样的实现,但最终对于交叉,您可以选择其中一个图的一个分支并将其与另一个图的一个分支交换。
        对于突变,您可以随机更改图中的一个节点,概率很小。

        【讨论】:

          猜你喜欢
          • 2014-12-21
          • 2012-09-23
          • 2016-09-16
          • 2014-08-12
          • 1970-01-01
          • 2020-10-14
          • 2011-02-22
          • 2016-08-31
          相关资源
          最近更新 更多