我可以使用A *计算起点和终点之间的最佳路线。现在,我通过在我的点的所有排列中对A对应用A *来在起点和终点之间包括航点。
示例:
我想从第1点到第4点。此外,我想通过第2点和第3点。
我计算(1,2,3,4)的排列:
1 2 3 4
1 2 4 3
1 3 2 4
1 3 4 2
1 4 2 3
1 4 3 2
2 1 3 4
2 1 4 3
2 3 1 4
2 3 4 1
2 4 1 3
2 4 3 1
3 1 2 4
3 1 4 2
3 2 1 4
3 2 4 1
3 4 1 2
3 4 2 1
4 1 2 3
4 1 3 2
4 2 1 3
4 2 3 1
4 3 1 2
4 3 2 1
然后,对于每个排列,我计算从第一个到第二个的A *路线,然后将它附加到从第二个到第三个,然后是第三个到第四个的路线。
当我为每个排列计算出这个时,我按距离对路线进行排序并返回最短的路径。
显然,当我有6个航路点(8个项目的排列是40320: - )时,这有效但涉及大量计算并完全崩溃。
有更好的方法吗?
答案 0 :(得分:2)
首先,您应该存储所有中间计算。一旦你计算了从1到2的路线,你就不应该再次重新计算它,只需在表格中查找。 其次,如果您的图表是无向的,则从2到1的路径与从1到2的路径具有完全相同的距离,因此您也不应重新计算它。
最后,无论如何,您将拥有一个与您需要传递的点数呈指数关系的算法。这与旅行商问题非常相似,如果包含所有可用积分,这就是这个问题。问题是NP完全的,即它具有复杂性,指向航路点的数量。
因此,如果你必须通过许多要点,指数崩溃是不可避免的。
答案 1 :(得分:1)
如前所述,这个问题是NP完全旅行销售员问题。
有一种比你使用的方法更好的方法。最先进的TSP求解器归于Georgia Tech's Concorde solver。如果您不能简单地使用他们自己的免费程序或使用他们的API,我可以描述他们使用的基本技术。
为了解决TSP,他们从一个叫做Lin-Kernighan启发式的贪婪启发式开始,生成一个上界。然后,他们在TSP的混合整数规划公式上使用分支切割。这意味着它们会编写一系列线性和整数约束,这些约束在解决后会为您提供TSP的最佳路径。它们的内部循环调用线性编程求解器,如Qsopt或Cplex,以获得下限。
正如我所提到的,这是最先进的,所以如果你正在寻找一种比你正在做的更好的解决TSP的方法,那么这是最好的。他们可以在几秒钟内处理超过10,000个城市,尤其是在对称的平面TSP上(我怀疑这是你正在研究的变种)。
如果您最终需要处理的航路点数量很少,例如大约10到15,那么您可以使用minimum spanning tree heuristic进行分支定界搜索。这是许多入门AI课程中的教科书练习。比你更多的航点可能比算法的实际运行时间更长,你将不得不使用协和。