网站大量收购闲置独家精品文档,联系QQ:2885784924

Chapter回溯法.ppt

  1. 1、本文档共49页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Chapter回溯法

7 回溯法 Backtracking 引例 图的3着色问题 给定一个无向图G=(V,E),及3种颜色{1,2,3},现要为图的每个顶点着色。每顶点只能着一种颜色,并且要求相邻的顶点具有不同的颜色。 一个具有n个顶点的图,可用一个n维的向量(c1,c2,…,cn)表示一种着色方案,ci∈{1,2,3}, i=1,2,...,n,共有3n种可能的着色,可用一棵完全的3叉树表示。 下图为有3个顶点的所有可能的着色搜索树,从根到叶结点的每条路径表示一种着色方案。 问题的解向量:问题的解能够表示成一个n维向量(x1,x2,,…,xn)的形式。 显式约束:对分量xi的取值限定。 隐式约束:为满足问题的解而对不同分量之间施加的限定。 问题的解空间:对于问题的一个实例,解向量满足显式约束条件的所有n维向量,构成了该问题实例的一个解空间。 回溯法的工作原理 回溯法的基本做法是搜索,是一种组织得井井有条,能避免不必要搜索的穷举式搜索法。 回溯法按深度优先策略搜索问题的解空间树。算法搜索至解空间树的任意一结点时,先判断该结点是否可能包含问题的解:1) 如果肯定不包含,则跳过这个结点;2) 如果可能包含,进入该子树,继续按深度优先策略搜索;3) 若某结点 i 的所有子结点都不可能包含问题的解,则回溯到 i 的父结点,生成下一个结点,继续搜索。 递归回溯 迭代回溯 复杂度分析 高斯8皇后问题 著名的数学家高斯在1850年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问如何摆放? 考察n皇后问题n=4的情形: 合法布局:一个不互相攻击的4 皇后布局 部分布局:一个不互相攻击的少于4个皇后的布局 下图表示一个部分布局,用向量(3,1,0,0)表示; 递归回溯 迭代回溯 算法分析 算法效率:蛮力方法候选解的个数是n!;而使用回溯法,候选解的个数是nn,回溯的效率是否太低了? 然而,仔细分析可以发现,回溯法可以极大减少测试次数: 例如,假设前两个皇后冲突,蛮力方法仍旧要测试(n ?2)!个候选解;而回溯法只要进行一次测试,就可以避免剩余无意义的测试。 所以,尽管在最坏情况下要用O(nn)时间来求解,然后大量实际经验发现,它在有效性上远远超过蛮力方法O(n!)。例如在4 皇后问题中,只搜索了256个节点中的19个就找到了解。 哈密顿回路问题 1859年,爱尔兰数学家哈密顿提出了著名的周游世界问题。他用正12面体的20个顶点代表20个城市,要求从一个城市出发,经过每个城市恰好一次,然后回到出发城市。 分析 假定图G=(V,E)的顶点集V={1,2,...,n},则哈密顿回路问题的可能解表示为n维的向量x=(x1,...,xn),其中xi∈{1,2,...,n}。根据题意,有如下约束条件: (xi, xi+1) ∈E (1≤i≤n-1) (xn, x1) ∈E xi≠xj (1≤i, j≤n, i≠j) 在所有的可能解中,考虑到约束条件xi≠xj (1≤i, j≤n, i≠j),则可能的解应该是(1,2,...,n)的一个排列,对应的解空间中有n!个叶子结点。 通用回溯方法框架 本小节描述通用回溯方法的一般框架,可以作为系统搜索的基本框架,在解决实际问题时,修改该基本框架中的相应部分使之适合实际问题即可。 对于以下这样一类问题,可以使用该方法:这类问题的解满足事先定义好的某种约束向量(x1,...,xn),这里n是取决于问题实例的常量。 在回溯法中,每个xi 均是属于某个有限集合的,不妨称之为Xi,那么回溯法实质上是按照词典顺序考虑笛卡儿积: X1×X2×…×Xn 中的元素。 算法最初从空向量开始,先选择X1中的最小元素作为x1; 如果(x1)是部分解,那么选择X2中的最小元素作为x2; 如果(x1, x2)是部分解,则继续考虑X3中的最小元素作为x3, 否则,考虑X2中的第二个元素作为x2。依此类推。 一般说来, 当算法已经检测到部分解(x1, x2,…, xj), 需要继续考虑 v = (x1, x2,…, xj, xj+1)时,有以下几种情形: 1. 若v 表示问题的最终解,算法记录下它作为一个解。如果只需要一个解,算法结束;否则,继续找其它解。 2. 如果v = (x1, x2,…, xj, xj+1) 是一个部分解,那么选择集合Xj+2中未使用过的最小元素作为xj+2。(向前搜索) 3. 如果v 既非最终解,也非部分解,那么会有以下两种情况: a. 如果集合Xj+1中还有其它未曾使用过的元素,则选择下一个未曾使用过的元素作为xj+1。 b. 如果集合Xj+1中没有其它未曾使用过的元素,则回溯,将Xj中未曾使

文档评论(0)

qiwqpu54 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档