Graph 对图形应用交叉和变异(遗传算法)

Graph 对图形应用交叉和变异(遗传算法),graph,artificial-intelligence,genetic-algorithm,mutation,Graph,Artificial Intelligence,Genetic Algorithm,Mutation,我正在玩一种遗传算法,我想在其中进化出图形。 当染色体是图时,你知道应用交叉和变异的方法吗 或者,我是否缺少一个图形编码,让我在位字符串上应用“常规”交叉和变异 非常感谢! 任何帮助,即使与我的问题没有直接关系,我们都将不胜感激 Manuel嗯,我从未使用过这样的实现,但最终对于crossover,您可以选择其中一个图的一个分支,并将其与另一个图的分支交换。 对于变异,您可以以较小的概率随机更改图中的一个节点。您不妨尝试一下。图形将是最接近树的东西,GP使用树。。。如果您仍然想使用GAs而不是G

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

或者,我是否缺少一个图形编码,让我在位字符串上应用“常规”交叉和变异

非常感谢! 任何帮助,即使与我的问题没有直接关系,我们都将不胜感激


Manuel

嗯,我从未使用过这样的实现,但最终对于crossover,您可以选择其中一个图的一个分支,并将其与另一个图的分支交换。
对于变异,您可以以较小的概率随机更改图中的一个节点。

您不妨尝试一下。图形将是最接近树的东西,GP使用树。。。如果您仍然想使用GAs而不是GPs,那么看看如何在GP上执行交叉,这可能会让您了解如何在GA的图形上执行交叉:


(来源:)

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

  • 选择2个样本进行交配
  • 从一个父节点中拾取一个随机节点,并将其与另一个父节点中的随机节点交换
  • 由此产生的树木就是后代

  • 正如其他人提到的,在遗传算法中交叉图(或树)的一种常见方法是交换子图(子树)。对于变异,只需随机改变一些节点(w/小概率)


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

    我不确定使用位字符串是否是最好的方法,我宁愿至少用实值表示权重。然而,位字符串也可以工作

    如果您有固定的拓扑结构,那么交叉和变异都非常容易(假设您只进化网络的权重):

    交叉:如果将权重表示为数组或列表,则可以很容易地从一个父对象获取一些权重,从另一个父对象获取其余权重。有关更多详细信息或备选方案,请参阅

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

    进化出一些其他东西(例如激活函数)与这些非常相似

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

    但交叉不会太容易(至少在节点数量不固定的情况下),因为您可能希望找到“匹配”节点(匹配可以是任何内容,但可能与类似的“角色”或网络中的类似位置相关)。如果你也想这么做,我强烈建议你学习现有的技术。一个我知道并且喜欢的叫做“整洁”。您可以在


    而且

    我喜欢用肯·斯坦利的

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

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


    (来源:)

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


    总而言之:基于历史标记排列基因是在两个网络之间进行交叉的一种原则性方法,无需昂贵的拓扑分析。

    我试图理解:从技术上讲,如何使用邻接矩阵交换子图?NEAT允许网络中存在循环/重复。在评估过程中你是如何处理的?@依我看,这通常取决于你试图解决的问题。对于控制任务(如极点平衡机器人),循环连接非常有用,因为它们可以提供一种计算值随时间变化的导数的方法。评估网络时,您可以在每个时间步执行值的单个传播,或者继续传播值,直到输出稳定…我不确定是否有任何单一的“正确”答案。:)