迷宫求解算法

有许多不同的迷宫求解算法,即求解迷宫的自动化方法。随机鼠标、摸墙算法、Pledge和Trémaux的算法被设计为由事先不知道迷宫的旅行者在迷宫内使用,而死胡同填充和最短路径算法被设计为由可以一次看到整个迷宫的人或计算机程序使用。

这是一个朴素的方法,可以由一个非常不聪明的机器人或者一只老鼠来实现。它只是简单地沿着当前的通道前进,直到到达一个交叉点,然后随机决定下一个要遵循的方向。尽管这种方法最终总能找到正确的解决方案,但这种算法可能非常慢。

摸墙算法,穿越迷宫最著名的规则,也称为左手规则或右手规则。如果迷宫是简单连接的,也就是说,它的所有壁都连接在一起或者连接到迷宫的外层边界,那么通过保持一只手与迷宫的一个壁接触,求解器保证不会迷路,并且如果有一个出口,将到达另一个出口;否则,该算法在穿过了与相连的墙段相邻的每个走廊至少一次的情况下将返回到入口。

如果迷宫不是简单连接的(即,如果起点或终点位于由通道环包围的结构的中心,或者路径相互在上方和下方交叉,并且解决方案路径的这些部分被通道环包围),摸墙算法这种方法将无法达到目的。

另一个令人担忧的问题是,在迷宫的入口处应该小心地开始沿着墙走。如果迷宫不是简单连接的,你在迷宫内的任意一点开始沿着墙壁行走,你会发现自己被困在一个单独的墙壁上,墙壁环绕着自己,没有入口或出口。如果摸墙算法开始较晚(从迷宫内部而不是从入口开始),应该尝试标记摸墙算法开始的位置。因为沿着墙走总是会把你带回到你开始的地方,如果你第二次遇到你的起点,你可以得出迷宫不是简单地连接在一起的结论,,你应该换一面还没有沿着墙走的另一面墙。参见下面的Pledge算法,作为摸墙算法的替代方法。

如果更高维的通道可以以确定性的方式投射到2D平面上,则可以在3D或更高维的迷宫中进行摸墙算法。例如,如果在3D迷宫中,可以假设“向上”通道指向西北,而“向下”通道指向东南,则可以应用标准摸墙规则。然而,与2D不同的是,这需要知道当前方向,以确定哪个方向是左边第一个还是右边第一个。

Pledge算法,旨在规避障碍,需要一个任意选择的方向作为优先的方向。当遇到障碍物时,一只手(比如右手)保持沿着障碍物的状态,同时转动的角度被计数(顺时针转动是正的,逆时针转动是负的)。当求解器再次面向原始优先方向,并且转弯的角度和为0时,求解器离开障碍物并继续沿其原始方向移动。

只有当“圈数总和”和“当前航向”都为零时,手才会从墙上移开。这允许算法避免形状像大写字母“G”的陷阱。假设算法在第一面墙左转,并沿着墙绕了整整360度。一个只跟踪“当前航向”的算法会进入一个无限循环,因为它会离开最右边的下壁航向左侧,并再次进入左侧的弯曲部分。Pledge算法不会离开最右边的墙,因为“圈数之和”在该点不为零(注意360度不等于0度)。它一直沿着墙走,最后就在字母形状的下面离开朝着左方出去。

这种算法允许一个带指南针的人从任何有限的二维迷宫的任何内部点找到通往外部出口的路,而不管求解器的初始位置。然而,这种算法在做相反的操作时不起作用,即从迷宫外面的入口找到通往迷宫内某个最终目标的路。

从交叉点开始的路径要么未被走过,要么被标记一次,要么被标记两次。该算法根据以下规则工作:

死胡同填充是一种解决迷宫的算法,它填充所有的死胡同,只留下正确的方法未填充。它可以用于在纸上或计算机程序上解决迷宫,但它对一个未知迷宫中的人没有用处,因为这种方法需要同时观察整个迷宫。方法是1)找到迷宫中的所有死胡同,然后2)从每个死胡同“填充”路径,直到遇到第一个交叉点。请注意,一些通道不会成为死胡同通道的一部分,除非先移除其他死胡同。这里可以看到一段死胡同填充的视频:[1][2]。

死胡同填充不能意外地从终点“切断”起点,因为过程的每一步都保持迷宫的拓扑结构。此外,这个过程不会“太快”停止,因为最终结果不能包含任何死胡同。因此,如果在一个完美的迷宫(没有环的迷宫)上进行死胡同填充,那么只有解决方案会保留下来。如果它是在部分辫子型迷宫(有一些环的迷宫)上完成的,那么所有可能的解决方案都会保留下来,但仅此而已。[3]

