一、实验目的
1、使学生加深对图搜索技术的理解
2、掌握图搜索基本编程方法
3、运用图搜索技术解决一些应用问题
二、实验要求
1、用启发式搜索算法实现路径规划问题。
2、 有明确的状态空间表达,规则集以及估计函数。
3、 程序运行时,应能清晰直观演示搜索过程。
三、实验内容
机器人路径规划问题:左上角为坐标原点,水平向右为 x 轴方向,竖直向下为y 轴方向。白色为自由栅格,黑色为障碍栅格,机器人只能在自由栅格中运动,并躲避障碍。每个栅格由唯一的坐标(x,y)表示。机器人一般有八个可移动方向。给出由初始位置(3,3)到目标位置(9,9)的最佳路线。
四、实验步骤
1. 状态表示
定义状态图是为(S,F,G),状态S是点的坐标(x,y),初始状态任意给定,F是转换规则,这里使用八个移动方向表示八种规则,G是目标状态,在搜索之前给定。在表示图时,以0表示可以运动,1表示障碍物,2表示起始点,3表示目标点,8表示移动的机器人的路线。
操作规则如下
U: 上方无墙→向上走一步 (x, y-1)
D: 下方无墙→向下走一步 (x, y+1)
L:左方无墙→向左走一步 (x-1, y)
R:右方无墙→向右走一步 (x+1, y)
LU: 左上方无墙→向左上走一步 (x-1, y-1)
LD: 左下方无墙→向左下走一步 (x-1, y+1)
RU: 右上方无墙→向右上走一步 (x+1, y-1)
RD: 右下方无墙→向右下走一步 (x+1, y+1)
2. 启发函数
本实验采用A算法进行最短路径搜索。由于机器人有八个方向可以运动,所以使用当前状态和目标状态的欧拉距离来定义差异函数h(n)
代价函数g(n)使用的是搜索深度,设定起始点的代价为0,每往下拓展一层,代价加1。
启发函数如下
由差异函数h(n)可知,最短路径为初始坐标与目的坐标的直线,但由于在机器人移动过程中存在障碍物,所以只能沿直线和更复杂的曲线以躲避障碍物,所以可以满足
因此满足A算法的条件,一定能够找到最优解。
3. 搜索过程
4. 实验结果
初始地图为
搜索完成后
扩展了六次,扩展过程为(3,3)→(4,4)→(5,5)→(6,6)→(7,7)→(8,8)→(9,9)从图中可以看出,程序找到的是最短路径。
画出搜索图如下
再使用(9,1)→(5,10)进行验证
初始地图如下
搜索后地图如下
经过了九次扩展,扩展过程为(9,1)→(8,2)→(7,3)→(6,4)→(5,5)→(6,5)→(4,6)→(5,7)→(5,8)→(5,9)→(5,10)
5. 分析与讨论
经过实验发现,当h使用欧拉距离时,存在着扩展无法停止,找不到最优路径的情况,考虑原因为1)情况太多,走进了岔路 2)每次h变化太小,不能明显区分每个节点的好坏。根据以上两个原因思考了两个解决方法。
- 当扩展节点在close表中已经出现时,不更新加入open表,而是直接跳过更新该节点。
经过试验后发现该方法是有效的,不再出现死循环的情况。但这种方法的缺点是,有可能不能找到最优解,因为不再更新close表中的节点。本文在上文的实验过程和结果就是采用的这种方法。 - 将h改为使用哈密顿距离
使用哈密顿距离后,也避免了程序进入死循环,原因为哈密顿距离在每走一步后变化很大,节点的启发函数值区分明显。但也需要更多的扩展次数才能找到最短路径。
搜索(3,3)→(9,9)扩展了6次,扩展过程为(3,3)→(4,4)→(5,5)→(6,6)→(7,7)→(8,8)→(9,9),搜索(9,1)→(5,10)扩展了17次,扩展过程为(9,1)→(8,2)→(9,1)→(7,3)→(6,4)→(5,5)→(6,5)→(5,5)→(5,4)→(5,5)→(6,4)→(5,5)→(4,6)→(5,5)→(5,7)→(5,8)→(5,7)→(5,9)→(5,10)。可以看出比使用欧拉距离需要扩展的次数更长,有多次返回的情况,但是能找到最优解,不会陷入死循环。
五、代码
见gitbub 欢迎大家给我star哦!
六、参考文献
【1】 python模拟实现A*寻路算法