Algorithm 通过所有要求的点时到达终点

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. 玩家的目标是以最小距离从起点到达终点,但他需要通过网格中的所有检查点

给定一个宽度为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.
玩家的目标是以最小距离从起点到达终点,但他需要通过网格中的所有检查点

我们需要找到这个最小距离

允许玩家使用的一些招式有:

  • 玩家只能在水平或垂直(上、下、左、右)方向移动一步
  • 不允许对角移动
  • 距离定义为不同块的移动次数
  • 如有必要,玩家可以多次通过开放的街区、检查点、起点和终点
  • 如果不可能从一开始就达到目标,那么我们需要告诉大家这是不可能的
  • 例如:

    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)中解决这个问题
    噢,为了澄清这一点,从一开始到所有检查站的距离将是最短的