算法课件(四)回溯法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
以(x1,x2,…,xj)为前缀的任何n元组(x1, x2,…,xj,xj+1,…,xn)都不会是问题P的解,
因而就不必去搜索它们、检测它们。
• 回溯法正是针对这类问题,利用这类问题的上述
性质而提出来的比枚举法效率更高的算法。
生成问题状态的基本方法

扩展结点:一个正在产生儿子的结点称为扩展结点 活结点:一个自身已生成但其儿子还没有全部生成 的节点称做活结点
3. 对于问题的一个实例,解向量满足显式约束条件的
所有多元组,构成了该实例的一个解空间。

所有可能解的个数是8!
四皇后问题的解空间树
1 1 2 2 2 3 3 4 4 5 4 2 6 3 7 9 4 3 8 4 2 4 13 3 3 1 19 4 1 3 24 4 1 18 4 29 3 2 1 35 4 1 2 40 4 1 3 34 4 45 2 2 1 51 3 1 2 56 3 1 50 3 61 2 4
回溯法的一般描述
• 回溯法有“通用解题法”之称,用它可以系统地 搜索问题的所有解。
• 可用回溯法求解的问题P,通常要能表达为:对
于已知的由n元组(x1,x2,…,xn)组成的一 个状态空间E={(x1,x2,…,xn)∣xi∈Si , i=1,2,…,n} • 给定关于n元组中的一个分量的一个约束集D,称 E中满足D的全部约束条件的任一n元组为问题P的 一个解。
状态结点,以便继续往深层搜索;
• 否则跳过对以该状态结点为根的子树的搜索,而
一边逐层地向该状态结点的祖先结点回溯,一边
“杀死”其儿子结点已被搜索遍的祖先结点,直
到遇到其儿子结点未被搜索遍的祖先结点,即转 向其未被搜索的一个儿子结点继续搜索。
• 在搜索过程中,只要所激活的状态结点又满足终
结条件,那么它就是回答结点,应该把它输出或
一个叶子结点,要求从T的根到该叶子结点的路径
上依次的n条边相应带的n个权x1,x2,…,xn满
足约束集D的全部约束。 • 在T中搜索所要求的叶子结点,很自然的一种方式 是从根出发,按深度优先的策略逐步深入,即依次 搜索满足约束条件的前缀1元组(x1)、前缀2元组
(x1,x2)、…,前缀i元组(x1,x2,…,
回溯法步骤
• 在用回溯法求解有关问题的过程中,一般是一边 建树,一边遍历该树。
• 从 T的根出发,按深度优先的策略,系统地搜索
以其为根的子树中可能包含着回答结点的所有状
态结点,而跳过对肯定不含回答结点的Байду номын сангаас有子树
的搜索,以提高搜索效率。
• 具体地说,当搜索按深度优先策略到达一个满足
D中所有有关约束的状态结点时,即“激活”该
Q
Q Q
Q Q Q (4, 1, 1, 1)=4+4+4+4 =16
Q
Q Q Q
Q
Q (4, 1, 1, 1)=4+4+4+4 =16
(4, 2)=4+4×2 =12
(4, 2)=4+4×2 =12
4皇后问题的随机路径及路径上结点总数估算示例
在使用概率估算方法估算搜索空间的结点总数时, 为了估算得更精确一些,可以选取若干条不同的 随机路径(通常不超过20条),分别对各随机路 径估算结点总数,然后再取这些结点总数的平均 值。例如,4皇后问题,搜索空间的结点数取4条 随机路径结点总数的平均值,结果为14。而4皇后 问题的解空间树中的结点总数为65,则回溯法求 解4皇后问题产生的搜索空间的结点数大约是解空 间树中的结点总数的14/65≈21.5%,这说明回溯法 的效率大大高于蛮力穷举法。
回溯法的效率分析
蒙特卡罗分析方法:在解空间树上产生一条随机路径,沿此路 径估算解空间中满足约束条件的节点数m: -设x是所产生的随机路径上的一个节点,在解空间树的第i层 (深度为i) -对x的所有儿子节点,用约束函数检测出满足约束条件的节点 数mi -随机选取路径上的下一个节点:从mi中任意选取一个 -这条路径一直延伸到一个叶节点或一个所有儿子节点都不满
4)满足隐约束函数的si的个数
重排原理
对于许多问题而言,在搜索试探时选取x[i]的值顺序是任意的。 在其它条件相当的前提下,让可取值最少的x[i]优先。从图中关 于同一问题的2棵不同解空间树,可以体会到这种策略的潜力。
(a)
(b) 图(a)中,从第1层剪去1棵子树,则从所有应当考虑的3元组中 一次消去12个3元组。对于图(b),虽然同样从第1层剪去1棵子 树,却只从应当考虑的3元组中消去8个3元组。前者的效果明 显比后者好。
的路径。因此,如果解空间树从根结点到叶子结
点的最长路径长度为h(n),则回溯法所需的计算 空间通常为O(h(n)),而显式地存储整个解空间则 需要O(2h(n)) 或 O(h(n)!) 内存空间。
回溯算法的效率依赖于以下因素: 1)产生si的时间; 2)满足显约束si的个数 3)计算隐约束函数的时间代价
树,通常情况下c=2,所以,子集树中共有2n个叶子结点,因
此,遍历子集树需要Ω(2n)时间。 (2)排列树(Permutation Trees):当所给问题是确定n个元 素满足某种性质的排列时,相应的解空间树称为排列树。在排 列树中,通常情况下,|S1|=n,|S2|=n-1,…,|Sn|=1,所以,排 列树中共有n!个叶子结点,因此,遍历排列树需要Ω(n!)时间。
足约束条件的节点为止。
-通过这些mi的值,估出解空间中满足约束条件的节点总数m
随机路径中含有的结点总数的计算方法: 假设第1层有m0个满足约束条件的结点,每个结点有m1个 满足约束条件的孩子结点,则第2层上有m0m1个满足约束 条件的结点,同理,假设第2层上的每个结点均有m2个满 足约束条件的孩子结点,则第3层上有m0m1m2个满足约束 条件的结点,依此类推,第n层上有m0m1m2 … mn-1个满足 约束条件的结点,因此,这条随机路径上的结点总数为: m0 + m0m1 + m0m1m2 + … + m0m1m2…mn-1。
• 另外,对于任意的0≤i≤n-1,E中n元组(x1,
x2,…,xn)的一个前缀i元组(x1,x2,…,xi)
对应于T中的一个非叶子结点,T的根到这个非叶
子结点的路径上依次的i条边的权分别为x1,
x2,…,xi,反之亦然。 • 特别地,E 中的任意一个n元组的空前缀(),对 应于T的根
• 因而,在E中寻找问题P的一个解等价于在T中搜索
约束之一,则以(x1,x2,…,xj)为前缀的任
何n元组(x1,x2,…,xj,xj+1,…,xn)一定
也违反D中仅涉及到x1,x2,…,xi的一个约束,
n≥i>j。
• 因此,对于约束集D具有完备性的问题P,一旦检
测断定某个j元组(x1,x2,…,xj)违反D中仅
涉及x1,x2,…,xj的一个约束,就可以肯定,
子到它们的双亲的边,按从左到右的次序,分别带
权 xi+1(1) ,xi+1(2) ,…,xi+1(mi) ,i=0,1, 2,…,n-1。照这种构造方式,E中的一个n元组 (x1,x2,…,xn)对应于T中的一个叶子结点, T的根到这个叶子结点的路径上依次的n条边的权
分别为x1,x2,…,xn,反之亦然。
保存。
• 由于在回溯法求解问题时,一般要求出问题的所
有解,因此在得到回答结点后,同时也要进行回
溯,以便得到问题的其他解,直至回溯到T的根且
根的所有儿子结点均已被搜索过为止。
二、回溯算法设计
在用回溯法求解问题时,常遇到两种典型的解空间树: (1)子集树(Subset Trees):当所给问题是从n个元素的集合 中找出满足某种性质的子集时,相应的解空间树称为子集树。 在子集树中,|S1|=|S2|=…=|Sn|=c,即每个结点有相同数目的子
5.
backtrack(t+1); }
f(n,t),g(n,t)分别表示在当前扩展结点处未搜索过的 子树的起始编号和终止编号。 h(i)表示在当前扩展结点处x[t]的第i个可选值。 constraint(t)和bound(t)是当前扩展结点处的约束函
数和限界函数
• 回溯法任何时候只保存从根结点到当前扩展结点
• 对于许多问题,所给定的约束集D具有完备性,
即i元组(x1,x2,…,xi)满足D中仅涉及到x1,
x2,…,xi的所有约束,意味着 j(j<i)元组(x1,
x2,…,xj)一定也满足D中仅涉及到x1,x2,…, xj的所有约束,i=1,2,…,n。 • 换句话说,只要存在 0≤j≤n-1,使得(x1, x2,…,xj)违反D中仅涉及到x1,x2,…,xj的
• 有许多问题的解“隐藏”在多个可能之中。穷举
就是对多种可能情形一一测试,从多种可能中找
出符合条件的(一个或一组)解。当然,也可能 得出无解的结论。 这种方法叫穷举法(枚举法)。 又叫作暴力(蛮力)算法,枚举算法。 • 循环枚举、递归枚举,是将所有的情况不假思索
全部枚举出来里,加以判断。
《算经》公元五世纪末,我国古代数学家张丘建
11 14 16 20 22 25 27 30 32 36 38 41 43 46 48 52 54 57 59 62 64 2 3 2 4 3 1 4 3 1 4 2 4 1 2 1 3 2 3 1 2 1
10 12 15 17 21 23 26 28 31 33 37 39 42 44 47 49 53 55 58 60 63 65
第五部分 第十三章 回溯法
内容
• 问题的状态空间 • 回溯算法设计
– 百钱买百鸡问题 – m着色问题
– n皇后问题
– 哈米尔顿回路问题 – 定和子集问题 – 0-1背包问题 – 旅行商问题
一、 问题状态空间
枚举算法
“如果有一个可行的很笨的办法,那么这个办法不是笨办法”——美国海军陆战队格言
• 用于解析式不易得出的情况。
1 2 3 4 5 6 7 1 Q
8
2
3
Q
Q
4
5 6 Q
Q
Q
同一列或同一斜线上。
7
8
Q
Q
1. 对于八皇后问题,解向量可以表示为:(x1, x2, … ,
x8)

