十年网站开发经验+多家企业客户+靠谱的建站团队
量身定制+运营维护+专业推广+无忧售后,网站问题一站解决
Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。
深度优先算法(DFS算法)是什么?
寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径。主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点。如果走到某个节点发现无路可走,那么就会回退到上一个节点,重新选择其他路径。直到找到出口,或者退到起点再也无路可走,游戏结束。当然,深度优先算法,只要查找到一条行得通的路径,就会停止搜索;也就是说只要有路可走,深度优先算法就不会回退到上一步。
下图是使用DFS算法搜寻出来的一条路径:
总结一下:
从起点开始,查询下一步走得通的节点,将这些可能的节点压入堆栈中,已经走过的节点不再尝试。查询完毕之后,从堆栈中取出一个节点,查询该节点周围是否存在走得通的节点。如果不存在可能的节点,就继续从堆栈中取一个节点。重复以上操作,直到当前节点为终点,或者堆栈中再无节点。
定义数据:
定义辅助函数
首先,我们来定义栈这种数据结构,栈是一种后进先出的数据结构。
#find_path.pyfromutilsimportStackdefdfs(initial,_next=successor,_test=test_goal):s:Stack=Stack()marked={initial}s.push(initial)whiles:parent:state=s.pop()if_test(parent):returnparentchildren=_next(parent)forchildinchildren:ifchildnotinmarked:marked.add(child)s.push(child)接下来,我们使用DFS算法寻找迷宫路径,并对搜寻到的迷宫路径进行可视化演示。
首先使用枚举,来表示路径的颜色,EMPTY为正常节点,BLOCKED为障碍节点,START为迷宫入口,END为迷宫出口,PATH为搜寻的路径。
fromenumimportIntEnumclassCell(IntEnum):EMPTY=255BLOCKED=0START=100END=200PATH=150接下来,我们来定义迷宫。首先,我们采用Namedtuple来定义迷宫每个节点的坐标:
classMazeLocation(NamedTuple):row:intcol:int首先为了方便确定节点之间的关系,我们在Maze类中定义了一个内部类_Node,用来记录节点的状态,及节点的父节点。
class_Node:def__init__(self,state,parent):self.state=stateself.parent=parent接着初始化,确定入口与出口的坐标,使用np.random.choice函数随机生成迷宫,并标记入口和出口。
def__init__(self,rows:int=10,cols:int=10,sparse:float=0.2,seed:int=365,start:MazeLocation=MazeLocation(0,0),end:MazeLocation=MazeLocation(9,9),*,grid:Optional[np.array]=None)->None:np.random.seed(seed)self._start:MazeLocation=startself._end:MazeLocation=endself._grid:np.array=np.random.choice([Cell.BLOCKED,Cell.EMPTY],(rows,cols),p=[sparse,1-sparse])self._grid[start]=Cell.STARTself._grid[end]=Cell.END其次是test_goal方法,只要该节点坐标与目标节点相即可。
def_test_goal(self,m1:MazeLocation)->bool:returnm1==self._end再就是successor方法,只要上下左右方向的节点不是障碍节点且在边界之内,就纳入考虑范围,加入列表之中。
List[MazeLocation]:location:List[MazeLocation]=[]row,col=self._grid.shapeifm1.row+1