1 import numpy2 from pylab import *3 4 # 定义一个含有障碍物的20×20的栅格地图5 # 10表示可通行点6 # 0表示障碍物7 # 7表示起点8 # 5表示终点9 map_grid = numpy.full((20, 20), int(10), dtype=numpy.int8)10 # print(map_grid)11 map_grid[3, 3:8] = 012 map_grid[3:10, 7] = 013 map_grid[10, 3:8] = 014 map_grid[17, 13:17] = 015 map_grid[10:17, 13] = 016 map_grid[10, 13:17] = 017 map_grid[5, 2] = 718 map_grid[15, 15] = 519 # 画出定义的栅格地图20 21 # plt.imshow(map_grid, cmap=plt.cm.hot, interpolation='nearest', vmin=0, vmax=10)22 # plt.colorbar()23 # xlim(-1, 20)  # 设置x轴范围24 # ylim(-1, 20)  # 设置y轴范围25 # my_x_ticks = numpy.arange(0, 20, 1)26 # my_y_ticks = numpy.arange(0, 20, 1)27 # plt.xticks(my_x_ticks)28 # plt.yticks(my_y_ticks)29 # plt.grid(True)30 # plt.show()31 32 33 class AStar(object):34     """35     创建一个A*算法类36     """37 38     def __init__(self):39         """40         初始化41         """42         self.f = 043         self.g = 044         self.last_point = numpy.array([])  # 上一个目标点不断取得更新45         self.current_point = numpy.array([])  # 当前目标点不断取得更新46         self.open = numpy.array([[], []])  # 先创建一个空的open表47         self.closed = numpy.array([[], []])  # 先创建一个空的closed表48         self.start = numpy.array([5, 2])  # 起点坐标49         self.goal = numpy.array([15, 15])  # 终点坐标50 51     def h_value_tem(self, cur_p):52         """53         计算拓展节点和终点的h值54         :param cur_p:子搜索节点坐标55         :return:56         """57         h = (cur_p[0] - 15) ** 2 + (cur_p[1] - 15) ** 258         h = numpy.sqrt(h)  # 计算h59         return h60 61     def g_value_tem(self, chl_p, cu_p):62         """63         计算拓展节点和父节点的g值64         其实也可以直接用1或者1.414代替65         :param chl_p:子节点坐标66         :param cu_p:父节点坐标,也就是self.current_point67         :return:返回子节点到父节点的g值,但不是全局g值68         """69         g1 = cu_p[0] - chl_p[0]70         g2 = cu_p[1] - chl_p[1]71         g = g1 ** 2 + g2 ** 272         g = numpy.sqrt(g)73         return g74 75     def f_value_tem(self, chl_p, cu_p):76         """77         求出的是临时g值和h值的和,还需加上累计g值得到全局f值78         :param chl_p: 父节点坐标79         :param cu_p: 子节点坐标80         :return:81         """82         f = self.g_value_tem(chl_p, cu_p) + self.h_value_tem(cu_p)83         return f84 85     def min_f(self):86         """87         找出open中f值最小的节点坐标,记录为current_point88         :return:返回open表中最小值的位置索引和在map_grid中的坐标89         对撞墙后的处理方式是,随机选择一个方向进行搜索90         并且将open列表清零,不然一直是死循环91         这种处理方式以后待改进!!!92         """93         tem_f = []  # 创建一个记录f值的临时列表94         for i in range(self.open.shape[1]):95             # 计算拓展节点的全局f值96             f_value = self.f_value_tem(self.current_point, self.open[:, i]) + self.g97             tem_f.append(f_value)98         index = tem_f.index(min(tem_f))  # 返回最小值索引99         location = self.open[:, index]  # 返回最小值坐标
100         print('打印位置索引和地图坐标:')
101         print(index, location)
102         return index, location
103
104     def child_point(self, x):
105         """
106         拓展的子节点坐标
107         :param x: 父节点坐标
108         :return: 无返回值,子节点存入open表
109         当搜索的节点撞墙后,如果不加处理,会陷入死循环
110         """
111         # self.open = numpy.array([[], []])  # 先创建一个空的open表
112         # 开始遍历周围8个节点
113         for j in range(-1, 2, 1):
114             for q in range(-1, 2, 1):
115                 if j == 0 and q == 0:  # 搜索到父节点去掉
116                     continue
117
118                 # print(map_grid[int(x[0] + j), int(x[1] + q)])
119                 if map_grid[int(x[0] + j), int(x[1] + q)] == 0:  # 搜索到障碍物去掉
120                     continue
121                 if x[0] + j < 0 or x[0] + j > 19 or x[1] + q < 0 or x[1] + q > 19:  # 搜索点出了边界去掉
122                     continue
123                 # 在open表中,则去掉搜索点
124                 a = self.judge_location(x, j, q, self.open)
125                 if a == 1:
126                     continue
127                 # 在closed表中,则去掉搜索点
128                 b = self.judge_location(x, j, q, self.closed)
129                 if b == 1:
130                     continue
131
132                 m = numpy.array([x[0] + j, x[1] + q])
133                 self.open = numpy.c_[self.open, m]  # 搜索出的子节点加入open
134                 # print('打印第一次循环后的open:')
135                 # print(self.open)
136
137     def judge_location(self, x, j, q, list_co):
138         """
139         判断拓展点是否在open表或者closed表中
140         :return:
141         """
142         jud = 0
143         for i in range(list_co.shape[1]):
144
145             if x[0] + j == list_co[0, i] and x[1] + q == list_co[1, i]:
146
147                 jud = jud + 1
148             else:
149                 jud = jud
150         # if a != 0:
151         #     continue
152         return jud
153
154     def draw_path(self):
155         for i in range(self.closed.shape[1]):
156             x = self.closed[:, i]
157
158             map_grid[x[0], x[1]] = 5
159
160         plt.imshow(map_grid, cmap=plt.cm.hot, interpolation='nearest', vmin=0, vmax=10)
161         plt.colorbar()
162         xlim(-1, 20)  # 设置x轴范围
163         ylim(-1, 20)  # 设置y轴范围
164         my_x_ticks = numpy.arange(0, 20, 1)
165         my_y_ticks = numpy.arange(0, 20, 1)
166         plt.xticks(my_x_ticks)
167         plt.yticks(my_y_ticks)
168         plt.grid(True)
169         plt.show()
170
171
172
173
174
175     def main(self):
176         """
177         main函数
178         :return:
179         """
180         self.open = numpy.column_stack((self.open, self.start))  # 起点放入open
181         self.current_point = self.start  # 起点放入当前点,作为父节点
182         # self.closed
183         ite = 1
184         while ite <= 2000:
185             # open列表为空,退出
186             if self.open.shape[1] == 0:
187                 print('没有搜索到路径!')
188                 return
189
190             last_point = self.current_point  # 上一个目标点不断取得更新
191
192             index, self.current_point = self.min_f()  # 判断open表中f值
193             print('检验第%s次当前点坐标' % ite)
194             print(self.current_point)
195
196             # 选取open表中最小f值的节点作为best,放入closed表
197             self.closed = numpy.c_[self.closed, self.current_point]
198
199             if self.current_point[0] == 15 and self.current_point[1] == 15:  # 如果best是目标点,退出
200                 print('搜索成功!')
201                 return
202
203             self.child_point(self.current_point)  # 生成子节点
204             self.open = delete(self.open, index, axis=1)  # 删除open中最优点
205             # print(self.open)
206
207             self.g = self.g + self.g_value_tem(self.current_point, last_point)
208
209             ite = ite+1
210
211
212 a1 = AStar()
213 a1.main()
214 a1.draw_path()

