【问题标题】:How to find shortest path between two points in a given output of DFS如何在给定的 DFS 输出中找到两点之间的最短路径
【发布时间】:2017-08-02 18:46:59
【问题描述】:

我有一个项目涉及使用只能在 x,y 坐标上移动的机械手进行绘图。 对于给定的二进制图像,我使用 DFS 来探索它。 DFS 算法返回 DFS 已探索的点数组。该数组是路径。它工作正常。

问题在于该路径中有跳转(DFS 算法返回有跳转的路径)。例如:

00000000000
00001000000
00001000000
01111000000
00001000000
00001000000
00000000000

DFS 返回的路径符合预期,如下所示: (3,1)->(3,2)->(3,3)->(3,4)->(2,4)->(1,4)->(4,4) ->(5,4) 我的意图是不要在这条路径上跳转,所以我想创建一个函数/方法,该路径作为输入(带有跳转的路径,它是 DFS 的输出)并输出另一条路径,该路径由来自一个跳转点到另一个。 对于给定的示例,路径应该是这样的: (3,1)->(3,2)->(3,3)->(3,4)->(2,4)->(1,4)->(2,4) ->(3,4)->(4,4)->(5,4)

有什么好办法吗?

我尝试了一些方法,但是对于一个复杂的图像它有很大的问题(对于只有 2000 个点的 DFS 输出,当我尝试完成丢失的路线时,我得到至少 1000 万个点作为输出路径)。

该算法旨在以这种方式工作: 我遍历路径,当我看到当前点和最后一个点之间有一个跳转点时,我会原路返回,直到找到它。

有什么想法吗? 感谢您的宝贵时间!

稍后编辑:感谢您的宝贵时间!我发现我最好使用 bfs 来找到返回的最短路径,因为我实际上需要它让机器人尽可能少走几步。它效率不高(处理 640x480 二进制图像大约需要 5 秒),但效果很好(最后我得到了 DFS 输出点数的两倍,我认为这是合理的)。

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    如果您决定使用 DFS 来查找路径,那么您的解决方案是最好的,但是正如您所描述的那样,通过机械臂找到绘图点的最短路径的问题是 NP 困难的,因为它是旅行商问题。

    话虽如此,通过搜索绘图仪算法或阅读图论书籍可以找到解决此问题的最快算法。

    这些算法使用与旅行商的解决方案类似的想法,其中使用欧拉游程和匹配来找到最短路径。

    【讨论】:

    • 感谢您的回答!我不想找到机器人应该画的最短路径(这实际上是不可能的)。我只想完成DFS算法输出路径中两个跳转点之间的路径。
    • 那么您的方法没有任何问题,这将为您提供有效的路径。您还可以修改 DFS 算法以返回在回溯期间到达的节点,这样您就不必做这项工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    相关资源
    最近更新 更多