回溯PPT课件

  • 格式:ppt
  • 大小:2.39 MB
  • 文档页数:30

下载文档原格式

  / 30
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 5 章 回溯
➢教学要求
➢ 了解回溯算法的概念与回溯设计要领 ➢ 掌握应用回溯算法求解桥本分数式、素数环、
数码串珠以及情侣拍照等典型案例
➢本章重点
➢ 理解回溯法 “向前走,碰壁回头”的实现
5.1 回溯概述
1. 回溯的概念
(1) 回溯法(Backtracking method)有“通用解题法”之 美称,是一种比枚举“聪明”的效率更高的搜索技术。
if(i<n && g) {i++;a[i]=<取值点>;continue;}
while(a[i]=<回溯点> && i>1) i--; // 向前回溯
if(a[i]==n && i==1) break; // 退出循环,结束
else a[i]=a[i]+1;
}
递归回溯
回溯法对解空间作深度优先搜索,因此,在一般情况下 用递归方法实现回溯法。
从解的角度理解,回溯法将问题的候选解按某种顺序进行枚举和 检验。当发现当前候选解不可能是解时,就选择下一个候选解。 在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回 溯。若当前候选解除了不满足问题规模要求外,满足所有其他要 求时,继续扩大当前候选解的规模,并继续试探。如果当前候选 解满足包括问题规模在内的所有要求时,该候选解就是问题的一 个解。
宽度优先的问题状态生成法:在一个扩展结点变成死结 点之前,它一直是扩展结点
回溯法:为了避免生成那些不可能产生最佳解的问题状 态,要不断地利用限界函数(bounding function)来处 死那些实际上不可能产生所需解的活结点,以减少问题 的计算量。具有限界函数的深度优先生成法称为回溯法8
子集树与排列树
(2) 回溯描述
对于一般含参量m,n的搜索问题,输入正整数n,m,(n≥m)
i=1;a[i]=<元素初值>;
while (1)
{for(g=1,k=i-1;k>=1;k--)
if( <约束条件1> ) g=0; // 检测约束条件,不满足则返回
if(g && <约束条件2>) printf(a[1:m]); // 输出解
void iterativeBacktrack () {
int t=1; while (t>0) {
if (f(n,t)<=g(n,t)) for (int i=f(n,t);i<=g(n,t);i++) { x[t]=h(i); if (constraint(t)&&bound(t)) { if (solution(t)) output(x); else t++;} }
(2) 回溯法是一种试探求解的方法:通过对问题的归纳分 析,找出求解问题的一个线索,沿着这一线索往前试 探,若试探成功,即得到解;若试探失败,就逐步往 回退,换其他路线再往前试探。
(3) 回溯法可以形象地概括为“向前走,碰壁回头”,若 再往前走不可能得到解,就回溯,退一步另找线路, 这样可省去大量的无效操作,提高搜索效率。
遍历子集树需O(2n)计算时间
void backtrack (int t) { if (t>n) output(x); else for (int i=0;i<=1;i++) { x[t]=i; if (legal(t)) backtrack(t+1); }
遍历排列树需要O(n!)计算时间
如何在4×4的方格棋盘上放置4个皇后,使它们互不攻击:
4皇后搜索过程
4皇后问题(First Checking)
8皇后问题()
皇后数与解的个数
皇后数 解个数 11 20 30 42 5 10 64 7 40 8 92 9 352 10 724 11 2680 12 14200
else t--; } }
生成问题状态的基本方法
扩展结点:一个正在产生儿子的结点称为扩百度文库结点
活结点:一个自身已生成但其儿子还没有全部生成的节点 称做活结点
死结点:一个所有儿子已经产生的结点称做死结点
深度优先的问题状态生成法:如果对一个扩展结点R,一 旦产生了它的一个儿子C,就把C当做新的扩展结点。在 完成对子树C(以C为根的子树)的穷尽搜索之后,将R 重新变成扩展结点,继续生成R的下一个儿子(如果存在 )
3. 回溯剖析与描述
(1) 回溯求解的问题P: 对于已知的由n元组(x1,x2,…,xn)组成的一个状态空
间E={(x1,x2,…,xn)|xi∈si,i=1,2,…,n},给定关于n元 组中的约束集D,要求E中满足D的全部约束条件的所有n元 组。 对于约束集D具有完备性的问题P,一旦检测断定某个j 元组(x1,x2,…,xj)违反D中仅涉及x1,x2,…,xj的一个约 束,就可以肯定,以(x1,x2,…,xj)为前缀的任何n元组 (x1,x2,…,xj,xj+1,…,xn)都不会是问题P的解,因而就 不必去搜索它们,省略了对部分元素(xj+1,…,xn)的操作 与测试。
4皇后问题回溯描述
2. 回溯实现
回溯法的试探搜索,是一种组织得井井有条的、能避免一些不必 要搜索的枚举式搜索。回溯法在问题的解空间树中,从根结点出 发搜索解空间树,搜索至解空间树的任意一点,先判断该结点是 否包含问题的解;如果肯定不包含,则跳过对该结点为根的子树 的搜索,逐层向其父结点回溯;否则,进入该子树,继续搜索。
void backtrack (int t) {
if (t>n) output(x); else
for (int i=f(n,t);i<=g(n,t);i++) { x[t]=h(i); if (constraint(t)&&bound(t)) backtrack(t+1); }
}
迭代回溯
采用树的非递归深度优先遍历算法,可将回溯法表示为一个非递 归迭代过程。
void backtrack (int t)
{
if (t>n) output(x);
else
for (int i=t;i<=n;i++) {
swap(x[t], x[i]);
if (legal(t)) backtrack(t+1);
swap(x[t], x[i]);
9
}
4. 4皇后问题的回溯举例

相关主题