搜索算法描述

一、搜索过程

搜索算法实际上是根据初始条件和自定义的一种搜索规则构造一颗“解答树”并寻找符合目标状态的节点的过程。所有的搜索算法从最终的算法实现上来看,都可以划分成两个部分——控制结构(扩展节点的方式)和产生系统(扩展节点),而所有的算法优化和改进主要都是通过修改其控制结构来完成的。其实,在这样的思考过程中,我们已经不知不 觉地将一个具体的问题抽象成了一个图论的模型——树,即搜索算法的使用第一步在于搜索树的建立。

初始状态对应着根结点,目标状态对应着目标结点。排在前的结点叫父结点,其后的结点叫子结点,同一层中的结点是兄弟结点,由父结点产生子结点叫扩展。完成搜索的过程就是找到一条从根结点到目标结点的路径,找出一个最优的解。这种搜索算法的实现类似于图或树的遍历,通常可以有两种不同的实现方法,即深度优先搜索(DFS——Depth First search)广度优先搜索(BFS——Breadth First Search)

二、回溯算法

是搜索算法中最基本的算法,采用走不通就掉头的方法作为控制结构,采用先根遍历的方法构造解答树,可用于找解以及最优解。

三、深度优先搜索

思想:先选择某一种可能情况向前(子结点)探索,在探索过程中,一旦发现原来的选择不符合要求,就回溯至父亲结点重新选择另一结点,继续向前探索,如此反复进行,直至求得最优解。深度优先搜索的实现方式可以采用递归或者来实现。由此可见,把通常问题转化为树的问题是至关重要的一步,完成了树的转换基本完成了问题求解

深度优先搜索的优化

1、优化思想

减少所遍历的状态总数

2、三种方法

(1)减少节点数

思想:尽可能减少生成的节点数

(2)定制回溯边界

思想:定制回溯边界条件,剪掉不可能得到最优解的子树

在很多情况下,我们已经找到了一组比较好的解。但是计算机仍然会义无返顾地去搜索比它更“劣”的其他解,搜索到后也只能回溯。为了避免出现这种情况,我们需要灵活地去定制回溯搜索的边界。

在深度优先搜索的过程当中,往往有很多走不通的“死路”。假如我们把这些“死路”排除在外,不是可以节省很多的时间吗?打一个比方,前面有一个路径,别人已经提示:“这是死路,肯定不通”,而你的程序仍然很“执着”地要继续朝这个方向走,走到头来才发现,别人的提示是正确的。这样,浪费了很多的时间。针对这种情况,我们可以把“死路”给标记一下不走,就可以得到更高的搜索效率。

(3)记忆化

思想:运用记忆化的方法,使得一些遍历过的子树不要重复遍历

3、三个原则

(1)正确性:剪去的“枝条”不包含最优答案;

(2)准确性:在保证第一条原则的情况下,尽可能的剪去更多不包含最优答案的枝条;

(3)高效性:通过剪枝要能够更快的接近到达最优解。

四、广度优先搜索

类似树的按层遍历,其过程为:首先访问初始点,并将其标记为已访问过,接着访问所有未被访问过可到达的邻接点并均标记为已访问过,然后再按照次序,访问每一个顶点的所有未被访问过的邻接点,并均标记为已访问过, 依此类推 ,直到图中所有和初始点有路径相通的顶点都被访问过为止。
广度搜索的处理和优化: 对于状态数很多时, 广度优先搜索 可以采用 循环队列 动态链表 来处理。

五、对回溯算法的改进:

1。添加一个全局变量BestAnswer,记录当前最优解。

2。在每次生成一个节点时,计算其预期值,并与BestAnswer比较。如果不好,则调用回溯过程。


//有部分是查阅资料如果有幸您能看到并认为有错误的地方请留下您宝贵的意见,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值