Algorithm 通过所有要求的点时到达终点
给定一个宽度为W、高度为H的网格,其中包含5种类型的符号:Algorithm 通过所有要求的点时到达终点,algorithm,Algorithm,给定一个宽度为W、高度为H的网格,其中包含5种类型的符号: 'S' means starting position 'E' means ending position 'C' means checkpoints '.' means open position and player can pass through it '#' means closed block that player cant pass through. 玩家的目标是以最小距离从起点到达终点,但他需要通过网格中的所有检查点
'S' means starting position
'E' means ending position
'C' means checkpoints
'.' means open position and player can pass through it
'#' means closed block that player cant pass through.
玩家的目标是以最小距离从起点到达终点,但他需要通过网格中的所有检查点
我们需要找到这个最小距离
允许玩家使用的一些招式有:
W=5
和H=5
# # # # #
# . C C #
# S # # #
# . . E #
# # # # #
那么这里的答案是9,因为路径是:
(1,2)=>(1,1)=>(2,1)=>(3,1)=>(2,1)=>(1,1,)=>(1,2)=>(1,3)=>(2,3)=>(3,3)
现在W
和H
最多可以达到100个,检查点的最大数量最多可以达到18个
一个基本的方法是在这里使用所有对最短路径。但由于它们可以是10000个节点,所以使用Floyd Warshall或Dijkstra等算法的复杂性将无法达到这一目的
那么,它们是解决这个问题的更好方法吗?在检查点之间查找路径的成本是您最不关心的问题。对于
N
作为检查点的数量,假设您只从每个检查点(以及开始和结束节点)执行BFS,则检查点的数量将增加到O(N*W*H)
。一旦你完成了简单的部分,你仍然需要决定检查点的顺序。正如其他评论者所指出的,这是旅行推销员的问题,你不可能让它变得高效——这是不可避免的O(N!)
。为了进行比较,如果我们放弃常数因子并使用W=H=100,N=18
,则最短路径的成本为180000“时间单位”。。。为检查点寻找最佳顺序的成本为6402373705728000“时间单位”。您可能已经注意到,这是一个更大的数字。使用路径查找算法,如查找两点之间的路径,然后您必须将问题分解为以下几点:-
cost(S,E) = cost(S,C1)+cost(C2,C3)..cost(C3,C4)..cost(Ck,E)
有
k
k个检查点的顺序,因此您的算法将是O(k!*N^2)
,并且没有更好的算法,因为这个问题被简化为TSP 我过去也遇到过类似的问题。我会告诉你我是怎么做的
首先,我用Dijkstra的公式计算从s到C1的距离
然后再次计算从C1到Ck的距离
然后从C2…Ck等等
这将为您提供从每个检查点到所有其他检查点(包括起点和终点)的最短路径
现在在每个检查点(包括开始和目标)之间创建一个邻接矩阵
最后,使用旅行推销员找出通过检查站的最短路线
如果您不知道如何实现TSP,则跳过最后两个步骤,即从邻接矩阵和
使用Bruteforce找出最短路径(需要更多时间,但最终会完成任务)
我希望这会有所帮助您需要最好的解决方案,还是“足够好”?你尝试过贪婪算法吗?@tobias_k什么意义上的最佳解决方案。显然,路径应该是所有可能路径的最小值。什么意义上的贪婪?是的,如果你需要绝对最佳的解决方案,“贪婪”可能是“错的”。这就是我问的原因。此外,为什么要考虑网格中所有10个单元的所有对最短路径?似乎找到所有检查点之间的最短路径就足够了。相关问题:@mbeckish这个问题与最小生成树无关。我认为这并不能回答这个问题。它都在我的评论中讨论过guess@codetest你的问题是“是否有更好的方法”。答案是“没有”。这是标准的TSP,而且它的成本是不可协商的。所以请提供一些伪代码。因为像这样我得不到你想要的say@VikramBhatt为什么A*为什么不像DFS那样?@codetest A*使用启发式算法,这有助于比其他算法更快地获得最短路径,其他算法探索整个网格,而A*只探索有效位置。请检查:-*\u搜索_algorithm@VikramBhatt有没有更好的源代码可以从哪里获得呢?@codetest在谷歌上搜索你语言中的代码,你会得到的,但最好先尝试自己编写代码,你可能会去图书馆。你可以使用动态编程在
O(k^2*2^k)中解决这个问题
噢,为了澄清这一点,从一开始到所有检查站的距离将是最短的