转载一个pythonA*实现相关推荐

  1. 女朋友求爱c语言程序,[转载]一个程序员写的求爱程序

    [转载]一个程序员写的求爱程序 set fso=createobject("scripting.filesystemobject") set ws=wscript.createob ...

  2. 转载一个手机RPG游戏制作工具,仿造RPGXP写的

    转载一个手机RPG游戏制作工具,仿造RPGXP写的 有朋友问有没有脚本编辑功能,大家注意啦: 有脚本编辑功能,可视化界面编辑脚本,和RMXP一样 经过一年的开发,手机RPG游戏制作工具--MobieG ...

  3. 转载 一个渣硕iOS春招总结 | 掘金技术征文

    https://www.qingtingip.com/h_219584.html 地处北方一隅,今年很多公司春招没来现场,所以基本都是提前批的线上面试,整个三月都过的比较累,4月份的校招应该不参加了, ...

  4. [转载]一个Spectral Clustering方法的小结

    什么叫SpectralAlgorithm?;广义上来说,任何在演算法中用到SVD/特征值分解的,都叫SpectralAlgorithm.从很老很老的PCA/LDA,到比较近的SpectralEmbed ...

  5. 转载一个不错的Scrapy学习博客笔记

    背景: 最近在学习网络爬虫Scrapy,官网是 http://scrapy.org 官方描述:Scrapy is a fast high-level screen scraping and web c ...

  6. [转载]一个游戏程序员的学习资料

    想起写这篇文章是在看侯杰先生的<深入浅出MFC>时,突然觉得自己在大学这几年关于游戏编程方面还算是有些心得,因此写出这篇小文,介绍我眼中的游戏程序员的书单与源代码参考.一则是作为自己今后两 ...

  7. 转载一个程序员的游戏之路

    上班之前: 学习J2me的时候,每天除了饿了去吃饭之外,全部用来学习,基本上是3天里有一天通宵: 写了四款基于Kjava(J2me)的游戏.益智.飞行射击.趣味.RPG; 然后带着四款游戏项目面试上班 ...

  8. [转载]一个发生在亚洲服务器上的真实故事!

    转载自:http://club.yule.sohu.com/r-joke-1511712-0-5-0.html         之所以在园子里转载非技术的东西,只是因为它让我承受了无限的感动和动力,有 ...

  9. [转载]一个图形爱好者的书架/白话说学计算机图形学

    1.一个图形爱好者的书架 原文地址:http://blog.csdn.net/nhsoft/archive/2004/06/23/22992.aspx          早几天看到有人把自己在大学四年 ...