如果给出迷宫的全知视图,一个简单的递归算法可以告诉人们如何到达终点。该算法将被赋予一个起始的X和Y值。如果X和Y值不在墙上,该方法将调用所有相邻的X和Y值,确保它以前没有使用过这些X和Y值。如果X和Y值是结束位置的值,它会将该方法的所有先前实例保存为正确的路径。下面是一个Java示例代码:

迷宫路由算法使用曼哈顿距离的概念,并且依赖于网格的属性,当从一个位置移动到任意4个相邻位置时,网格的距离精确地增加/减少1。这是伪代码,没有检测不可到达位置的能力。

Pointsrc,dst;//Sourceanddestinationcoordinates//curalsoindicatesthecoordinatesofthecurrentlocationintMD_best=MD(src,dst);//ItstorestheclosestMDweeverhadtodst//AproductivepathistheonethatmakesourMDtodstsmallerwhile(cur!=dst){if(thereexistsaproductivepath){Taketheproductivepath;}else{MD_best=MD(cur,dst);Imaginealinebetweencuranddst;Takethefirstpathintheleft/rightoftheline;//Theleft/rightselectionaffectsthefollowinghandrulewhile(MD(cur,dst)!=MD_best||theredoesnotexistaproductivepath){Followtheright-hand/left-handrule;//Theoppositeoftheselectedsideoftheline}}

当迷宫有多个解时,求解器可能希望找到从开始到结束的最短路径。有几种算法可以找到最短路径,其中大多数来自图论。一种这样的算法通过实现广度优先搜索来找到最短路径,而另一种算法,A*算法,使用启发式技术。广度优先搜索算法使用队列从开始到到达终点以递增的距离顺序访问单元格。每个被访问的单元都需要记录它与起点的距离,或者哪个更靠近开始的相邻单元导致它被添加到队列中。找到终点位置后,沿着单元格的路径向后回到起点,从而得到最短的路径。最简单形式的广度优先搜索有其局限性,比如在加权图中找到最短路径时。

