算法分析与设计软件工程

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个好的约束函数能显著地减少所生成的结点 数。但这样的约束函数往往计算量较大。因此, 在选择约束函数时通常存在生成结点数与约束 函数计算量之间的折衷。
可以用“重排原理”提高效 率
回溯法总结-重排原理
对于许多问题而言,在搜索试探时选取x[i]值的顺序是任意的。在其它条 件相当的前提下,让可取值最少的x[i]优先将更为有效。从图中关于同一 问题的2棵不同解空间树,可体会这种策略的潜力。
0-1背包问题 迷宫问题 皇后问题 自然数排列问题 图的着色问题
…………
0-1背包问题
问题描述: 对于n=3的0/1背包问题,三个物品的重量为{20, 15, 10}, 价值为{20, 30, 25},背包容量为25,求怎样选取物品将 得到效益最大(物品不可分割)?
问题的解空间
下图所示为应用回溯的实施过程,其中方格中的×表示在该方格放置一个皇后, 但由于受前面已放置的皇后的攻击而放弃的位置。
继续以上的回溯探索,可得4皇后问题的另一个解 (3,1,4,2)。
定义问题的解空间
因为每一行只能放置一个皇后,每一个皇后在 每一行上有4个位置可供选择,因此在4*4格的 棋盘上放置4个皇后,有44种可能的布局。又因 为每一个皇后不能放在同一列,所以它有4!种 可能的解。
解空间树
对于 n=3 的 0/1背包问题,其解空间树如图所示,树中的 8 个叶子结点 分别代表该问题的8个可能解。
深度优先搜索解空间树
背包重量 25 1 1 2 1 3 1 4 0 5 0 6 1 0 9
对物品1的选择 重20 ,价值20
0 3
0 12 1 14 0 15
对物品2的选择 重15 ,价值30
回溯法的基本思想
回溯法有“通用的解题法”之称

回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要 搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。 回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空 间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题 的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其
对一个具体问题来说,回溯法的有效性往往就体现在当问题实例
的规模n较大时,它能够用很少的时间就求出问题的解。而对于
一个问题的具体实例,我们又很难预测回溯法的算法行为,特别 是很难估计出产生的结点数,这是分析回溯法效率的主要困难。
克服这个困难,可运用概率方法 —— 蒙特卡罗方法
算法设计
void Queue(int n)
else if (x[k]<=n && k<n) k=k+1; //放置下一个皇后 else { x[k]=0; //重置x[k],回溯 k=k-1; } } }
bool Place(int k) //考察皇后k放置在x[k]列是否发生冲突 { for (i=1; i<k; i++) if (x[k]= =x[i] | | abs(k-i)= =abs(x[k]-x[i])) return false; return true; }
可能解由一个等长向量{x1, x2, …, xn}组成,其中xi=1(1≤i≤n)表示物品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) }
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 4 1 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
3
3 4 4 5
3
9 11 11 14 16 16 20 22 25 27 30 32 36 38 41 43 46 48 52 52 54 57 57 59 59 62 64 9 4 2 3 2 4 3 4 1 3 1 4 2 4 1 2 1 3 2 3 1 2 1
10 12 15 15 17 21 23 26 28 31 33 37 39 42 44 47 49 53 55 55 58 60 63 65
3 34 4 29 1 35 2 4 1 2 40 40 4 1 4 45 45 2 2 1 51 3 1 4 50 2 56 3 3 61 61 1 2
(1,0,0,0)
1 2 18 4 13 4 2 3 19 19 3 4 1 3 24 24 1 4 1
(1,2,0,0) 2
2 3 8 4 6 3 7 2

祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。

求问题所有解:要回溯到根,且根结点的 所有子树都已被搜索遍才结束。 求任一解:只要搜索到问题的一个解就可 结束。