所有可能的排列个数是88
2. 显约束条件是:Xi=1,2,……8
3. 隐约束条件为


不同列:xixj
不处于同一正、反对角线:|i-j||xi-xj|
在《算经》中提出了如下问题:鸡翁一值钱五, 鸡母一值钱三,鸡雏三值钱一。凡百钱买百鸡, 问鸡翁、母、雏各几何?
循环枚举不是万能的
如果翁、母、雏得题目中,如果有n种不同
价格的鸡的话,那么可以写n个for循环。 但是,如果n是一个变量,那么就无法确定写 循环。这时就需要采用递归来进行枚举。这是递 归算法产生的原因之一。
递归枚举
画出求算过程的示意图。 递归模型:
八皇后问题
八皇后问题是十九世纪著名的数 学家高斯于1850年提出的。问题是: 在8×8的棋盘上摆放八个皇后,使其 不能互相攻击,即任意两个皇后都不 能处于同一行、同一列或同一斜线上。 可以把八皇后问题扩展到n皇后问 题,即在n×n的棋盘上摆放n个皇后, 使任意两个皇后都不能处于同一行、
一棵高为n的带权有序树T,把在E中求问题P的所
有解转化为在T中搜索问题P的所有解。
• 在回溯法中,上述引入的树被称为问题P的状态 空间树
• 设 Si中的元素(xi∈Si)可排成xi(1) ,xi(2) ,…,
xi(mi-1) ,|Si| =mi,i=1,2,…,n。从根开始,
让T的第I层的每一个结点都有mi个儿子。这mi个儿
子集树(Subtree)
排列树(Permutation tree)
26
回溯法的递归函数: backtrack(t) 1.if (t>n) output(x); 2. else for i=f(n,t) to g(n,t){
3.
4.
x[t]=h(i);
if (constraint(t)&&bound(t))
xi),…,直到i=n为止。
• 树T上任意一个结点被称为问题P的状态结点;由根
节点到其它状态结点节点的所有路径确定这个问题的
状态空间;表示状态空间的树称为状态空间树。
• 树T上的任意一个叶子结点被称为问题P的一个解状
态结点;由根节点到解状态结点的所有路径确定这个 问题的解空间;表示解空间的树结构称为解空间树。 • 树T上满足约束集D的全部约束的任意一个叶子结点 被称为问题P的一个答案状态结点,它对应于问题P 的一个解答。

死结点:一个所有儿子已经产生的结点称做死结点 深度优先的问题状态生成法:如果对一个扩展结点 R,一旦产生了它的一个儿子C,就把C当做新的扩
展结点。在完成对子树C(以C为根的子树)的穷
尽搜索之后,将R重新变成扩展结点,继续生成R
的下一个儿子(如果存在)
回溯法基本思想
• 回溯法首先将问题P的n元组的状态空间E表示成
相关文档
最新文档