THE END
1.三大迷宫生成算法(Mazegenerationalgorithm)通俗的说,就是从起点开始随机走,走不通了就返回上一步,从下一个能走的地方再开始随机走。一般来说,深度优先法生成的迷宫极度扭曲,有着一条明显的主路。我们使用python语言+matplotlib生成的20*30的迷宫如图所示: 我们参考维基百科,使用python语言,深度优先迷宫算法如下,代码中都已经加了注释,需要注意的是生成迷宫https://blog.csdn.net/juzihongle1/article/details/73135920
2.迷宫生成算法DouO'sBlog我用html5实现一个迷宫生成算法的演示,分别针对DFS,Kruskal,Prim和最后的分治法.可以去玩一下. 抱怨一下javascript,绘画速度还是不够快,对于大一点的迷宫必须用脏矩形重绘,才能保证速度.不够画出来的效果却不咋地. 至于这种迷宫的走法,一个DFS就可以很好地解决了. https://dourok.info/2011/07/14/maze-generation-algorithm/
3.迷宫生成算法迷宫生成算法是创建迷宫的自动方法。 迷宫可以从预先确定的细胞排列(最常见的是矩形网格,但也可能有其他排列)开始生成,细胞之间有壁垒。这种预定的安排可以被看作是一个连接图,边代表可能的墙址,节点代表单元。然后,迷宫生成算法的目的可以被认为是制作一个子图,在https://vibaike.com/163530/
4.三种迷宫生成算法概述属于构造墙壁生成迷宫的算法。 在空白空间随机生成十字墙壁,将空间分割为四个子空间,然后在三面墙上各自选择一个随机点挖洞,保证四个子空间的连通。之后继续对子空间做分割,直至空间不足以继续分割为止。 引用一下别人的总结:这三种算法分别适合不同的迷宫情况,递归回溯适合于那种主线支线明显的游戏(如RPG),而递归分割https://www.jianshu.com/p/f643b0a0b887
5.java迷宫算法的理解(递归分割,递归回溯,深搜,广搜)java本文主要使用的算法(自动生成地图:递归分割法、递归回溯法;寻找路径:深度优先、广度优先算法),非常具有实用价值,需要的朋友可以参考下+ 目录 最近这学期做了一个java迷宫的课程设计,这里代码及其算法逻辑就分享出来。 首先简单的说一下其中我使用的算法(自动生成地图:递归分割法、递归回溯法;寻找路径:深度优先、广度https://www.jb51.net/article/214795.htm
6.A*算法求解迷宫寻路问题(启发式算法)51CTO博客在一个n×m的迷宫里,入口坐标和出口坐标分别为(startx,starty)和(endx,eny),每一个坐标点有两种可能:0或1,其中0表示该位置允许通过,1表示该位置不允许通过。以寻路问题为例实现A*算法的求解程序,设计两种不同的估价函数。 设置相关数据 设置两种地图 https://blog.51cto.com/lazyn/6290747
7.随机迷宫生成算法浅析软件开发资料库本文对随机迷宫生成进行了初步的研究和分析,并给出了两种不同的生成算法。最终的算法结合了图的深度优先遍历。通过对比两种算法之间,可发现,在实际问题中,结合了离散数学的方法往往非更有效率且效果更佳。 关键词:随机地图生成(random maze generating)、深度优先遍历(depth-first search) https://www.iteye.com/blog/xiaoruanjian-879887
8.手撕算法opencv实现走迷宫算法本文利用opencv实现了深度优先搜索DFS和广度优先搜索BFS两个算法来走迷宫,迷宫也是用opencv+鼠标画的。 1,绘制迷宫 首先是绘制一个迷宫了,直接网上找一个迷宫图然后opencv二值化处理一下也可以。 我是利用鼠标回调函数自己画的,更简洁明了一些。在画迷宫时,我们鼠标点击左键,则在点击位置放置一块墙(白色),点击右键https://zhuanlan.zhihu.com/p/349259822
9.迷宫问题的回溯算法迷宫问题是一种常见的求解路径问题,其中给定一个迷宫地图和起点、终点,要求找出从起点到终点的一条可行路径。回溯算法是迷宫问题的一种解决方法,这里给出一种 Python 语言的实现。 代码如下: # 定义迷宫地图 maze = [[0, 1, 0, 0, 0], [0, 1, 0, 1, 0], https://www.volcengine.com/theme/6657427-M-7-1
10.迷宫生成与解算算法硬声是电子发烧友旗下广受电子工程师喜爱的短视频平台,推荐 迷宫生成与解算算法 视频给您,在硬声你可以学习知识技能、随时展示自己的作品和产品、分享自己的经验或方案、与同行畅快交流,无论你是学生、工程师、原厂、方案商、代理商、终端商上硬声APP就够了!https://www.elecfans.com/v/9111
11.数据网渗透攻击中的拓展的迷宫路径算法AET摘要:为了解决传统网络渗透方法在异构网络上适应性较差的问题,采用计算机算法与设计中的迷宫路径算法、图论中的相关理论,将传统的迷宫路径算法进行了拓展。在此基础上,利用拓展的迷宫路径算法对网络渗透进行了全新探索,提高了异构网络下的网络渗透适应能力与速度,为开展有目标性的网络攻击打下了坚实的基础。利用上述研究确http://m.chinaaet.com/article/209940
12.迷宫问题A*算法求最短路径迷宫问题-A*算法求最短路径 A*算法求解最短路径 -个人觉得是BFS的优化版本,在效率和空间上要比BFS高效很多,尤其是点很多的时候 参考链接https://blog.csdn.net/qq_36946274/article/details/81982691 求解主要公式 F=G+H 其中,F:为当前点总的移动耗费;https://blog.nowcoder.net/n/8007c948d8ec40169cc6187f5e6690c7
13.迷宫寻路系列常用算法逻辑探究同样的场景,如果迷宫很大,那使用BFS的话,效果就不是很高。那是否存在更高效的算法呢? 有两种成熟而常规的实现思路: A*算法和双向宽度优先搜索。 1)A*算法: 该算法引入启发式评估函数,用以加速最短路径求解过程。 核心概念: 历史代价g(n): 从初始节点到n节点的实际代价,代表过去和现在 https://www.gameres.com/487228.html
14.迷宫问题算法其中一个有意思的问题就是迷宫问题,也就是如何从一个迷宫的入口走到出口。本文将向大家介绍迷宫问题的算法及其实现。 一、迷宫问题的形式化定义 一个迷宫可以被看做是一个有向图,其中每个节点表示一个房间,边表示房间之间的通路。我们假设每个房间有四个方向,上下左右,故有向图的每个节点最多有四个邻居节点。 https://wenku.baidu.com/view/2eb90658084c2e3f5727a5e9856a561253d32144.html
15.算法:堆栈与深度优先搜索(迷宫问题)腾讯云开发者社区算法:堆栈与深度优先搜索(迷宫问题) 堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素。 现在我们用堆栈解决一个有意思的问题,定义一个二维数组:https://cloud.tencent.com/developer/article/1012328