1、算法设计与分析算法设计与分析清华大学出版社清华大学出版社第第8章章 回溯法回溯法8.1 概概 述述 8.2 图问题中的回溯法图问题中的回溯法8.3 组合问题中的回溯法组合问题中的回溯法8.4 实验项目实验项目0/1背包问题背包问题1算法设计与分析算法设计与分析清华大学出版社清华大学出版社8.1 概概 述述 8.1.1 问题的解空间问题的解空间8.1.2 解空间树的动态搜索(解空间树的动态搜索(1)8.1.3 回溯法的求解过程回溯法的求解过程8.1.4 回溯法的时间性能回溯法的时间性能2算法设计与分析算法设计与分析清华大学出版社清华大学出版社 复复杂杂问问题题常常常常有有很很多多的的可可能能解解
2、,这这些些可可能能解解构构成成了了问问题题的的解解空空间间。解解空空间间也也就就是是进进行行穷穷举举的的搜搜索索空空间间,所所以以,解解空空间间中中应应该该包包括括所所有有的的可可能能解解。确确定定正正确确的的解解空空间间很很重重要要,如如果果没没有有确确定定正正确确的的解解空空间间就就开开始始搜搜索索,可可能能会会增增加加很很多多重重复复解解,或者根本就搜索不到正确的解。或者根本就搜索不到正确的解。8.1.1 问题的解空间问题的解空间 3算法设计与分析算法设计与分析清华大学出版社清华大学出版社(a)二维搜索空间无解 (b)三维搜索空间的解 图8.1 错误的解空间将不能搜索到正确答案例如:桌子
3、上有6根火柴棒,要求以这6根火柴棒为边搭建4个等边三角形。4算法设计与分析算法设计与分析清华大学出版社清华大学出版社 对对于于任任何何一一个个问问题题,可可能能解解的的表表示示方方式式和和它它相相应应的的解解释释隐隐含了解空间及其大小。含了解空间及其大小。例例如如,对对于于有有n个个物物品品的的0/1背背包包问问题题,其其可可能能解解的的表表示示方方式可以有以下两种:式可以有以下两种:(1)可可能能解解由由一一个个不不等等长长向向量量组组成成,当当物物品品i(1in)装装入入背背包包时时,解解向向量量中中包包含含分分量量i,否否则则,解解向向量量中中不不包包含含分分量量i,当当n=3时,其解空
4、间是:时,其解空间是:(),(1),(2),(3),(1,2),(1,3),(2,3),(1,2,3)(2)可能解由一个等长向量)可能解由一个等长向量x1,x2,xn组成,其中组成,其中xi=1(1in)表示物品表示物品i装入背包,装入背包,xi=0表示物品表示物品i没有装入背包,没有装入背包,当当n=3时,其解空间是:时,其解空间是:(0,0,0),(0,0,1),(0,1,0),(1,0,0),(0,1,1),(1,0,1),(1,1,0),(1,1,1)5算法设计与分析算法设计与分析清华大学出版社清华大学出版社 为为了了用用回回溯溯法法求求解解一一个个具具有有n个个输输入入的的问问题题,
5、一一般般情情况况下下,将将其其可可能能解解表表示示为为满满足足某某个个约约束束条条件件的的等等长长向向量量X=(x1,x2,xn),其其中中分分量量xi(1in)的的取取值值范范围围是是某某个个有有限限集集合合Si=ai1,ai2,airi,所所有有可能的解向量构成了问题的可能的解向量构成了问题的解空间解空间。6算法设计与分析算法设计与分析清华大学出版社清华大学出版社 问题的解空间一般用问题的解空间一般用解空间树解空间树(Solution Space Trees,也称状态空间树)的方式组织,树也称状态空间树)的方式组织,树的根结点位于第的根结点位于第1层,表示搜索的初始状态,层,表示搜索的初始
6、状态,第第2层的结点表示对解向量的第一个分量做出层的结点表示对解向量的第一个分量做出选择后到达的状态,第选择后到达的状态,第1层到第层到第2层的边上标出层的边上标出对第一个分量选择的结果,依此类推,从树的对第一个分量选择的结果,依此类推,从树的根结点到叶子结点的路径就构成了解空间的一根结点到叶子结点的路径就构成了解空间的一个可能解。个可能解。7算法设计与分析算法设计与分析清华大学出版社清华大学出版社对对于于n=3的的0/1背背包包问问题题,其其解解空空间间树树如如图图8.2所所示示,树中的树中的8个叶子结点分别代表该问题的个叶子结点分别代表该问题的8个可能解。个可能解。对物品对物品1的选择的选
7、择对物品对物品3的选择的选择对物品对物品2的选择的选择11111100000001123457811121415310698算法设计与分析算法设计与分析清华大学出版社清华大学出版社 对于n=4的TSP问题,其解空间树如图8.3所示,树中的24个叶子结点分别代表该问题的24个可能解,例如结点5代表一个可能解,路径为12341,长度为各边代价之和。243422343413142412123312134131312321214241434322434123124134图图8.3 n=4的的TSP问题的解空间树问题的解空间树5710121517212326283133 37 3942444749525
8、457596264469111416202225273032 36 38414346485153565861633813192429354045505560218342411234349算法设计与分析算法设计与分析清华大学出版社清华大学出版社8.1.2 解空间树的动态搜索(解空间树的动态搜索(1)回回溯溯法法从从根根结结点点出出发发,按按照照深深度度优优先先策策略略遍遍历历解解空空间间树树,搜搜索索满满足足约约束束条条件件的的解解。在在搜搜索索至至树树中中任任一一结结点点时时,先先判判断断该该结结点点对对应应的的部部分分解解是是否否满满足足约约束束条条件件,或或者者是是否否超超出出目目标标函函
9、数数的的界界,也也就就是是判判断断该该结结点点是是否否包包含含问问题题的的(最最优优)解解,如如果果肯肯定定不不包包含含,则则跳跳过过对对以以该该结结点点为为根根的的子子树树的的搜搜索索,即即所所谓谓剪剪枝枝(PruningPruning);否否则则,进进入入以以该该结结点点为为根根的的子树,继续按照深度优先策略搜索。子树,继续按照深度优先策略搜索。10算法设计与分析算法设计与分析清华大学出版社清华大学出版社例如,对于n=3的0/1背包问题,三个物品的重量为20,15,10,价值为20,30,25,背包容量为25,从图8.2所示的解空间树的根结点开始搜索,搜索过程如下:1不可行解不可行解价值价
10、值=20价值价值=55 价值价值=30 价值价值=25价值价值=01111000000112811121415131069不可行解不可行解11算法设计与分析算法设计与分析清华大学出版社清华大学出版社 再如,对于n=4的TSP问题,其代价矩阵如图8.5所示,C=3 6 712 2 8 8 6 2 3 7 6 图图8.5 TSP问题的代价矩阵问题的代价矩阵12算法设计与分析算法设计与分析清华大学出版社清华大学出版社23442212313131312321214241422434123124134图图8.6 TSP问题的搜索空间问题的搜索空间5 475441127464851 53583813242
11、935404550556021834241234128113算法设计与分析算法设计与分析清华大学出版社清华大学出版社 回回溯溯法法的的搜搜索索过过程程涉涉及及的的结结点点(称称为为搜搜索索空空间间)只只是是整整个个解解空空间间树树的的一一部部分分,在在搜搜索索过过程程中中,通通常常采用两种策略避免无效搜索:采用两种策略避免无效搜索:(1)用)用约束条件约束条件剪去得不到可行解的子树;剪去得不到可行解的子树;(2)用)用目标函数目标函数剪去得不到最优解的子树。剪去得不到最优解的子树。这两类函数统称为这两类函数统称为剪枝函数剪枝函数(Pruning Function)。)。v 需需要要注注意意的的
12、是是,问问题题的的解解空空间间树树是是虚虚拟拟的的,并并不不需需要要在在算算法法运运行行时时构构造造一一棵棵真真正正的的树树结结构构,只只需需要要存储从根结点到当前结点的路径。存储从根结点到当前结点的路径。14算法设计与分析算法设计与分析清华大学出版社清华大学出版社8.1.3 回溯法的求解过程回溯法的求解过程 由由于于问问题题的的解解向向量量X=(x1,x2,xn)中中的的每每个个分分量量xi(1in)都都属属于于一一个个有有限限集集合合Si=ai1,ai2,airi,因因此此,回回溯溯法法可可以以按按某某种种顺顺序序(例例如如字字典典序序)依依次次考考察察笛笛卡卡儿儿积积S1S2Sn中的元素
13、。中的元素。初初始始时时,令令解解向向量量X为为空空,然然后后,从从根根结结点点出出发发,选选择择S1的的第第一一个个元元素素作作为为解解向向量量X的的第第一一个个分分量量,即即x1=a11,如如果果X=(x1)是是问问题题的的部部分分解解,则则继继续续扩扩展展解解向向量量X,选选择择S2的的第第一一个个元元素素作作为为解解向向量量X的的第第2个个分分量量,否否则则,选选择择S1的的下下一一个个元元素素作作为为解解向向量量X的的第第一一个个分分量量,即即x1=a12。依依此此类类推推,一一般般情情况况下下,如如果果X=(x1,x2,xi)是是问问题题的的部部分分解解,则则选选择择Si+1的的第
14、第一一个个元元素素作作为为解解向向量量X的的第第i+1个个分分量时,有下面三种情况:量时,有下面三种情况:15算法设计与分析算法设计与分析清华大学出版社清华大学出版社(1)如如果果X=(x1,x2,xi1)是是问问题题的的最最终终解解,则则输输出出这这个个解解。如如果果问问题题只只希希望望得得到到一一个个解解,则则结结束束搜搜索索,否否则则继继续续搜搜索索其其他他解;解;(2)如如果果X=(x1,x2,xi1)是是问问题题的的部部分分解解,则则继继续续构构造造解解向量的下一个分量;向量的下一个分量;(3)如如果果X=(x1,x2,xi1)既既不不是是问问题题的的部部分分解解也也不不是是问问题题
15、的最终解,则存在下面两种情况:的最终解,则存在下面两种情况:如如果果xi+1=ai1k不不是是集集合合Si1的的最最后后一一个个元元素素,则则令令xi+1=ai1k1,即选择,即选择Si+1的下一个元素作为解向量的下一个元素作为解向量X的第的第i+1个分量;个分量;如如果果xi+1=ai1k是是集集合合Si1的的最最后后一一个个元元素素,就就回回溯溯到到X=(x1,x2,xi),选选择择Si的的下下一一个个元元素素作作为为解解向向量量X的的第第i个个分分量量,假假设设xi=aik,如如果果aik不不是是集集合合Si的的最最后后一一个个元元素素,则则令令xi=aik1;否则,就继续回溯到否则,就
16、继续回溯到X=(x1,x2,xi1);16算法设计与分析算法设计与分析清华大学出版社清华大学出版社回溯法的一般框架递归形式advance(int k)1.对每一个xSk循环执行下列操作 1.1 xk=x;1.2 将xk加入X;1.3 if(X是最终解)flag=true;return;1.4 else if(X是部分解)advance(k+1);,主算法主算法1X=;2.flag=false;3.advance(1);4.if(flag)输出解输出解X;else输出输出“无解无解”;回溯法的递归形式的一般框架如下:17算法设计与分析算法设计与分析清华大学出版社清华大学出版社回溯法的一般框架迭代
17、形式1X=;2flag=false;3k=1;4while(k=1)4.1 当(Sk没有被穷举)循环执行下列操作 4.1.1 xk=Sk中的下一个元素;4.1.2 将xk加入X;4.1.3 if(X为最终解)flag=true;转步骤5;4.1.4 else if(X为部分解)k=k+1;转步骤4;4.2 重置Sk,使得下一个元素排在第1位;4.3 k=k-1;/回溯5if flag 输出解X;else 输出“无解”;回溯算法的非递归迭代形式的一般框架如下:18算法设计与分析算法设计与分析清华大学出版社清华大学出版社8.1.4 回溯法的时间性能回溯法的时间性能 一一般般情情况况下下,在在问问题
18、题的的解解向向量量X=(x1,x2,xn)中中,分分量量xi(1in)的的取取值值范范围围为为某某个个有有限限集集合合Si=ai1,ai2,airi,因因此此,问问题题的的解解空空间间由由笛笛卡卡儿儿积积A=S1S2Sn构构成成,并并且且第第1层层的的根根结结点点有有|S1|棵棵子子树树,则则第第2层层共共有有|S1|个个结结点点,第第2层层的的每每个个结结点点有有|S2|棵棵子子树树,则则第第3层层共共有有|S1|S2|个个结结点点,依依此此类类推推,第第n+1层层共共有有|S1|S2|Sn|个个结结点点,他他们们都都是是叶叶子子结点,代表问题的所有可能解。结点,代表问题的所有可能解。19算
19、法设计与分析算法设计与分析清华大学出版社清华大学出版社在用回溯法求解问题时,常常遇到两种典型的解空间树:在用回溯法求解问题时,常常遇到两种典型的解空间树:(1)子集树子集树(Subset Trees):当所给问题是从):当所给问题是从n个元素个元素的集合中找出满足某种性质的子集时,相应的解空间树称的集合中找出满足某种性质的子集时,相应的解空间树称为子集树。在子集树中,为子集树。在子集树中,|S1|=|S2|=|Sn|=c,即每个结点,即每个结点有相同数目的子树,通常情况下有相同数目的子树,通常情况下c=2,所以,子集树中共,所以,子集树中共有有2n个叶子结点,因此,遍历子集树需要个叶子结点,因
20、此,遍历子集树需要(2n)时间。时间。(2)排列树排列树(Permutation Trees):当所给问题是确定):当所给问题是确定n个元素满足某种性质的排列时,相应的解空间树称为排列个元素满足某种性质的排列时,相应的解空间树称为排列树。在排列树中,通常情况下,树。在排列树中,通常情况下,|S1|=n,|S2|=n-1,|Sn|=1,所以,排列树中共有,所以,排列树中共有n!个叶子结点,因此,遍历排个叶子结点,因此,遍历排列树需要列树需要(n!)时间。时间。20算法设计与分析算法设计与分析清华大学出版社清华大学出版社用概率方法估算回溯法所产生的结点数。用概率方法估算回溯法所产生的结点数。基本思
21、想:假定约束函数是静态的(即在回溯法的执基本思想:假定约束函数是静态的(即在回溯法的执行过程中,约束函数不随算法所获得信息的多少而动态改行过程中,约束函数不随算法所获得信息的多少而动态改变),在解空间树上产生一条随机路径,然后沿此路径估变),在解空间树上产生一条随机路径,然后沿此路径估算解空间树中满足约束条件的结点总数算解空间树中满足约束条件的结点总数m。设。设x是所产生是所产生随机路径上的一个结点,且位于解空间树的第随机路径上的一个结点,且位于解空间树的第i层,对于层,对于x的所有孩子结点,计算出满足约束条件的结点数的所有孩子结点,计算出满足约束条件的结点数mi,路径,路径上的下一个结点从上
22、的下一个结点从x的满足约束条件的的满足约束条件的mi个孩子结点中随个孩子结点中随机选取,这条路径一直延伸,直到叶子结点或者所有孩子机选取,这条路径一直延伸,直到叶子结点或者所有孩子结点均不满足约束条件为止。结点均不满足约束条件为止。21算法设计与分析算法设计与分析清华大学出版社清华大学出版社QQ(4,1,1,1)=4+4+4+4 =16QQ(4,2)=4+42 =12QQQ(4,1,1,1)=4+4+4+4 =16QQQ(4,2)=4+42 =124皇后问题的随机路径及路径上结点总数估算示例皇后问题的随机路径及路径上结点总数估算示例QQ随机路径中含有的结点总数的计算方法:随机路径中含有的结点总
23、数的计算方法:假设第假设第1层有层有m0个满足约束条件的结点,每个结点有个满足约束条件的结点,每个结点有m1个个满足约束条件的孩子结点,则第满足约束条件的孩子结点,则第2层上有层上有m0m1个满足约束个满足约束条件的结点,同理,假设第条件的结点,同理,假设第2层上的每个结点均有层上的每个结点均有m2个满个满足约束条件的孩子结点,则第足约束条件的孩子结点,则第3层上有层上有m0m1m2个满足约束个满足约束条件的结点,依此类推,第条件的结点,依此类推,第n层上有层上有m0m1m2 mn-1个满足个满足约束条件的结点,因此,这条随机路径上的结点总数为:约束条件的结点,因此,这条随机路径上的结点总数为
24、:m0+m0m1+m0m1m2+m0m1m2mn-1。22算法设计与分析算法设计与分析清华大学出版社清华大学出版社 在使用概率估算方法估算搜索空间的结点总数时,在使用概率估算方法估算搜索空间的结点总数时,为了估算得更精确一些,可以选取若干条不同的随机路为了估算得更精确一些,可以选取若干条不同的随机路径(通常不超过径(通常不超过20条),分别对各随机路径估算结点总条),分别对各随机路径估算结点总数,然后再取这些结点总数的平均值。例如,图数,然后再取这些结点总数的平均值。例如,图8.7所示所示4皇后问题,搜索空间的结点数取皇后问题,搜索空间的结点数取4条随机路径结点总数条随机路径结点总数的平均值,
25、结果为的平均值,结果为14。而。而4皇后问题的解空间树中的结点皇后问题的解空间树中的结点总数为总数为65,则回溯法求解,则回溯法求解4皇后问题产生的搜索空间的结皇后问题产生的搜索空间的结点数大约是解空间树中的结点总数的点数大约是解空间树中的结点总数的14/6521.5%,这说,这说明回溯法的效率大大高于蛮力穷举法。明回溯法的效率大大高于蛮力穷举法。23算法设计与分析算法设计与分析清华大学出版社清华大学出版社8.2 图问题中的回溯法图问题中的回溯法 8.2.1 图着色问题图着色问题 8.2.2 哈密顿回路问题哈密顿回路问题24算法设计与分析算法设计与分析清华大学出版社清华大学出版社8.2.1 图
26、着色问题图着色问题 图着色问题描述为:给定无向连通图图着色问题描述为:给定无向连通图G=(V,E)和正整数和正整数m,求最小的整数,求最小的整数m,使得用,使得用m种颜色对种颜色对G中的顶点着色,使得任意两个相邻顶点着色不同。中的顶点着色,使得任意两个相邻顶点着色不同。25算法设计与分析算法设计与分析清华大学出版社清华大学出版社 由于用由于用m种颜色为无向图种颜色为无向图G=(V,E)着色,其中,着色,其中,V的顶点个数为的顶点个数为n,可以用一个,可以用一个n元组元组C=(c1,c2,cn)来描述图的一种可能着色,其中,来描述图的一种可能着色,其中,ci1,2,m(1in)表示赋予顶点表示赋
27、予顶点i的颜色。的颜色。例如,例如,5元组元组(1,2,2,3,1)表示对具有表示对具有5个顶点的个顶点的无向图的一种着色,顶点无向图的一种着色,顶点1着颜色着颜色1,顶点,顶点2着颜色着颜色2,顶点,顶点3着颜色着颜色2,如此等等。,如此等等。如果在如果在n元组元组C中,所有相邻顶点都不会着相同中,所有相邻顶点都不会着相同颜色,就称此颜色,就称此n元组为可行解,否则为无效解。元组为可行解,否则为无效解。26算法设计与分析算法设计与分析清华大学出版社清华大学出版社 回溯法求解图着色问题,首先把所有顶点的颜回溯法求解图着色问题,首先把所有顶点的颜色初始化为色初始化为0,然后依次为每个顶点着色。在
28、图着,然后依次为每个顶点着色。在图着色问题的解空间树中,如果从根结点到当前结点色问题的解空间树中,如果从根结点到当前结点对应一个部分解,也就是所有的颜色指派都没有对应一个部分解,也就是所有的颜色指派都没有冲突,则在当前结点处选择第一棵子树继续搜索,冲突,则在当前结点处选择第一棵子树继续搜索,也就是为下一个顶点着颜色也就是为下一个顶点着颜色1,否则,对当前子树,否则,对当前子树的兄弟子树继续搜索,也就是为当前顶点着下一的兄弟子树继续搜索,也就是为当前顶点着下一个颜色,如果所有个颜色,如果所有m种颜色都已尝试过并且都发生种颜色都已尝试过并且都发生冲突,则回溯到当前结点的父结点处,上一个顶冲突,则回
29、溯到当前结点的父结点处,上一个顶点的颜色被改变,依此类推。点的颜色被改变,依此类推。27算法设计与分析算法设计与分析清华大学出版社清华大学出版社D=1ACBDE1234567891011121314A=1B=2C=3D=3E=1(a)一个无向图一个无向图 (b)回溯法搜索空间回溯法搜索空间图图8.8 回溯法求解图着色问题示例回溯法求解图着色问题示例28算法设计与分析算法设计与分析清华大学出版社清华大学出版社 设数组colorn表示顶点的着色情况,回溯法求解m着色问题的算法如下:算法8.1图着色问题 1将数组colorn初始化为0;2k=1;3while(k=1)3.1 依次考察每一种颜色,若顶
30、点k的着色与其他顶点的着色不发生冲突,则转步骤3.2;否则,搜索下一个颜色;3.2 若顶点已全部着色,则输出数组colorn,返回;3.3 否则,3.3.1 若顶点k是一个合法着色,则k=k+1,转步骤3处理下一个顶点;3.3.2 否则,重置顶点k的着色情况,k=k-1,转步骤3回溯;29算法设计与分析算法设计与分析清华大学出版社清华大学出版社算法算法8.2 图着色问题图着色问题 void GraphColor(int n,int c ,int m)/所有数组下标从所有数组下标从1开始开始 for(i=1;i=1)colork=colork+1;while(colork=m)if Ok(k)b
31、reak;else colork=colork+1;/搜索下一个颜色搜索下一个颜色 if(colork=m&k=n)/求解完毕,输出解求解完毕,输出解 for(i=1;i=n;i+)coutcolori;return;30算法设计与分析算法设计与分析清华大学出版社清华大学出版社 else if(colork=m&kn)k=k+1;/处理下一个顶点处理下一个顶点 else colork=0;k=k-1;/回溯回溯 bool Ok(int k)/判断顶点判断顶点k的着色是否发生冲突的着色是否发生冲突 for(i=1;i=1)3.1 xk=xk+1,搜索下一个顶点,搜索下一个顶点;3.2 若若(n个
32、顶点没有被穷举个顶点没有被穷举)执行下列操作执行下列操作 3.2.1 若若(顶点顶点xk不在哈密顿回路上不在哈密顿回路上&(xk-1,xk)E),转步骤转步骤3.3;3.2.2 否则,否则,xk=xk+1,搜索下一个顶点;,搜索下一个顶点;3.3 若数组若数组xn已形成哈密顿路径,则输出数组已形成哈密顿路径,则输出数组xn,算法结束;,算法结束;3.4 否则,否则,3.4.1 若数组若数组xn构成哈密顿路径的部分解,构成哈密顿路径的部分解,则则k=k+1,转步骤,转步骤3;3.4.2 否则,重置否则,重置xk,k=k-1,取消顶点,取消顶点xk的访问标志,的访问标志,转步骤转步骤3;34算法设
33、计与分析算法设计与分析清华大学出版社清华大学出版社算法算法8.4哈密顿回路问题哈密顿回路问题 void Hamiton(int n,int x,int c )/所有数组下标从所有数组下标从1开始开始 for(i=1;i=1)xk=xk+1;/搜索下一顶点搜索下一顶点 while(xk=n)if(visitedxk=0&cxk-1xk=1)break;else xk=xk+1;35算法设计与分析算法设计与分析清华大学出版社清华大学出版社 if(xk=n&k=n&cxk1=1)for(k=1;k=n;k+)coutxk;return;else if(xk=n&kn)visitedxk=1;k=k+1;else /回溯回溯 xk=0;visitedxk=0;k=k-1;36算法设计与分析算法设计与分析清华大学出版社清华大学出版社8.3 组合问题中的回溯法组合问题中的回溯法 8.3.1 八皇后问题