回溯法解题步骤:
1).针对所给问题,定义问题的解空间,该空间包含问题的解 2).确定状态空间树的结构 3).列出约束条件,以深度优先方式搜索解空间,生产搜索树,得 到问题的解
4后问题的状态空间树 其中,第1、2、3、4层节点到上一层节点的路径上所标记的数字,对应于第1、 2、3、4行皇后可能的列位置。
搜索以深度优先方式搜索解空间
根据题意, 约束方程为:
xi x j
| i – j | | x i – xj |
1
皇后i,j不在同一列上 皇后i,j不在同一斜线上 初始化 (0,0,0,0)
N皇后问题,是一个古老而著名的问题,是回溯算法的典型例 题:在N*N格的格子上摆放N个皇后,使其不能互相攻击,即 任意两个皇后都不能处于同一行、同一列或同一斜线上,问 有多少种摆法?
1 2 1 2
3
4 皇后1 皇后2 皇后3 皇后4
3
4
为了简单起间,考虑在4*4的棋盘上 放置4个皇后的问题,把这个问题称 为4皇后问题。4后问题可以表示成 一个四元组(X1,X2,X3,X4),i (i=1,2,3,4 )表示第 i 行,Xi (i=1,2,3,4)表示第i行皇后的 列位置。
{ for (i=1; i<=n; i++) //初始化 x[i]=0; k=1; while (k>=1) { x[k]=x[k]+1; //在下一列放置第k个皇后 while (x[k]<=n && !Place(k)) x[k]=x[k]+1; //搜索下一列 if (x[k]<=n && k= =n) { //得到一个解,输出 for (i=1; i<=n; i++) cout<<x[i]; return; }
1 1 2 2 18 4 8 2 14 13 1 30 3 31 4 29 1 35 4 38 2 39 51 3 54 3 34 1 4 50 2 56
4后问题的生成树
3
Q Q Q Q Q
Q Q
Q
通过前面具体实例的讨论容易看出,回溯算法的效率在很大程度上 依赖于以下因素: (1)产生x[k]的时间; (2)满足约束的x[k]值的个数; (3)计算约束函数constraint的时间; (4)满足约束函数和上界函数约束的所有x[k]的个数。
停的进进退退,直到最后走出迷宫为止。像走迷宫这样,遇到死路 就回头的搜索思路就叫做“回溯”。
从问题的某种可能情况出发,搜索所有能到达的可能情况,然后以其 中一种可能的情况为新的出发点,继续向下探索,当所有可能情况都 探索过且都无法到达目标的时候,再回退到上一个出发点,继续探索
另一个可能情况,这种不断回头寻找目标的方法称为“回溯法”。
10
0 8 1 11
1
7
对物品3的选择 重10 ,价值25
0-1背包 生成树
1 0 9 0 6 10 0 8 不可行解 价值=20 1 1
物品价值{20, 30, 25}
1 2 1
0
13 0 15
1
0
12
1 14
11
价值=55 价值=30 价值=25 价值=0
最终结果为(0,1,1),总重量为25,总价值为55
—— 回溯法
专业:软件工程 姓名:王鸿雁 学号:2013090013
主要内容:
回溯的概念 回溯法的基本思想 回溯法的应用 回溯法的效率分析
回溯的概念
相信大家都玩过走迷宫的游戏吧,在走迷宫的过程中,我们从入口 出发,到达路口后,选择 一条岔路进入,到达下一个路口,然后再 选择一条岔路,……。在这个过程中,我们经常会走入死路,这时 我们只能退回到最近的路口,重新选择一条岔路,而如果某个路口 所有的岔路都是死路的话,还必须再往前面的路口退回去,这样不
图(a)从第1层剪去1棵子树,则从所有应当考虑的3元组中一次 消去12个3元组。图(b)同样从第1层剪去1棵子树,却只从应当 考虑的3元组中消去8个3元组。前者的效果明显比后者好。
解空间的结构一经选定,影响回溯法效率的前三个因素就可以确
定,只剩下生成结点数的数目是可变的,它将随问题的具体内容
以及结点的不同生成方式而变动。即使是对同一问题的不同实例, 回溯法所产生的结点数也会有很大变化。
解题步 骤
确定解空间树的结构 4后问题的解空间可以用一棵完全4叉树来表示,如 下图所示:
1 1 2 2 3 3 4 4 5 4 6 3 7 2 9 4 3 8 4 2 4 13 3 3 19 4 1 1 18 3 24 4 1 4 29 3 2 1 35 4 1 2 3 34 2 40 4 1 4 45 2 2 1 51 3 1 4 50 2 56 3 1 3 61 2
相关文档
最新文档