版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简单回溯法教案,朱全民,搜索的本质,一、两种题型: 1.简明的数学模型揭示问题本质。对于这一类试题,我们 尽量用解析法求解。 2.对给定的问题建立数学模型,或即使有一定的数学模型,但采用数学方法解决有一定困难。对于这一类试题,我们只好用模拟或搜索求解。 二、搜索的本质: 搜索的本质就是逐步试探,在试探过程中找到问题的 三、搜索问题考察的范围 1.算法的实现能力 2.优化算法的能力,简单回溯法,N皇后问题 背包问题 寻找国都名 ,回溯法,回溯法也是搜索算法中的一种控制策略,但与枚举法不同的是,它是从初始状态出发,运用题目给出的条件、规则,按照深度优秀搜索的顺序扩展所有可能情况,从中找出满足题意要
2、求的解答。回溯法是求解特殊型计数题或较复杂的枚举题中使用频率最高的一种算法。,procedure run(当前状态); var i:integer; begin if 当前状态为边界 then begin if 当前状态为最佳目标状态 then 记下最优结果;exit;回溯 end;then for i算符最小值 to 算符最大值 do begin 算符i作用于当前状态,扩展出一个子状态; if (子状态满足约束条件) and (子状态满足最优性要求)then run(子状态); end;for end;run 我们在应用回溯法求所有路径的算法框架解题时,应考虑如下几个重要因素:,定义状态:即
3、如何描述问题求解过程中每一步的状况。为了精简程序,增加可读性,我们一般将参与子结点扩展运算的变量组合成当前状态列入值参,以便回溯时能恢复递归前的状态,重新计算下一条路径; 边界条件:即在什么情况下程序不再递归下去。如果是求满足某个特定条件的一条最佳路径,则当前状态到达边界时并非一定意味着此时就是最佳目标状态。因此还须增加判别最优目标状态的条件; 搜索范围:在当前状态不满足边界条件的情况下,应如何设计算符值的范围。换句话说,如何设定for语句中循环变量的初值和终值。 约束条件和最优性要求:当前扩展出一个子结点后应满足什么条件方可继续递归下去;如果是求满足某个特定条件的一条最佳路径,那么在扩展出某
4、个子状态后是否继续递归搜索下去,不仅取决于子状态是否满足约束条件,而且还取决于子状态是否满足最优性要求。 参与递归运算的参数:将参与递归运算的参数设为递归子程序的值参或局部变量。若这些参数的存储量大(例如数组)且初始值需由主程序传入,为避免内存溢出,则必须将其设为全局变量,且回溯前需恢复其递归前的值。,N皇后问题,在N*N的棋盘上放置N个皇后而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。,八皇后的两组解,基本思想,由于皇后的摆放位置不能通过某种公式来确定,因此对于每个皇后的摆放位置都要进行试探和纠正,这就是“回溯”的思想。 在N个皇后未放置完
5、成前,摆放第i个皇后和第i+1个皇后的试探方法是相同的,因此完全可以采用递归的方法来处理。,算法基本框架,Procedure Try(I:integer); 搜索第I行皇后的位置 var j:integer; begin if I=n+1 then 输出方案; for j:=1 to n do if 皇后能放在第I行第J列的位置 then begin 放置第I个皇后; 对放置皇后的位置进行标记; Try(I+1) 对放置皇后的位置释放标记; end; end;,细节处理,怎样判断某列放置了皇后 A:array 1.MaxN of Boolean; 竖线被控制标记 怎样判断某对角线上放置了皇后
6、B:array 2.MaxN * 2 of Boolean; 左上到右下斜线被控制标记 C:array 1MaxN.MaxN1 of Boolean; 左下到右上斜线被控制标记,0,1背包问题,已知一个容量大小为M重量的背包和N种物品,每种物品的重量为Wi。若将物品放入背包将得到Pi的效益,求怎样选取物品将得到效益最大,算法分析,本题可以用递归求解:设当前有N个物品,容量为M;因为这些物品要么选,要么不选,我们假设选的第一个物品编号为I(1I-1号物品不选),问题又可以转化为有N-I个物品(即第I+1N号物品),容量为M-Wi的子问题如此反复下去,然后在所有可行解中选一个效益最大的便可。 另外
7、,为了优化程序,我们定义一个函数如下: FI表示选第IN个物品能得到的总效益。不难推出: FN=Pn FI=FI+1+Pi(I=1N-1) 假设当前已选到第I号物品,如果当前搜索的效益值+FI+1的值仍然比当前的最优值小,则没有必要继续搜索下去。,算法框架,Procedure Search(I:Integer; J:Byte);递归求解 Var K :Byte; Begin If Now+FJAns Then Begin 修改最优解 Ans:=Now; Out:=Ou; End; For K:=J To N Do 选取物品 If WK=I Then Begin Now:=Now+PK; OuK
8、:=True; Search(I-WK,K+1); Now:=Now-PK; OuK:=False; End; End;,给出一个矩阵及一些国都名: o k d u b l i n dublin a l p g o c e v tokyo r a s m u s m b london o s l o n d o n rome y i b l g l r c bonn k r z u r i c h paris o a i b x m u z oslo t p q g l a m v lima 要求从这个矩阵中找出这些国都名,并输出它们的起始位置及方向。,寻找国都名,搜索的方向,算法思想,将字符
9、矩阵读入到二维数组,然后对每一个国都名进行搜索,首先需要在矩阵中找到国都名的第一个字符,然后沿八个方向进行搜索。直到找到国都名为止。若在矩阵中没有找到,则输出相应的信息。 在搜索过程时,类似八皇后问题,建立一个标志数组,标识已经搜索过的方向,在对八个方向搜索时,可以建立一个方向数组,使得程序更加简洁明了 Const Fx : Array1.8,1.2 Of Shortint 定义八个方向 =(0,1),(0,-1),(1,0),(-1,0),(1,-1),(-1,1),(1,1),(-1,-1);,Procedure Work(T,X,Y:Integer); 搜索路径,T为国都名的字符位置,X
10、,Y为当前搜索的坐标 Var I : Integer; Begin If T=Length(S)+1 Then begin 搜索完,打印输出 Out; exit end; For I:=1 To 8 Do 八个方向进行搜索 Begin X:=X+FxI,1; Y:=Y+FxI,2; 坐标变化 If (AX,Y=ST)And(BX,Y) Then Begin W:=W+Chr(I+48); 记录路径 BX,Y:=False; 设置已经搜索 Work(T+1,X,Y); 继续搜索下一个 Delete(W,Length(W),1);恢复原路径 BX,Y:=True; 恢复标志 End; X:=X-F
11、xI,1; Y:=Y-FxI,2; 返回后,坐标恢复 End; End;,构造字串 生成长度为n的字串,其字符从26个英文字母的前p(p26)个字母中选取,使得没有相邻的子序列相等。例如p=3,n=5时 a b c b a满足条件 a b c b c不满足条件 输入:n,p 输出:所有满足条件的字串,分析 状态:待扩展的字母序号at。实际上字串s亦参与了递归运算,但是由于该变量的存储量太大,因此我们将s设为全局变量; 边界条件和目标状态:产生了一个满足条件的字串,即at=n+1; 搜索范围:第at位置可填的字母集a. chr(ord(a)+p-1); 约束条件:当前字串没有相邻子串相等的情况
12、var n,p:integer;字串长度和可选字母的个数 tl:longint; 满足条件的字串数 ed:char; 可选字母集中的最大字母 s:string; 满足条件的字串,procedure solve(at:integer);递归扩展第at个字母 var ch:char; i:integer; begin if at=n+1 若产生了一个满足条件的字串,则输出,满足条件的字串数+1 then begin writeln(f,s); inc(tl);exit回溯 end;then for cha to ed do 搜索每一个可填字母 begin ss+ch;i1;检查当前字串是否符合条件
13、 while(icopy(s,length(s)-2*i+1,i) do inc(i);,if iat div 2 then solve(at+1);若当前字串符合条件,则递归扩展下一个字母 delete(s,length(s),1)恢复填前的字串 endfor end;solve begin readln(n,p);输入字串长度和前缀长短 edchr(ord(a)+p-1);计算可选字母集中的最大字母 s; tl0;满足条件的字串初始化为空,字串数为0 solve(1);从第1个字母开始递归计算所有满足条件的字串 writeln(Total:,tl);输出满足条件的字串数 end.main,
14、回溯法的优化 1、1、 递归前对尚待搜索的信息进行预处理 如果搜索对象是通过某种运算直接得出其结果的,那么搜索前一般需进行预处理通过相应运算将所有搜索对象的计算结果置入常量表,搜索过程中只要将当前搜索对象的结果值从常量表取出即可。这样可以显著改善搜索效率。否则,在搜索过程中每遇到这些对象都要计算,则会产生大量的重复运算。 2、记忆化搜索 如果解答树中存在一些性质相同的子树,那么,只要我们知道了其中一棵子树的性质,就可以根据这个信息,导出其它子树的性质。这就是自顶向下记忆化搜索的基本思想。 序关系计数问题 用关系和=将3个数a、b和c依次排列有13种不同的关系: abc, ab=c, acb,
15、a=bc, a=b=c, a=cb, bac, ba=c, bca, b=ca, cab, ca=b, cba。 输入n 输出n个数依序排列时有多少种关系。,1、枚举所有序关系表达式 由于类似于a=b和b=a的序关系表达式是等价的,为此,规定等号前面的大写字母在ASCII表中的序号,必须比等号后面的字母序号小。 状态(Step,First,Can):其中Step表示当前确定第Step个关系符号;First表示当前大写字母中最小字母的序号;Can是一个集合,集合中的元素是还可以使用的大写字母序号 边界条件(step=n):即确定了最后关系符号 搜索范围(Firstin):枚举当前大写字母的序号
16、约束条件(i in Can):序号为i的大写字母可以使用 算法1: procedure Count(Step,First,Can); 从当前状态出发,递归计算序关系表达式数 begin if Step=n then begin 若确定了最后一个关系符号,则输出统计结果 for iFirst to n do if i in Can then Inc(Total); Exit 回溯 end;then for iFirst to n do 枚举当前的大写字母 if i in Can then begin 序号为i的大写字母可以使用 Count(Step+1,i+1,Can-i); 添等于号 Coun
17、t(Step+1,1,Can-i) 添小于号 Endthen end; Count 主程序调用Count(1,1,1.n)后,Total的值就是结果。该算法的时间复杂度是W(n!),2、粗略利用信息 若已经确定了前k个数,并且下一个关系符号是小于号,这时所能产生的序关系数就是剩下的n-k个数所能产生的序关系数。 设i个数共有Fi种不同的序关系,那么,由上面的讨论可知,在算法1中,调用一次Count(Step+1,1,Can-i)之后,Total的增量应该是Fn-Step。这个值可以在第一次调用Count(Step+1,1,Can-i)时求出。而一旦知道了Fn-Step的值,就可以用TotalT
18、otal+Fn-Step 代替调用Count(Step+1,1,Can-i),procedure Count(Step,First,Can); Step,First,Can的含义同算法1 begin if Step=n then begin 若确定了最后一个关系符号,则输出统计结果 for iFirst to n do if i in Can then Inc(Total);Exit 回溯 end;then for iFirst to n do 枚举当前的大写字母 if i in Can 序号为i的大写字母可以使用 then begin Count(Step+1,i+1,Can-i);添等于号 if Fn-Step=-1 then begin 第一次调用 Fn-Step Total;Count(Step+1,1,Can-i); 添小于号 Fn-Step Total-Fn-S
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北方工业大学《货币银行学》2025-2026学年第一学期期末试卷(A卷)
- 智能安全知识资源库完善建设案
- 北方工业大学《藏族民间舞-热巴舞》2025-2026学年第一学期期末试卷(A卷)
- 中北大学《徽商与创新》2025-2026学年第一学期期末试卷(A卷)
- 中北大学《局部解剖与手术学》2025-2026学年第一学期期末试卷(A卷)
- 中小电机笼型绕组制造工安全管理考核试卷含答案
- 中北大学《安全原理》2025-2026学年第一学期期末试卷(A卷)
- 网络信息审核员冲突解决能力考核试卷含答案
- 基因工程药品生产工岗前技能评估考核试卷含答案
- 风机操作工岗前实操能力考核试卷含答案
- GB/T 713.1-2023承压设备用钢板和钢带第1部分:一般要求
- 英美文学选读教案
- 新松agc小车控制台tc操作手册
- 退保证金说明转账方式提供退保证金说明
- 二类费用工程建设其他费用取费标准集合上海市
- 西安水务公司招聘考试真题
- 应急管理试题及答案
- xx酒店发布会策划方案
- GB/T 5169.16-2017电工电子产品着火危险试验第16部分:试验火焰50W水平与垂直火焰试验方法
- 第十章环境管理模式课件
- 基础全面天文学中的数据挖掘课件
评论
0/150
提交评论