假设我想尽量减少一系列城市之间的距离:
开始游览:S-1-2-3-4-5-E
最佳游览:S-5-1-2-3-4-E
游览必须从S
开始,必须以E
结束,但可以按任意顺序访问其间的城市。在我的使用案例中,S
和E
之间的城市数量将介于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个问题:
我已经看到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)返回最优结果并且对于较大的问题几乎是最优的,最合适的启发式是什么?
答案 0 :(得分:2)
能够最佳地解决15个城市问题的最简单算法是指数时动态程序:https://class.coursera.org/algo2-002/lecture/181。以此为起点,您可以将其应用于15个城市的小区进行大型邻域本地搜索。