【发布时间】:2011-03-10 18:59:25
【问题描述】:
我正在玩一种遗传算法,我想在其中进化图。 你知道当染色体是图时应用交叉和变异的方法吗?
或者我是否缺少让我在位串上应用“常规”交叉和突变的图形编码?
非常感谢! 感谢任何帮助,即使它与我的问题没有直接关系!
曼努埃尔
【问题讨论】:
标签: graph artificial-intelligence genetic-algorithm mutation
我正在玩一种遗传算法,我想在其中进化图。 你知道当染色体是图时应用交叉和变异的方法吗?
或者我是否缺少让我在位串上应用“常规”交叉和突变的图形编码?
非常感谢! 感谢任何帮助,即使它与我的问题没有直接关系!
曼努埃尔
【问题讨论】:
标签: graph artificial-intelligence genetic-algorithm mutation
我喜欢 Sandor's suggestion 使用 Ken Stanley 的 NEAT algorithm。
NEAT 旨在发展具有任意拓扑的神经网络,但这些基本上只是有向图。在 NEAT 之前有很多方法可以进化神经网络,但 NEAT 最重要的贡献之一是它提供了一种方法来在具有不同拓扑的两个网络之间执行有意义的交叉。
为了实现这一点,NEAT 使用连接到每个基因的historical markings 在交叉过程中“排列”两个基因组的基因(生物学家称之为synapsis)。例如:
(来源:natekohl.net)
(在这个例子中,每个基因都是一个盒子,代表两个节点之间的连接。每个基因顶部的数字是该基因的历史标记。)
总结:根据历史标记排列基因是一种无需昂贵的拓扑分析即可在两个网络之间执行交叉的原则方法。
【讨论】:
你不妨试试Genetic Programming。图将是最接近树的东西,而 GP 使用树……如果您仍想使用 GA 而不是 GP,那么看看如何在 GP 上执行交叉,这可能会让您了解如何执行它在您的 GA 图表上:
以下是树(和图)交叉的工作原理:
【讨论】:
我不确定使用位串是否是最好的主意,我宁愿至少用真实值表示权重。不过位串也可以工作。
如果你有一个固定的拓扑,那么交叉和变异都很容易(假设你只进化网络的权重):
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
【讨论】:
正如其他人所提到的,在 GA 中交叉图(或树)的一种常见方法是交换子图(子树)。对于突变,只需随机更改一些节点(概率很小)。
或者,如果您将图表示为邻接矩阵,那么您可以交换/改变矩阵中的元素(有点像使用二维位串)。
【讨论】:
好吧,我从来没有玩过这样的实现,但最终对于交叉,您可以选择其中一个图的一个分支并将其与另一个图的一个分支交换。
对于突变,您可以随机更改图中的一个节点,概率很小。
【讨论】: