简单易懂的深度优先搜索算法(DFS)

本文介绍了深度优先搜索(DFS)的基本概念、算法思想,通过杭电HDU-1010题目的解题过程展示了DFS在解决迷宫问题上的应用,并讨论了减枝在DFS中的重要性,提供了无减枝和减枝的DFS代码示例。
摘要由CSDN通过智能技术生成

在我们遇到的一些问题当中,有些问题我们不能够确切的找出数学模型,即找不出一种直接求解的方法,解决这一类问题,我们一般采用搜索的方法解决。搜索就是用问题的所有可能去试探,按照一定的顺序、规则,不断去试探,直到找到问题的解,试完了也没有找到解,那就是无解,试探时一定要试探完所有的情况(实际上就是穷举)。

对于问题的第一个状态,叫初始状态,要求的状态叫目标状态。
搜索就是把规则应用于实始状态,在其产生的状态中,直到得到一个目标状态为止。

感谢杭电刘老师的ppt

什么是深度优先搜索

所有的搜索算法从其最终的算法实现上来看,都可以划分成两个部分──控制结构和产生系统。正如前面所说的,搜索算法简而言之就是穷举所有可能情况并找到合适的答案,所以最基本的问题就是罗列出所有可能的情况,这其实就是一种产生式系统。

从根开始计算,到找到位于某个节点的解,回溯法(深度优先搜索)作为最基本的搜索算法,其采用了一种“一只向下走,走不通就掉头”的思想(体会“回溯”二字),相当于采用了先根遍历的方法来构造搜索树。

借用刘老师的话

基本思想:从初始状态S开始,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态G,若未出现,以此状态利用规则生成再下一层任一个结点,再检查是否为目标节点G,若未出现,继续以上操作过程,一直进行到叶节点(即不能再生成新状态节点),当它仍不是目标状态G时,回溯到上一层结果,取另一可能扩展搜索的分支。生成新状态节点。若仍不是目标状态,就按该分支一直扩展到叶节点,若仍不是目标,采用相同的回溯办法回退到上层节点,扩展可能的分支生成新状态,…,一直进行下去,直到找到目标状态G为止。

DFS算法

  • 把起始节点S线放到OPEN表中。
  • 如果OPEN是空表,则失败退出,否则继续。
  • 从OPEN表中取最前面的节点node移到C
A*算法是一种启发式搜索算法,常用于求解路径问题。下面以8数码和迷宫问题为例,来介绍A*算法的过程。 1. 8数码问题 1.1 状态示 8数码问题是指在3×3的九宫格上,摆放了1-8这8个数字,其中有一个格子是空的,求解将这8个数字移动到目标状态的过程。我们可以用一个3×3的矩阵来示当前状态,其中空格用0示。 1.2 操作集 对于8数码问题,每次只能将空格与上下左右四个方向之一的数字进行交换,因此操作集可以示为{Up, Down, Left, Right}。 1.3 估价函数 估价函数用于评估当前状态到达目标状态的距离,一般情况下,估价函数越小,搜索的效率越高。在8数码问题中,我们可以使用曼哈顿距离作为估价函数。曼哈顿距离是指对于一个点(x,y),到目标点(x',y')的距离为|x-x'| + |y-y'|。因此,对于当前状态s,到达目标状态的估价函数值可以示为: h(s) = Σi=1^8 ManhattanDistance(s[i], goal[i]) 其中,s[i]示当前状态中数字i的位置,goal[i]示目标状态中数字i的位置。 1.4 OPENCLOSED OPEN是用来存储待扩展的状态的集合,CLOSED是用来存储已经扩展过的状态的集合。在每次扩展状态时,如果该状态已经存在于CLOSED中,则可以直接跳过;否则,将该状态加入OPEN中。 1.5 A*算法步骤 1. 初始化OPENCLOSED,将初始状态加入OPEN中。 2. 从OPEN中选择f值最小的状态s,如果该状态为目标状态,则搜索结束;否则,将该状态从OPEN中移除,并将其加入CLOSED中。 3. 对于状态s,枚举所有可能的操作,得到所有可能的后继状态。 4. 对于每个后继状态s',计算其估价函数值f(s') = g(s) + h(s'),其中g(s)示从初始状态到状态s的实际距离。如果状态s'已经存在于OPENCLOSED中,则比较其f值和原来的f值,选择较小的一个;否则,将状态s'加入OPEN中。 5. 重复步骤2-4,直到找到目标状态或OPEN为空。 2. 迷宫问题 2.1 状态示 迷宫问题是指在一个矩形网格中,从起点出发,到达终点的最短路径。我们可以用一个二维数组来示迷宫,其中0示可通过的空格,1示不可通过的障碍物。 2.2 操作集 对于迷宫问题,每次只能向上下左右四个方向之一移动一格,因此操作集可以示为{Up, Down, Left, Right}。 2.3 估价函数 估价函数用于评估当前状态到达目标状态的距离,一般情况下,估价函数越小,搜索的效率越高。在迷宫问题中,我们可以使用欧式距离作为估价函数。欧式距离是指对于两个点(x1,y1)和(x2,y2),它们之间的距离为√((x1-x2)^2 + (y1-y2)^2)。因此,对于当前状态s,到达目标状态的估价函数值可以示为: h(s) = EuclideanDistance(s, goal) 其中,s示当前状态的位置,goal示目标状态的位置。 2.4 OPENCLOSED OPENCLOSED的作用同8数码问题中的作用相同。 2.5 A*算法步骤 1. 初始化OPENCLOSED,将起点加入OPEN中。 2. 从OPEN中选择f值最小的状态s,如果该状态为终点,则搜索结束;否则,将该状态从OPEN中移除,并将其加入CLOSED中。 3. 对于状态s,枚举所有可能的操作,得到所有可能的后继状态。 4. 对于每个后继状态s',计算其估价函数值f(s') = g(s) + h(s'),其中g(s)示从起点到状态s的实际距离。如果状态s'已经存在于OPENCLOSED中,则比较其f值和原来的f值,选择较小的一个;否则,将状态s'加入OPEN中。 5. 重复步骤2-4,直到找到终点或OPEN为空。 以上就是A*算法求解8数码、迷宫问题的过程,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值