【问题标题】:Applying mutation in a GA to solve the Traveling Salesman在遗传算法中应用变异来解决旅行商问题
【发布时间】:2012-09-26 13:18:22
【问题描述】:

我正在从事一项小型学术任务,以使用遗传算法 (GA) 解决旅行商问题 (TSP)。我正在遵循一个非常简单的经典表示,将城市和旅游存储在数组中,例如 10 个城市的旅游可以表示为 9-1-0-4-3-8-6-5-2-7 等等。 对 GA 有相当基本的了解,我对您将遵循哪种方法将不同类型的突变应用于 TSP 有点困惑。假设我们的路由表示为路由,变异率用变量m_rate表示。

[1] 简单插入突变

假设我们有:1-2-3-4-5-6-7-8-9。然后我们随机选择一个城市,比如索引 5,然后随机选择一个插入索引,比如 2,那么变异的染色体是:1-2-6-3-4-5-7-8-9。

现在这是我正在做的应用突变:

for (int i=0; i<route.length; i++) {
 if (m_rate<Math.random()) {
 // Pick a random city
 int randomCity =  0 + (int)(Math.random() * ( ((route.length-1) - 0) + 1));
 // Do the insertion and shift the array where appropriate
 }
}

换句话说,我正在遍历路线中的每个城市,并查看突变条件是否成立 (m_rate>Math.random()),如果成立,那么我会停在该索引处,然后随机选择一个插入点,而不变异概率变量的使用。 只要没有遇到数组的末尾,我就会继续将相同的东西应用于其他所有剩余的城市或索引。 这是正确的方法吗?应用第一个突变后,我应该停止还是跳出循环?突变概率是否应该以某种方式参与选择插入点?虽然这对我来说似乎没有多大意义。 如果染色体或路线中有不止一个城市发生突变,那么染色体是否有可能发生突变?换句话说,如果我最终进行第二次或第三次突变,将染色体反转为其初始形式(突变前)会发生什么?

[2] 相互交换突变。

在染色体中选择一个随机城市,然后选择第二个随机城市并交换两者。例如,在路线 1-5-2-8-0-9-3-7-4-6 中。如果我们最终选择索引 2 和索引 7,那么变异的染色体是:1-5-7-8-0-9-3-2-4-6。

我正在遵循与上述插入突变类似的方法,遍历路线中的每个城市并检查概率条件,然后直接选择一个随机城市进行交换,而不应用任何类型的突变率。上面同样的问题在这里也适用..

[3] 反转突变。

这是最棘手的一个。给定一个像这样的染色体:1-2-3-4-5-6-7-8-9,我们选择一个像索引 2 到索引 5 的突变切割,然后反转那个子路径 ==> 1-2-6-5- 4-3-7-8-9。

但是你如何应用它呢?你是不是循环遍历路线,然后根据突变率选择一个城市,然后直接选择另一个指标来确定子路线的长度?突变一次并退出?在这种实现中,如果我们的突变切割最终为 0-9 或 0-(length-1) ,整个染色体或路线是否可以突变以反转整个事物?在这种情况下,突变率的真正价值是什么?我有点迷路了……

我提前道歉,因为这太长了.. 但我会感谢任何关于这些问题的 cmets,或者如果有人可以指导我访问详细讨论这些事情的任何资源。我看过很多研究论文,但没有多少人接触过这类细节。

谢谢。

【问题讨论】:

    标签: implementation genetic-algorithm traveling-salesman mutation


    【解决方案1】:

    当您选择突变时,您有几个选项:

    • 您可以允许突变产生无效/非法的染色体并对其进行差评。这意味着 GA 将同时搜索正确性(清除非法结果)和最佳结果。
    • 您可以编写一个仅产生有效/合法输出的变异函数。

    第一个选项可以让您编写更简单、更自然的染色体突变。但是,您可能需要扩展表示(例如,允许 12 或 15 个插槽用于 10 个城市的游览),并且算法将需要更长的时间才能收敛。如果必须评估正确性,您的评分函数可能会更昂贵。您可以灵活地解释染色体的解释方式(例如,忽略第二次出现的目的地)。

    出于同样的原因,第一个选项也可以简化您的交叉实现。

    第二个选项通常收敛速度更快,但可能更难避免影响结果的变异函数中的细微偏差。

    您建议的表示和突变类似于 TSP 的非 GA 近似值,它依赖于交换,然后进行改进测试。模拟退火是决定接受哪些转置的一种方法。

    GA 实现可能需要完全不同类型的染色体才能使交叉和突变自然。

    【讨论】:

    • 嗨,本,感谢您的评论。老实说,我不确定您所说的非 GA 近似是什么意思,我发现这种表示即使在使用 GA 的研究人员中也被广泛使用,主要是因为它的简单性。我考虑过使用 2D 矩阵表示,但这不允许在交叉和变异方面有任何形式的灵活性,而且实现起来有点复杂。至于突变和交叉,我绝对遵循您指出的第二个选项,不使用惩罚函数并确保每个生成的染色体都是合法或有效的。
    【解决方案2】:

    我认为最好的选择是对突变使用反转,对交叉使用 OX(有序)。我写了一个 GA 来解决 TSP,它工作得很好。在我的情况下,当应用反转时,我选择两个随机点(它可能是整个字符串)但不是相同的点。最好的结果是突变率为 0.2/0.3,交叉率为 0.8,但这取决于您的选择机制.

    【讨论】:

      【解决方案3】:

      反演通常是解决 TSP 的最佳工作变异算子。您可以下载并试用HeuristicLab,其中包括更多这样的变异算子和交叉。它允许您定义实验,您可以在其中与每个操作员一起运行 GA 几次,看看哪个效果最好。有一些视频教程可以帮助您入门。它是开源的,因此您还可以查看实现。

      【讨论】:

      • 谢谢,我会调查的。
      猜你喜欢
      • 2011-02-02
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多