- 1、本文档共86页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回溯与搜索初步(修改)
四、深度、宽度优先搜索 1 2 3 1 4 1 2 3 4 1 2 3 4 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 四、深度、宽度优先搜索 在深度优先搜索过程中,对于当前发现的节点,如果它还存在以此节点为起点而未探测到的边时,就沿此边继续搜索下去。若当节点所有的边都已被探测过,则回溯到当前节点的父节点继续搜索的过程,直到找到目标节点或探测完所有的节点。 在具体实现时,通常用递归或栈来实现。 四、深度、宽度优先搜索 1 2 3 1 4 1 2 3 4 1 2 3 4 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 四、深度、宽度优先搜索 在应用深度搜索算法时,一般应考虑如下几个重要因素: 节点定义:即如何描述问题状态和状态间的关系 边界条件:即如何终止递归执行 搜索范围:即在当前状态不满足边界条件的情况下,如何设计搜索范围。 约束条件:即当扩展出一个子节点后应满足什么条件方可继续递归下去。 恢复递归前状态:如果扩展节点的过程有全局变量的参与,则回溯前必须恢复其递归前的值。 四、深度、宽度优先搜索 在N×N的棋盘上,有一象棋中的“马”,现请你找出马能不重复走完棋盘上所有点的方案。 对于这个问题,我们来考虑一下深搜算法的几个因素 四、深度、宽度优先搜索 节点定义类似于八皇后问题,我们把马在棋盘上的位置定义为搜索树的节点,节点直接的关系用前面骑士遍历中讲到的dx,dy来表示。 边界条件既然要不重复的走完整个棋盘,因此,马跳跃的步数一定是n×n-1步,即搜索的深度为N×N。 四、深度、宽度优先搜索 搜索范围由于马可以往八个方向跳,因此搜索范围即为1~8。 约束条件根据题意可知,约束条件为马不能跳出棋盘并且所要跳到的格子从未到过。 恢复状态在需要从某格回溯的时候,要将此格重新标记为未访问。 四、深度、宽度优先搜索 深度优先搜索算法实际上就是穷举,只不过用递归实现多重循环而已。 一般来说,我们可以用以下三种方法对深度优先搜索算法进行优化: 缩小搜索范围; 改变搜索次序; 剪枝 四、深度、宽度优先搜索 缩小搜索范围一般可以从两个方面考虑优化,第一是在递归前对尚待搜索的信息进行预处理,减少搜索量;二是增加约束条件,使其在保证不遗漏解的前提下尽可能的苛刻。 四、深度、宽度优先搜索 比如在跳马问题中,除了前面的约束条件外,还有更强的约束条件。 1 9 4 × a 5 2 8 7 c 3 6 b d × 1 3 2 7 4 6 E 5 四、深度、宽度优先搜索 改变搜索的次序如果要求问题的全部解,改变搜索次序没有任何意义,但如果只要得到问题的一个解时,通过改变搜索的次序则可能得到意想不到的效果。 四、深度、宽度优先搜索 在跳马问题中, 马可以往八个方向跳跃,通常情况下,我们都是按照方向依次尝试,但这样就比较容易走进死胡同,从而需要大量的时间进行回溯。 事实上,我们可以让马跳得更智能些。 四、深度、宽度优先搜索 比如从1可以到2或22,而从2可以到3、7、9、19、21;从22可以到11、17、21、15、23。都是5种选择,我们随便选其中一个。 若选择2,则从3、7、21、19、9的目的地有1、3、3、3、3个。 那么该选哪个呢? 1 18 11 6 3 10 5 2 17 12 19 22 13 4 7 14 9 24 21 16 23 20 15 8 25 四、深度、宽度优先搜索 我们选择目的地数最少的格子。 这样选择可以使得回溯的时候能一下子回到第2步,大大缩短回溯的时间,同时,这样的跳法可以使马尽量先往边角处跳,也就不容易产生“孤点”和“终点”。 四、深度、宽度优先搜索 剪枝通过判断,避免一些不必要的遍历过程。 剪枝时必须注意以下四个方面: 正确性:防止剪掉包含正确解的分支。这是剪枝优化的前提,一般通过“必要条件”来剪枝。 力度:直接影响搜索的效率。 代价:处理好剪枝力度和剪枝判断的复杂度。 剪枝条件的获得方法:直觉法和推理法。 四、深度、宽度优先搜索 宽度优先搜索一般又叫做按层搜索,首先访问根节点,然后访问第一层节点、第二层节点……。 其时间复杂度与深度优先搜索是相同的,不同的仅在于搜索的顺序不同。 宽度优先搜索算法通常用来求解最优解。 宽度优先搜索算法通常使用队列来实现。 四、深度、宽度优先搜索 1 2 3 1 4 1 2 3 4 1 2 3 4 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 1
文档评论(0)