高效算法,B*寻路算法,python版,思维优化(1)
上一篇文章只发布了很粗糙的代码,属于能跑就行,确实难看懂。
这一篇继续说一下爬墙思维,,B*寻路算法就是贪婪思维 +攀爬思维,
但是比较难判定怎么算爬过的障碍,所以这里改为 贪婪思维 +穿透障碍,(空心障碍的话这不坑爹吗)
最开始研究B*寻路算法时,真是时 不知道怎么取解决爬墙,,,
从格子3 开始分路,开始考虑撞墙,换方向,又得判定是否已经翻过了障碍,起初我觉得可以用距离来判断翻过了障碍,因为对于B*算法来说,情况是这样的。
这里距离=该点到起点的距离+到终点的距离,这里有点像椭圆离的两个固定坐标,就是起点和终点,直接连线那么距离最短,遇到障碍后距离局部变大,爬过障碍后又变小。但是对于上图的包围型障碍来说,通过距离的起伏判定是失效的
也许有其他的解决方法,但是这里我转变的一下,就是如果我穿透障碍,从格子3 到格子4.。
那么就算爬过的障碍,这样就不用取判定怎么算爬过了障碍。只需要关心怎么沿着障碍,走到穿透后的点就行了
接下来就是怎么走了,怎么走好像也有点难。
但是这里我们发现
既然要沿着障碍边缘走,那么我们的就障碍边缘所有可以走的点找出来,那么这这些点连在一起,就是包围了障碍的圈。
判定方法,
1.从o(欧)点开始,遍历周围8个点,。。做完事后加到关闭列表
如果有一个点=0,那么就是该点O就是边缘点,把=0的点加入 障碍包围圈 path里,
如果=1,那么这个点是障碍点,是不是可以加到开启列表,
就看他的邻居有没有=0的点,如果有,说明该点是障碍边缘的点。加到开启列表,如果没有那么这个点是障碍内部的点,不需要探索(这里可以从前后左右四个方向开始,再从其他四个方向遍历)
2 从开启列表取一个点,继续 1 步骤
下面代码 0 代表可以走,1代表障碍
# 通过一个障碍内的点,得到障碍周围一圈的可探索点,,如果是环形空心障碍,这不设坑爹吗,穿透后的目标点都到不了
def obstacle_around_openSet(self, obstacle_point=(2,5)):# 边缘可走点集合path=[]# 开启的表obstacle_openSet = [obstacle_point, ]# 关闭的表obstacle_closeSet = []while obstacle_openSet != []:# 切换到关闭列表 .pop默认删除最后一个(这里后面会有点新发现的)cur = obstacle_openSet.pop()obstacle_closeSet.append(cur)# 对当前格相邻的8格中的每一个neighbors = self.get_neighbors(cur[0], cur[1])for neighbor in neighbors:# =0即边缘可以走的点 看看是否加过了 # 不能往回走 self.closeSet是全局关闭表(走过的表,用来回溯路劲,所以是带坐标的字典)if map_be_search[neighbor[0]][neighbor[1]] == 0 and neighbor not in obstacle_openSet and neighbor not in [p["point"] for p in self.closeSet]:path.append(neighbor)# =1 这是相邻障碍点, 就是障碍内的点 且在边界内 =1的点可能是边界点,所以联合判定if map_be_search[neighbor[0]][neighbor[1]] == 1 and border_x_min < neighbor[0] < border_x_max and border_y_min < neighbor[1] < border_y_max:# 已经在 "关闭列表"(探索过) 中 不做处理if neighbor in obstacle_closeSet:continue# 它不在 开启列表中,这个障碍点可能可以探索,但是如果是内部的点,而障碍不是边缘的点,就不能加到开启列表if neighbor not in obstacle_openSet:# 遍历 该邻居 相邻的8格中的每一个neighbors_list = self.get_neighbors(neighbor[0], neighbor[1])for neighbor_neighbor in neighbors_list:# 如果该邻居周围的格子里有一个 0, 说明它在障碍边缘, 则加入 并且打断if map_be_search[neighbor_neighbor[0]][neighbor_neighbor[1]] == 0 :obstacle_openSet.append(neighbor)break
得到障碍包围圈path 后,我们就沿着path 爬就行了。
1.我们新建一个openSe和 closeSet 开启的表和关闭的表,把格子3放进去,
2.从开放的表 取出格子3 作为当前点(也就是起点,每次从开启表中拿点都是重头再来),并放进关闭的表。
3.遍历一下格子3的8个邻居(这里的话还是优先遍历前后左右的四个点,可以减少遍历次数)
发现只有 *1和1* 两个点#(1个也行,都没有就是说三面都是障碍,要往回走了,那么在在上面计算path时,走过的点(只要是障碍边缘可走的点)也得加入path,不过这也有点坑爹的感觉)#
只有这两个点 在 障碍包围圈path里面,所以选择一个作为下一个点,更新下一个点的信息,另一个点加入开启的表。
4.把下一个点更新为当前点。并加到关闭的表。继续遍历邻居。
这里先向上爬,取出*1格子,把1*放进开启的表,
遍历周围八个点,只有*2(距离*1的距离是1)和*3 (距离*1的距离是1.4)。
但是这里我们需要确定下一个点,也就是*2,根据距离=1可以确定,把*3放进开启的表。所以更新该点为当前点,
继续遍历 *2,发现只有*3就是下一个点,记录一下点信息,把*3更新为当前点(*3马上就进入关闭的表。那么开启表的那个*3,取出来作为起点也没有用了)
继续遍历 *3,发现只有4*就是下一个点,记录一下点信息,把*34更新为当前点............继续就行了,
如果前面没有点可以走了,那么就是往上走是死路,下一个点的信息为空,判定一下,后从开启的表拿点出来作为起点重新走,也就是只有为唯一一个1* 可以作为新的起点。开启的表中其他的都已经走过了。
如果下一个点信息为穿透障碍后的点,说明该路路径可以走,但是我们还需要对另一条路走一遍,看看谁最短
也就是我先把格子3 关闭点,新建两个不同的开启表和关闭表,把*1和1* 分别放到两个不同的开启的表中,也就是只可以计算出两条路径。
这样我们就可以解决绕过障碍的难点了,,只要跑到对面那个点就可以算绕过障碍 了
高效算法,B*寻路算法,python版,思维优化(1)相关推荐
- python算法与程序设计基础第二版-算法与程序设计基础(Python版) - 吴萍
基本信息 书名:21世纪高等学校计算机基础实用规划教材:算法与程序设计基础(Python版) 定价:39.00元 作者:吴萍21世纪高 出版社:清华大学出版社 出版日期:2015_2_1 ISBN:9 ...
- 寻路算法--深度寻路算法
深度寻路算法 深度寻路算法思想 规定试探方向顺序-顺时针(上右下左)和逆时针方向(上左下右) 实时记录每个点 当前试探方向 记录每个点是否走过 如果四个方向都不能走,则需要回退 回退每走一步,栈结构存 ...
- 算法设计与分析(python版)-作业一
参考教材:算法设计与分析(Python版) 作者:王秋芬 1 . 容易 (4分)2 n=O(100n ^2) 错误 2 . 容易 (3分)10=θ(log10) 正确 3 . 容易 ( ...
- 算法设计与分析(python版)-作业三
参考教材:算法设计与分析(Python版) 作者:王秋芬 1 . 普通 (5分)以下问题中,哪些问题的分治算法消耗的时间与输入序列无关.() A. 二分查找 B. 合并排序 C. 快速 ...
- 寻路算法 --- 深度寻路算法
深度寻路:大地图 空旷地形 适用于不一定要找到最佳路径的情况 尽量每个角落都走遍 广度寻路:不需要回退 一定能找到最佳路径 循环多 小地图 #include <iostream> usi ...
- 寻路算法 --- 广度寻路算法
深度寻路:一个个去试,空旷地形 广度寻路:和深度寻路算法思想截然不同,不是一个个去试,而是依次展开:同样是从起点开始,看周围有哪些可以走的,依次去建立一棵树[ 只有四个方向:四叉树 ],总有一个地方, ...
- java 寻路算法_寻路算法-贪婪最佳优先算法
最近开始接触寻路算法,对此不太了解的话建议读者先看这篇文章 <如何快速找到最优路线?深入理解游戏中寻路算法> . 所有寻路算法都需要一种方法以数学的方式估算某个节点是否应该被选择.大多数游 ...
- 算法刷题(蓝)【基础篇+算法篇】【Python版】
[前言] 记录自己在刷蓝桥杯题目的一些做题思路,在构思的过程中,会参考一些大佬的代码( 用到了会提供相应的学习链接). 内容有不恰当之处,请各位大佬们批评指正,我会第一时间进行更改. 语言:pytho ...
- 算法的时间复杂度(python版容易理解)+常用的时间复杂度、python代码--数据结构
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.算法时间 ...
- 啊哈算法-DFS解救小哈python版
DFS 啊哈算法-解救小哈 maze_map = [] n,m = map(int,(input()).split()) maze_map = [input().split() for i in ra ...
最新文章
- 嘿嘿 刚刚进来 记录下
- Nature:根系菌群参与磷胁迫和免疫的平衡
- MySQL server has gone away报错原因分析及解决办法
- 创建委托登录模块(用于JBoss EAP 6.1)
- Oracle优化检查表
- 前端学习(1878)vue之电商管理系统电商系统之左侧菜单布局
- 第十一章 AtomicInteger源码解析
- c语言printf族函数,C语言中的printf族函数深入详解
- SQL Server 当表分区遇上唯一约束(转载)
- Android SDK开发包下载地址
- 对称构型机器人轮直径校准思路
- [2019杭电多校第六场][hdu6638]Snowy Smile(维护区间最大子段和)
- 别被IBM抛出的“认知商业”搞晕 这里为你详解
- Zynq硬件开发之Xilinx官方技术手册解读(一)
- 查看宽带虚拟拨号PPPoE的上网口令密码
- vue+element项目,升级element后带tabs模块的页面。导致页面崩溃白屏问题?
- 十一、看门狗定时器实现1秒定时
- matlab求n阶行列式,发福利了,线性代数n阶行列式计算器!(需要的拿走吧)
- Ubuntu安装DHCP服务
- 如何在Linux系统服务器中重命名目录
热门文章
- 887. 鸡蛋掉落(困难)-动态规划
- Qt图形视图框架:视图增加标尺
- BZOJ4919: [Lydsy1706月赛]大根堆(set启发式合并)
- hive编程指南笔记
- 生成离线报告-java将白色背景透明和裁减掉白色背景部分
- Recorder︱一些图像识别初创公司产品及API搜集ing...
- 银从个人理财在线计算机怎么使用,2017银行从业个人理财计算器使用方法
- JAVA移动垃圾分类车管理平台计算机毕业设计Mybatis+系统+数据库+调试部署
- 比 Elasticsearch 更快, RediSearch + RedisJSON = 王炸~
- 快速上手爬虫,有哪些方便实用的工具和服务?