异步旅行推销员

时间:2015-09-05 17:29:03

标签: javascript algorithm optimization mathematical-optimization traveling-salesman

假设我想尽量减少一系列城市之间的距离:

开始游览:S-1-2-3-4-5-E

最佳游览:S-5-1-2-3-4-E

游览必须从S开始,必须以E结束,但可以按任意顺序访问其间的城市。在我的使用案例中,SE之间的城市数量将介于1到35之间。

我目前正在使用的启发式是重复的双选择(以伪javascript显示):

minStopSequence = ['S', 1, 2, 3, 4, 5, 'E'];
changed = true;
while (changed === true) {
  changed = false;
  for (i = 1; i < minStopSequence.length - 2; i++) {
    for (j = i + 1; j < minStopSequence.length - 1; j++) {
      newStopSequence = reverseTheMiddleSection(minStopSequence, i, j);
      newSegmentDur = getDuration(newStopSequence);
      if (newSegmentDur < minSegmentDur) {
        minSegmentDur = newSegmentDur;
        minStopSequence = newStopSequence;
        changed = true;
      }
    }
  }
}

这通常无法找到最佳解决方案(例如,它在上面的示例中找不到最佳导览)。我尝试用一​​个移位来扩充它(对于每个索引,对于每个长度,将该段移动到结尾),但这样做会导致2个问题:

  1. 我重复一些旅游可能性(效率低下)
  2. 我仍然没有达到最佳状态,即使在5个城市的游览规模很小
  3. 我已经看到lin-kernighan-helsgaun算法实现了尺寸的最优性&lt; 50,一个&#39;确切的&#39;变体适用于异步图(http://www.researchgate.net/profile/Daniel_Karapetyan/publication/227414913_Lin-Kernighan_heuristic_adaptations_for_the_generalized_traveling_salesman_problem/links/02e7e527676733456d000000.pdf p.11),但我不确定如何使其适应我的用例。

    如果可以使用这种启发式方法,你能帮我弄清楚如何实现它吗?如果不是,那么对于最小的问题(比如n <15)返回最优结果并且对于较大的问题几乎是最优的,最合适的启发式是什么?

1 个答案:

答案 0 :(得分:2)

能够最佳地解决15个城市问题的最简单算法是指数时动态程序:https://class.coursera.org/algo2-002/lecture/181。以此为起点,您可以将其应用于15个城市的小区进行大型邻域本地搜索。