这篇文章主要介绍了如何使用python动画演示深度优先算法搜寻逃出迷宫的路径,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。
python主要用来做什么
python主要应用于:1,网络开发;2、数据科学研究;3,网络爬虫;4、嵌入式应用开发,5日游戏开发;6桌面应用开发。
<强>深度优先算法(DFS算法)是什么? 强>
寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径。主要思想的是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点。如果走到某个节点发现无路可走,那么就会回退到上一个节点,重新选择其他路径。直到找到出口,或者退到起点再也无路可走,游戏结束。当然,深度优先算法,只要查找到一条行得通的路径,就会停止搜索,也就是说只要有路可走,深度优先算法就不会回退到上一步。
如果你依然在编程的世界里迷茫,可以加入我们的python学习扣群:784758214,看看前辈们是如何学习的!交流经验!自己是一名高级python开发工程师,从基础的python脚本到Web开发,爬的虫,django,数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的python学习者聚集地
下图是使用DFS算法搜寻出来的一条路径:
总结一下:
从起点开始,查询下一步走得通的节点,将这些可能的节点压入堆栈中,已经走过的节点不再尝试。查询完毕之后,从堆栈中取出一个节点,查询该节点周围是否存在走得通的节点。如果不存在可能的节点,就继续从堆栈中取一个节点。重复以上操作,直到当前节点为终点,或者堆栈中再无节点。
<强>定义数据:强>
- <李>
起始节点与目标节点
李> <李>存储节点的堆栈
李> <李>
<强>定义辅助函数强>
- <李>
获取下一节点的函数:继任者
李> <李>判断是否为终点的函数:test_goal
李>首先,我们来定义栈这种数据结构,栈是一种后进先出的数据结构。
因为之后的广度优先搜索会使用到队列,A *算法会用到优先队列,我们定义了抽象基类,以便后续使用.deque是双端队列,与内置类型列表操作类似,但头部与尾部插入和删除操作的时间复杂度均为O (1)。
#, utils.py 得到abc import  abstractmethod, ABC 得到collections import 双端队列 class 基地(美国广播公司): def 才能__init__(自我): ,,,self._container =,双端队列() @abstractmethod才能 def 才能推动(自我,,值): ,,,“““push item"““ @abstractmethod才能 def 才能;流行(自我): ,,,“““pop item"““ def 才能__len__(自我): ,,,return len (self._container) def 才能__repr__(自我): ,,,return f # 39;{类型(自我).__name__}({列表(self._container)}) & # 39; class 堆栈(基础): def 才能推动(自我,,值): ,,,self._container.append(值) def 才能;流行(自我): ,,,return self._container.pop ()
下面我们来定义dfs函数。其中,初始为初始节点,年代为栈,用标记来记录经过的节点.successor函数用来搜寻下一个可能的节点,test_goal函数用来判断该节点是否为目标节点定格为可能的节点列的表,遍历这些节点,将没有走过的节点压入栈中,并做记录。
#, find_path.py 得到utils import 堆栈 def dfs(初始,_next =,继任者,_test =, test_goal): s:才能,Stack =,堆栈() marked 才能=,{初始} s.push才能(初始) while 才能;年代: ,,,的父母:,state =, s.pop () ,,,if _t(父): ,,,,,return 父母 ,,,children =, _next(父) ,,,for child 孩子们:拷贝 ,,,,,if child not 拷贝标记: ,,,,,,,marked.add(孩子) ,,,,,,,s.push(孩子)
接下来,我们使用DFS算法寻找迷宫路径,并对搜寻到的迷宫路径进行可视化演示。
首先使用枚举,来表示路径的颜色,空为正常节点,阻塞为障碍节点,开始为迷宫入口,一端为迷宫出口,路径为搜寻的路径。