一尘不染

编程原理:解决迷宫

algorithm

解决迷宫的可能方法是什么?
我有两个主意,但我认为它们不是很优雅。

基本情况: 我们有一个矩阵,该矩阵中的元素以代表迷宫的方式排序,一种进出一种迷宫。

我的第一个想法是让机器人从迷宫中穿过,直到一侧离开迷宫。我认为这是一个非常缓慢的解决方案。

第二个遍历每个标记为1的连续项目,检查它可以去往的位置(上,右,下,左),选择一种方法,并在该处继续其路径。这甚至比第一个慢。

当然,如果我在两个交叉点使两个机器人成为多线程,速度会更快一些,但这也不是最好的方法。

需要有更好的解决方案来使机器人通过迷宫。

编辑
第一:谢谢你的美好的答案!

我的问题的第二部分是: 如果我们有多维图,该怎么办?是否有特殊的做法,或者贾斯汀·L。的答案是否也可以用于此?
我认为这不是解决此问题的最佳方法。

第三个问题:
哪种迷宫求解器算法最快?(完全假设)


阅读 335

收藏
2020-07-28

共1个答案

一尘不染

您可以将迷宫想象成一棵树。

     一个
    / \
   / \
  公元前
 ///
DEFG
   / \ \
  HIJ
 / \
LM
   / \
  ** O

(可能代表)

        开始
        + + --- + --- +
        | ACG |
    + --- + + + +
    | DB | F | J |
+ --- + --- + + --- + --- +
| LHEI |
+ --- + + --- + --- +
    | MO |
    + + --- +
    完

(忽略树上的左右顺序)

每个节点都是路径的交汇点。D,I,J,L和O是死胡同,**是目标。当然,在您的实际树中,每个节点最多可以拥有 三个 子节点。

现在,您的目标只是找到要遍历的节点以找到终点。任何其他的树搜索算法都可以。

查看树,只需从树的最深处的**中“追溯”即可轻松找到正确的解决方案:

A B E H M **

请注意,当您的迷宫中有“圈”时,这种方法 只会 变得 稍微
复杂一些(即,如果可能的话,没有回溯,您可以重新输入已经遍历的段落)。检查评论,找到一个不错的解决方案。

现在,让我们看看您提到的应用于该树的第一个解决方案。

您的第一个解决方案基本上是“ 深度优先搜索”
,它的确不错。实际上,这是一个很好的递归搜索。基本上,它说:“始终首先使用最右边的方法。如果什么都没有,请回溯到可以直行或左行的位置,然后重复。

深度优先搜索将按以下顺序搜索上述树:

A B D (backtrack) E H L (backtrack) M ** (backtrack) O (backtrack thrice) I
(backtrack thrice) C F (backtrack) G J

请注意,一旦找到**,您就可以停止。

但是,当您实际编写深度优先搜索的代码时,使用 递归编程
可以使一切变得容易得多。即使是迭代方法也可以使用,并且您不必显式编程如何回溯。查看链接的文章以了解实现。

搜索树的另一种方法是“ 广度优先”
解决方案,该解决方案按深度搜索树。它将按以下顺序搜索上面的树:

A (next level) B C (next level) D E F G (next level)
H I J (next level) L M (next level) ** O

请注意,由于迷宫的性质,广度优先的平均节点数量要多得多。广度优先是很容易实现的,它有一个要搜索的路径队列,并且每次迭代都会从队列中弹出一个路径,通过一步一步获取所有可以变成的路径,然后放置这些新路径来“爆炸”在队列末尾。没有明确的“下一级”命令可以编码,而这些命令只是为了帮助理解。

实际上,有很多搜索树的方法。我刚刚提到了两种最简单,最直接的方法。

如果您的迷宫非常非常长且很深,并且有循环和疯狂,并且很复杂,那么我建议您使用 A
*

算法,这是行业标准的寻路算法,将广度优先搜索与启发式技术结合在一起……类似“智能广度优先搜索”。

它基本上是这样的:

  1. 将一条路径放在队列中(您仅一步步进入迷宫的路径)。路径具有“权重”,该权重由其当前长度+到端点的直线距离(可以通过数学计算)得出
  2. 从队列中弹出权重最低的路径。
  3. 一步之后,将路径“分解”为所有路径。(即,如果您的路径为“左右”,则您的分解路径为RLLRR和RLLRL,不包括穿过墙壁的非法路径)
  4. 如果这些路径之一有目标,那就胜利!除此以外:
  5. 计算爆炸路径的权重,并将所有权重放回队列(不包括原始路径)
  6. 按重量对队列进行排序,从最低到最低。然后从步骤2重复

这就是 A ,我特别介绍了它,因为它或多或少是针对寻路的 所有
应用的行业标准寻路算法,包括从地图的一个边缘移动到另一边缘,同时避开越野道路或山脉等。很好,因为它使用了 最短的距离启发式算法 ,这使其具有“智能”。A
用途广泛,因为如果遇到任何问题,如果您有尽可能短的距离启发式算法(我们很容易-直线),则可以应用它。

但是 请注意,A * 不是 您唯一的选择,这非常有价值。

实际上,树遍历算法维基百科类别仅列出了97个!(最好的仍然会在此页面的前面链接)

抱歉,长度= P(我倾向于漫步)

2020-07-28