回溯法_ppt课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
回溯法举例: 若取W= (16,15, 15), P= (40,25, 25), C=30
回溯法举例: [旅行商问题] 在这个问题中,给出一个n 顶点网络(有向 或无向),要求找出一个包含所有n 个顶点的具有最小耗 费的环路。任何一个包含网络中所有n 个顶点的环路被称 作一个旅行(t o u r)。在旅行商问题中,要设法找到一 条最小耗费的旅行。 [分析]图给出了一个四顶点网络。在这个网络中,一些旅 行如下: 1 , 2 , 4 , 3 , 1;1 , 3 , 2 , 4 , 1和1 , 4 , 3 , 2 , 1。 旅行1 , 2 , 4 , 3 , 1的耗费为6 6;而1 , 3 , 2 , 4 , 1的耗费 为2 5;1 , 4 , 3 , 2 , 1为5 9。故1 , 3 , 2 , 4 , 1是该网络 中最小耗费的旅行。
4、形式化描述
设问题的解可表示为n元组(x1, x2,… xn), xisi , si为有限 集,n元组的子组(x1, x2,… xi) i<n 应满足一定的约束条件D. 设已 有满足约束条件的部分解(x1, x2,… xi), 添加xi+1 si+1,若(x1, x2, …xi ,xi+1 )满足约束条件, 则继续添加xi+2 ; 若所有可能的xi+1 si+1 均不满足约束条件,则去掉xi , 回溯到(x1, x2,… xi-1), 添加尚未考 虑过的xi , 如此反复进行,直到(x1, x2,… xk) kn满足所有的约束 条件或证明无解.
0-1背包问题解空间树 例如 取N=3 , 问题所有可能的解为(解空间): (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1) 可表示为一棵3层的完全正则二叉树 求解过程相当于在树中搜索 满足条件的叶结点.
旅行是包含所有顶点的一个循环,故可以把任意一个点作 为起点(因此也是终点)。针对该问题,任意选取点 1作为起点和 终点,则每一个旅行可用顶点序列1, v2 ,⋯, vn , 1来描述,v2, ⋯, vn 是(2, 3, ⋯, n) 的一个排列。可能的旅行可用一个树来描 述,其中每一个从根到叶的路径定义了一个旅行。下图给出了一 棵表示四顶点网络的树。从根到叶的路径中各边的标号定义了一 个旅行(还要附加1作为终点)。例如,到节点L的路径表示了旅 行1 , 2 , 3 , 4 , 1,而到节点O的路径表示了旅行1 , 3 , 4 , 2 , 1。网络中的每一个旅行都由树中的一条从根到叶的确定路径 来表示。因此,树中叶的数目为(n- 1 )!。
第五章. 回溯法 (Back traiking)
1、穷举法应用:有限离散问题总可以用穷举法求得问题的全部 例 题 0-1背包问题(0-1Knapsack Problem ) 设有n个物体和一个背包,物体i的重量为wi价值为pi背包的载荷为M, 若将物体i(1 i n,)装入背包,则有价值为pi . 目标是找到一个方案,使得能放入背包的物体总价值最高
7、迭代回溯
void IterativeBacktrack(void) { int t = 1; while (t > 0) { if (f(n,t) < = g(n,t)) for (int i = f(n,t);i < = g(n,t);i ++) //f(n,t)和g(n,t)表示当前扩展节点处未搜索过的子树 //的起始编号和终止编号 { x[t] = h(i);
回溯算法将用深度优先方式从根节点开始,通过搜索解空间 树发现一个最小耗费的旅行。对题中网络,利用前页的解空间树, 一个可能的搜索为A B C F L。在L点,旅行1 , 2 , 3 , 4 , 1作为当 前最好的旅行被记录下来。它的耗费是 5 9。从L点回溯到活节点F。 由于F没有未被检查的孩子,所以它成为死节点,回溯到 C点。C变 为E-节点,向前移动到G,然后是M。这样构造出了旅行1 , 2 , 4 , 3 , 1,它的耗费是6 6。既然它不比当前的最佳旅行好,抛弃它并回 溯到G,然后是C , B。从B点,搜索向前移动到D,然后是H , N。 这个旅行1 , 3 , 2 , 4 , 1的耗费是2 5,比当前的最佳旅行好,把它作 为当前的最好旅行。 从N点,搜索回溯到H,然后是 D。在D点,再次向前移动,到 达O点。如此继续下去,可搜 索完整个树,得出1 , 3 , 2 , 4 , 1是最少耗费的旅行。
若取W= (16,15, 15), P= (40,25, 25), C=30
时间复杂性: O(2n)
3、搜索策略
回溯法在问题的解空间树中,按深度优先策略,从根节 点出发搜索解空间树。算法搜索至解空间树的任一节点时,先 判断该节点是否包含问题的解。 如果肯定不包含,则跳过对以该节点为根的子树的搜索, 逐层向其祖先节点回溯 否则,进入该子树,继续按深度优先策略搜索。 回溯法求问题的所有解时,要回溯到根,且根节点的所 有子树都已被搜索遍才结束。 回溯法求解问题的一个解时,只要搜索到问题的一个解 就可以结束。 这种以深度优先方式系统搜索问题解的算法称为回溯法。
算法设计与分析 >回溯法
5、回溯法解题步骤: 1).针对所给问题,定义问题的解空间 2).确定解空间结构. 3).以深度优先方式搜索解空间.
算法模式 Procedure BACKTRACK(n); {k:=l; repeat if TK (x1,x2,...xK-1 )中的值未取遍 then { xK:=TK (x1,x2,..., x K-1 )中未取过的一个值; if BK (x1, x2, ..., x K) then //状态结点(x1,...xk)被激活 if k=n then output(x1, x2, ..., xk) //输出一个回答结点 e1se k:=k + l;} //深度优先 e1se k:=k-l; //回溯 until k=0; end;{BACKTRACK}
E={ (x1, x2,… xn), xi si , si为有限集 }称为问题的解空间. 约束条件 显约束:每个xi 的范围都给定的约束.满足显约束的 全体向量构成解空间. 隐约束:元组的分量间满足函数关系f(x1,...xn)
算法设计与分析 >回溯法
求解过程可表示为在一棵解空间树 作 深度优先搜索. 解空间树构造: 1. 子集树 : 当解向量为不定长 n 元组时 , 树中从根至每一结点的路径 集合构成解空间 . 树的每个结点称为一个解状态 , 有儿子的结点称为 可扩展结点,叶结点称为终止结点,若结点v对应解状态(x1, x2,… xi), 则其儿子对应扩展的解状态 (x1, x2,… xi, xi+1 ).满足所有约束条件 的解状态结点称为回答结点.0-1背包问题的解空间就是子集树 2.排序树:当解向量为定长n元组时, 树中从根至叶结点的路径的集合 构成解空间.树的每个叶结点称为一个解状态 .旅行商问题的解空间就 是排序树 搜索过程: 搜索按深度优先策略从根开始, 当搜索到任一结点时,判断该点是否 满足约束条件D(剪枝函数),满足则继续向下深度优先搜索,否则跳过 该结点以下的子树(剪枝),向上逐级回溯.
5.1 回溯法基本思想
穷举法技术建议我们先生成所有的候选解,然后找出那个 具有需要特性的元素 1、回溯法主要思想是每次只构造解的一个分量,然后按照 鲜明的方法来评估这个部分构造解。如果一个部分构造解可以进一 步构造而不会违反问题的约束,我们就接受对下一个分量所作的第 一个合法选择。如果无法对下一个分量进行合法的选择,就不对剩 下的任何分量再做任何选择了。在这种情况下,该算法进行回溯, 把部分构造解的最后一个分量替换为它的下一个选择。 2、解空间树:通过对所做的选择结构构造一棵解空间树, 树根代表了在查找解之前的初始状态。树的第一层节点代表对解的 第一个分量所做的选择,第二层节点代表了对解的第二个分量所做 的选择,以此类推。 如果一个部分构造解(子树)仍然有可能导致一个完整解, 我们说这个部分解在树中的相应节点是有希望的。否则说是没希望 的。 叶子要么代表没希望的,要么代表算法找到完整解
//h(i)表示在当前扩展节点处x[t]的第i个可选值
实 现 递 归
} }
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --;
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --; 分析:
if (Constraint(t)&&Bound(t) ) Backtrack(t + 1); if语句含义:Constraint(t)和Bound(t)表示当前扩展 节点处的约束函数和限界函数。 Constraint(t): 返回值为true时,在当前扩展节点处 x[1:t]的取值问题的约束条件,否则不满足问题的约束条 件,可剪去相应的子树 Bound(t): 返回的值为true时,在当前扩展节点处 x[1:t]的取值为时目标函数越界,还需由Backtrack(t+1) 对其相应的子树做进一步搜索。否则,当前扩展节点处 x[1:t]的取值是目标函数越界,可剪去相应的子树 for循环作用:搜索遍当前扩展的所有未搜索过的 子树。 递归出口:Backtrack(t)执行完毕,返回t-1层继续 执行,对还没有测试过的x[t-1]的值继续搜索。当t=1时, 若以测试完x[1]的所有可选值,外层调用就全部结束。
2、穷举法改进 对于某些组合难题的较大实例,我们可以用穷举法求解, 但穷举法的规模较大,所以我们对它进行改进,提出了回溯法和 分支界限法两种算法设计技术。 它们每次只构造候选解的一个分量,然后评估这个部分 构造解:如果加上剩下的分量也不可能求得一个解,就绝不会生 成剩下的分量。 他们是一构造一棵解空间树为基础的,树的节点反映了 对一个部分解做出的特定选择,如果可以保证,节点子孙所对应 的选择不可能得出问题的一个结,两种技术都回立即停止处理这 个节点。 两种技术的区别在于他们能处理的问题类型不同,分支 界限法只能应用于最优问题,而回溯法可以搜索任何问题的所有 解和任一解。
Constraint(t):约束函数,剪枝条件 Bound(t):限界函数,剪枝条件 Solution(t):判断在当前扩展节点处是否已得到问 题的可行解。它返回值为true时,当前扩展节点处x[1:t] 是问题的可行解。此时,由Output(x)记录或输出得到的可 行解。 它的返回值为false时,在当前扩展结点处x[1:t]只是 问题的部分解,还需向纵深方向继续搜索。 搜索边界: f(n,t)和g(n,t)
例如 取N=3 , 问题所有可能的解为(解空间): (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1) 若取W= (16,15, 15), P= (40,25, 25), C=30 穷举法求解相当于分别计算每个可能解,再求优解 时间复杂性: O(2n)
算法设计与分析 >回溯法
ห้องสมุดไป่ตู้
6、递归回溯
调用一次Backtrack(1)即可完成整个回溯搜索过程 void Backtrack(int t) { if (t > n) //t表示深度,t〉n表示算法以搜索到叶节点。 Output(x);//记录或输出得到的可行解x。 else for (int i = f(n,t);i <=g(n,t) ;i ++) //f(n,t)和g(n,t)表示当前扩展节点处为搜索过的子树 //的起始编号和终止编号 { x[t] = h(i); //h(i)表示在当前扩展节点处x[t]的第i个可选值 if (Constraint(t)&&Bound(t) ) Backtrack(t + 1);//递归到下一层看是否有可行解 } }