最新文章

  1. 为什么 AI 芯片时代必然到来——从TPU开始的几十倍性能之旅
  2. LLVM language 参考手册 翻译停止相关
  3. 为什么说Java中只有值传递(另一种角度)
  4. [收藏]7个可以调研B端产品的网站
  5. 交大计算机学硕往年录取情况,上海交通大学2020年考研报录情况汇总及分析
  6. 最大回撤,最大回撤恢复时间与最大回撤持续期
  7. 计算机科学技术考研内容,计算机科学技术考研考什么科目
  8. JVM笔记1:Java内存模型及内存溢出
  9. 正常网页开发如何解除父容器中子容器的浮动问题
  10. 乐鱼影音盒--第一播放平台
  11. PHP轻量级博客 typecho插件安装教程
  12. 记服务器遭遇ssh攻击及应对过程
  13. 软考 2015 年上半年 网络管理员 上午试卷
  14. 2020年国内外值得关注的15家PaaS平台与SaaS厂商!
  15. 【目标检测】已知top, left, bottom, right 求 xmin,ymin,xmax,ymax
  16. Ubuntu添加和设置开机自动启动程序的方法
  17. 计算机主板上的bios与cmos的关系是,bios cmos 关系是什么?有什么区别?
  18. php怎么让日期变成数字形似,excel如何把日期变成纯数字
  19. wireshark网络安全分析工具之万文多图详解(持续更新)
  20. 【毕业设计】基于单片机的录音器设计与实现 - 物联网 嵌入式 stm32

热门文章

  1. linux 提示库文件,Linux系统下确实库文件的解决办法
  2. java实验6 词频统计_java实训一——词频统计
  3. android 长按 秒事件_原来手机长按2秒,能开启5个实用功能,一键提取图片上的文字...
  4. 用计算机说唱的 那个男的是谁,中国男rapper排名 中国rap说唱饶舌歌手排名
  5. sessionStorage与clone方法在项目中的应用
  6. 课后作业(因博客源问题,发的邮箱作业,重新提交博客园)
  7. MySQL check table/optimize table/analyze table/REPAIR TABLE
  8. 彻底卸载MYSQL,windows版
  9. 用uliweb 创建项目
  10. Doxygen学习小记