将交叉和变异应用于图形(遗传算法)

时间:2010-07-01 18:29:38

标签: graph artificial-intelligence genetic-algorithm mutation

我正在使用遗传算法进行游戏,我想在其中进化图形。 当染色体是图形时,您是否知道应用交叉和变异的方法?

或者我错过了图表的编码,让我在位串上应用“常规”交叉和变异?

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

曼努埃尔

5 个答案:

答案 0 :(得分:12)

我喜欢使用肯·斯坦利Sandor's suggestion {/ 3>} NEAT algorithm

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

为了实现这一目标,NEAT使用每个基因附带的historical markings在交叉期间“排列”两个基因组的基因(生物学家称之为synapsis)。例如:

crossover with different topologies in NEAT http://natekohl.net/media/neat-crossover.png

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

总结:基于历史标记排列基因是在没有昂贵的拓扑分析的情况下在两个网络之间进行交叉的原则性方法。

答案 1 :(得分:3)

您也可以尝试Genetic Programming。图表将是最接近树的图表,GP使用树...如果您仍然想要使用GA而不是GP,那么请查看如何在GP上执行交叉,这可能会让您知道如何执行它在您的GA的图表上:

Crossover http://www.geneticprogramming.com/Tutorial/cross1.gif

以下是树(和图)的交叉如何工作:

  1. 您选择2个标本进行交配。
  2. 您从一个父级中选择一个随机节点,并将其与另一个父级中的随机节点交换。
  3. 由此产生的树木是后代。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

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 :(得分:0)

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