目录
矩形地图的数组化
思路
提取实现
实现过程
(1)特征
(2)取点问题
(3)需要确定的变量值
(4)另外的
(5)适用的迷宫类型
寻路算法
数组迷宫的特点
数组迷宫的缺点
算法
数组迷宫的DFS思路算法
思路
DFS算法的劣势
数组迷宫的BFS与泛洪填充思路算法
思路
注意事项
实现过程
数组迷宫的A*算法
与BFS的相关性
思路
可能的迷宫算法
总结
矩形地图的数组化
-
思路
对于某个矩形的迷宫地图,机器的处理首先要进行地图信息的获取和压缩,也就是把地图的特征提取为精简的方便处理的形式。而地图的黑白信息天然的可以作为1和0的信息方便计算机做出判断。
由此可以想到是否可以将地图做成使用1和0表示的形式,并转换后也需要拥有信息点的坐标信息或者坐标位置可以进行映射变换,因此二维数组应该是比较适合的迷宫转换形式。
总结说,利用好迷宫某位置灰度值对应到二维数组的1/0值,创建数组迷宫,从而进行下一步处理。
提取实现
对于一个矩形的迷宫,墙和路的长度都可以以某单位长度进行取值。此单位长度应该与多种需求有关,如迷宫车大小与迷宫道路关系、路口或连续弯路的斜线走法。显而易见的,在此单位长度中其实一个点的值便可以代表出该位置的情况,因此原则上该某单位长度在地图上的取值不应当跨特征。
由此我们有了对实际迷宫进行处理的实现方式。取点操作,以该点的情况代替范围内的相同情况。相邻两点间的距离就是单位长度。
图中示例取点,取出所有的红线交叉点的值以来代表迷宫情况
实现过程
(1)特征
我们选择取该点的灰度值作为特征,黑色为墙白色为路。由此,我们通过灰度的取值和灰度的阈值设置便可以抽象出一张二维数组迷宫,以上地图的处理结果如下:
(2)取点问题
A. 我们将地图进行取点操作时,不难看到因为墙的像素值过窄,取点操作时的微小偏差可能就会导致取点的位置出错。我们不妨对图像进行膨胀操作,通过加大墙的像素宽度,以来抵消取点时的偏差问题。
B. 我们在取点时,点的位置和多少,应该根据迷宫车的大小与迷宫的关系(在一条直线道路里的走法(能多方向移动或只能前后)),迷宫的几方向走法(路口或连续弯路的斜线走法)有关。原则上应该取出最简单的二维数组迷宫以来最好的进行后续操作。
单边点数=迷宫单边长/单路宽*2+1
(3)需要确定的变量值
A. 因为是平分迷宫地图来进行取点,可以借助for循环来取固定像素点位置的灰度值因此需要确定:a. 第一个点的x轴像素位置 b. 第一个点的y轴像素位置 c. 最后一个点的x轴像素位置 d. 最后一个点的y轴像素位置
B. 地图中某些目标点的对应数组迷宫位置。通过特征判断出地图中目标点位置,在取特征点的灰度值时加入判断该点是否位于目标点中,以此来对应出地图到数组的映射位置。a. 目标点的像素特征值
(4)另外的
由于识图时迷宫的边界是固定的值,不妨只取迷宫内部的特征,在生成迷宫的过程中通过循环添加迷宫的边界墙。
(5)适用的迷宫类型
适用于矩形的任何迷宫。二维数组化的迷宫均可实现提取,但要根据寻路任务要求和具体需求来确定取点的规则
寻路算法
数组迷宫的特点
(1)数组迷宫之于寻路相关处理的优势在与可以通过简单的循环、判断等操作确定数组地图的某个点的情况,并可以简单的完成映射转换的过程。
(2)数组迷宫的特征明显,处理时能很简单的识别道路并且做出相应的判断
数组迷宫的缺点
迷宫的情况极度依赖地图的识别准确度,有一个特征位置的识别错误可能就会导致迷宫失效
算法
数组迷宫的DFS思路算法
-
思路
由于走路和身边环境的判断变得简单。只需要控制数列随时记录当前的行进位置,改变走过的道路作为墙,在无路可走时再选择倒退操作便能很简单的实现寻路功能
-
DFS算法的劣势
找到的道路长短,难易度不可控,对道路的探索顺序受制于程序中的转向先后顺序,只能做到找到解,但最优解普通的DFS算法无所实现。
数组迷宫的BFS与泛洪填充思路算法
思路
数组迷宫的便利性使得对迷宫道路的赋值操作变得非常方便,于是我们便可以轻易的在所有的道路(未被赋值)上标记出该点走到终点的所需要步数,从而通过递减数列找到起终点之间的最短路线。
在实际迷宫问题中,从终点开始倒着寻找出口是一种常用的简易的解决迷宫问题的方法,在该方法中也可以使用这种思路。从迷宫的目标点开始,向外对迷宫道路进行递增赋值。以来找到到达该点的正确道路。
注意事项
BFS中,应该判断道路赋值操作到达起点时就停止,进而可保证从起点开始走出的递减数列时唯一的而且是最短的。
还应注意,目标点的值,道路的值,墙的值与道路价值的赋值之间的关系。如目标点为2,道路为0,墙为1,则道路的赋值应该从3开始递增,反向找到入口位置。寻路时从入口开始根据递减找到2就是找到了目标。
实现过程
进行赋值时可以随时在另一数列中追踪被赋值的坐标,以来从此坐标再进行下一步赋值操作,这也得益于数组化迷宫的便利性。
数组迷宫的A*算法
与BFS的相关性
A*算法可以看做BFS的优化版,不再向所有方向进行赋值,而是对最有可能的方向进行赋值操作。进而优化在对迷宫进行赋值时所需要的运算,提升速度
思路
在赋值操作进行后,可以先分析场上所有的赋值位置,他们对于起点的距离(曼哈顿距离、欧氏距离),即可能性。只挑选出场上可能性最大的位置进行赋值操作。而对于:可能性大而无法继续赋值的位置等情况进行标记,不再对该位置再次计算以避免浪费资源。
可能的迷宫算法
洪水填充(未探索)、左手原则(对目标在中心的、有独立墙壁的无效)等
总结
各种算法各有优劣,搜索速度上,走出迷宫的速度上各有不同。同时有些算法可能会对某种含有特殊结构的迷宫失效,在选择算法时应该选择适合该迷宫的算法。