在迷宫中行走所有可能块的算法

Posted

技术标签:

【中文标题】在迷宫中行走所有可能块的算法【英文标题】:Algorithm of walking all possible blocks in a maze 【发布时间】:2016-01-04 14:21:09 【问题描述】:

我已经阅读了很多关于如何解决迷宫的 Q/As,并且我熟悉在编程中使用递归。我的情况略有不同:

我正在尝试开发一台机器(使用 Java)来解决具有一个入口点的 2D 竞技场,该入口点可以位于地图中的任何位置,而不仅仅是在边缘。目标不是找到出路(没有这样的。入口点是出口)。任务是走遍所有地方并寻找收藏品,避开障碍物。

想象一下它是矿井中的挖掘机。天黑了,你可以看到周围有 2,3,4 块瓷砖,你在这个范围内看到的只是收藏品,因为它们有点闪烁。在挖掘机尝试并无法移动之前,既不能“看到”障碍物,也不能“看到”地图的边缘。这意味着我们不知道地图的完整大小和形状。有时是一系列细长的隧道,有时是一组大房间(30x100 块),或两者的组合。

我尝试了一个简单的迷宫解决方案,在一个半空房间(没有障碍物和收藏品)的类似房间的地图中使用递归。从房间的这一部分开始,挖掘机在这些空旷的街区来回走了几十次,直到它最终发挥出所有可能的方式,最终到达了房间的另一端。

显然我需要一种不同的方法来处理这些地图,而这个简单的迷宫求解器非常适合(嗯,几乎)行走长隧道。

对于那些已经走到这一步的人,这里列出了一些额外的条件和特征:

    虽然大多数收藏品在“挖掘”时会消失并让路,但有些会变成障碍物而无法通过。 地图周围有通往另一张地图的大门。将其想象为电梯和楼层。 有杠杆,可以打开门,收集钥匙,移动石头以打开道路或放置在某些地方以解锁区域等。

嗯,非常棒的案例,当然,我的挖掘机将只做简单的工作(1. 和 2. 易于编码,而 3. 用于 Isaac Asimov)

所以,如果不清楚我到底在问什么,那就是:

无论地图类型如何,如何改进我的算法,以免在一个已经很清楚的区域中走这么多次,并且在寻找收藏品时更“聪明”?

【问题讨论】:

如何进行广度优先搜索,跟踪已经访问过的每个图块,以免再次访问? 是的。我正在考虑它,看看我在实现中缺少什么。 听起来像是图形问题,使用图形库(我会说 boost::graph,但您使用的是 Java...) 我还在做研究,发现了“回跳”这个名字背后的另一种方法。 我想在我最初的评论中补充一点,要回到您的起点,您可能应该从头开始进行另一次搜索。毕竟,在收集所有东西的同时,您到达某个图块的路径可能比从该图块返回的最短路径要长得多。当然,您应该保留有关哪些图块不可通行的信息。 【参考方案1】:

我知道的所有图形搜索算法都假定图形从一开始就已知。如果您想尝试使用类似于图形搜索的东西,您需要为环境(传感器范围之外)建立某种概率模型,然后进行蒙特卡罗模拟:

循环N次并且:

在已知信息的情况下,根据模型随机化环境中未知部分的实例。 在“猜测”环境中使用常用算法解决搜索问题 为“最佳路径”将采取的第一个动作添加投票

得票最多的运动方向获胜。

您必须调整 N 和您为环境建模的方式才能使这种方法发挥作用。无论如何,这是一个非常困难的问题。甚至这种技术也没有考虑每个选择的潜在信息增益(深入展望这种计算,因为状态评估非常昂贵)

【讨论】:

谢谢,@yonil!让我的机器能够学习非常棒。作为开始,我会选择一些简单的东西,比如在一组求解器之间进行选择或/和优先选择“挖掘”的方向 - 您的 投票系统 的简单版本。有了你和@Bart 的指导方针,我接下来几天会很忙。再次感谢!

以上是关于在迷宫中行走所有可能块的算法的主要内容,如果未能解决你的问题,请参考以下文章

DP入门——迷宫行走方案3

DP入门——迷宫行走方案2

超详解的迷宫问题(Java版)

DP入门——迷宫行走方案1

算法:深度优先搜索之迷宫寻径

迷宫问题