遗传算法 - 路径的交叉和变异算子

时间:2012-10-02 09:42:11

标签: path genetic-algorithm mutation

我想知道是否有人知道图中路径的任何直观的交叉和变异算子?谢谢!

2 个答案:

答案 0 :(得分:6)

问题有点陈旧,但问题似乎没有过时或解决,所以我认为我的研究可能对某人有帮助。

就TSP问题而言,突变和交叉是非常微不足道的,其中每个突变都是有效的(因为染色体代表访问固定节点的顺序 - 交换顺序然后始终可以创建有效结果),如果是最短的路径或最佳路径,其中染色体是精确的路线表示,这不适用并且不是那么明显。这就是我如何处理使用GA解决最优路径的问题。

对于 crossover ,选项很少:

  1. 对于至少一个公共点的路线(除了起点和终点节点) - 在交叉点找到所有公共点和交换子路径

    父母1:51 33 41 7 12 91 60

    家长2:51 9 33 25 12 43 15 60

    潜在交叉点 33 12 。我们可以使用以下子项:51 9 33 41 7 12 43 15 6051 33 25 12 91 60,这是使用这两个交叉点进行交叉的结果。

  2. 当两条路线没有共同点时,从每个父项中随机选择两个点并连接它们(您可以使用随机遍历,回溯或启发式搜索,如A *或光束搜索)。现在可以将此路径视为交叉路径。为了更好地理解,请参见以下两种交叉方法的图片:

      

    http://i.imgur.com/0gDTNAq.png   Img

         

    黑色和灰色路径是父母,粉色和橙色路径   孩子,绿点是交叉的地方,红点开始   和结束节点。第一张图显示了第一种交叉,第二张图是另一种交叉的例子。

  3. 对于变异,也有一些选项。通常,虚拟变异如节点的交换顺序或添加随机节点对于具有平均密度的图实际上是无效的。所以这里有保证有效突变的方法:

    1. 从路径中随机取两个点,并用这两个节点之间的随机路径替换它们。

      染色体:51 33 41 7 12 91 60,随机点: 33 12 ,当时之间的随机/最短路径:33 29 71 12,变异染色体:{{ 1}}

    2. 从路径中查找随机点,删除它并连接其邻居(非常类似于第一个)

    3. 从路径中查找随机点并找到其邻居的随机路径

    4. 尝试从一些随机选择的点遍历路径,直到到达初始路径上的任何点(稍微修改第一个方法)。

        

      http://i.imgur.com/19mWPes.png   enter image description here

           

      每个图形以适当的顺序对应于每种突变方法。在最后一个示例中,橙色路径是替换突变点(绿色节点)之间的原始路径的路径。

    5. 注意:这种方法显然可能有性能上的缺点,当找到替代子路由(使用随机或启发式方法)会卡在某个地方或找到很长且无用的子路径时,所以考虑一下限制突变执行的时间或试验数量。

      对于我的情况,即在最大化顶点权重之和方面找到最佳路径,同时保持节点总和权重小于给定界限,这些方法非常有效并且给出了良好的结果。如果您有任何疑问,请随时提出。另外,对不起我的MS Paint技能;)

      <强>更新

      一个很大的提示:我在实现中基本上使用了这种方法,但使用随机路径生成有一个很大的缺点。我决定使用最短路径遍历随机选择的点切换到半随机路由生成 - 它更有效(但显然可能不适用于所有问题)。

答案 1 :(得分:3)

嗯..这是一个非常困难的问题,人们为此撰写论文,但仍然没有正确的答案。

一般规则是“这一切都取决于您的域名”。

有一些通用的GA库会为您做一些工作,但为了获得最佳效果,建议您自己实施GA操作,特别是针对您的域。

您可能会对Theoretical CS上的答案感到更幸运,但您需要更多地扩展您的问题并添加有关您的任务和域的更多详细信息。

<强>更新 所以你有一个图表。在GA术语中,通过图的路径表示个体,路径中的节点将是染色体。 在那种情况下,我会说突变可以表示为路径偏离原始路径 - 其中一个节点移动到某处,路径被调整,因此路径中的起始值和结束值保持不变。

突变可能导致个人无效。在这种情况下,您需要做出决定:允许无效的决定,并希望它们将汇聚到一些未经探索的解决方案。或者当场杀死他们。当我使用GA时,我确实允许无效的解决方案,添加“不适合”值以及健身。一些研究人员认为这有助于广泛探索解决方案空间。

交叉只能发生在相互交叉的路径上:在交叉点上,与父母交换路径的剩余部分。

请记住,交叉有多种方式:个人可以在多个点交叉或只在一个交叉点。在图表的情况下,您可以有多个交叉点,这自然可以导致多个子图形。

正如我之前所说,没有正确或错误的做法,但只有通过试验才能找到最好的方法。