异步旅行推销员子旅行的本地搜索启发式

A local search heuristic for a subtour in an asynchronous 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 个城市的小行程

我已经看到 lin-kernighan-helsgaun 算法实现了小于 50 的优化,并且 'exact' 变体适用于异步图(http://www.researchgate.net/profile/Daniel_Karapetyan/publication/227414913_Lin-Kernighan_heuristic_adaptations_for_the_generalized_traveling_salesman_problem/links/02e7e527676733456d000000.pdf 第 11 页),但我不确定如何使其适应我的用例。

如果可以使用这个启发式方法,你能帮我弄清楚如何实现吗?如果不是,什么是最合适的启发式 returns 最小问题(例如 n < 15)的最佳结果和较大问题的接近最佳结果?

能最优求解15个城市问题的最简单算法是指数时间动态规划:https://class.coursera.org/algo2-002/lecture/181。以此为起点,您可以通过将其应用于 15 个城市的子旅游来进行大社区本地搜索。