算法分析与设计之回溯法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2、形式化描述 类型说明: TYPE MAN=1..N ; WOMAN=1..N ; RANK=1..N; 这个问题的输入信息是两个n阶方矩阵MR和WR。 VAR MR: ARRAY[MAN,RANK] OF WOMAN; WR: ARRAY[WOMAN,RANK] OF MAN: 以n=8为例,有如下两个8阶方阵
13 2
8 19
一、算法思想
1、基本思想 为解决某个问题,逐次尝试解的各个部分, 并加以 记录, 组成部分解。当发现某部分导致失败, 则将 之从部分解中删除, 回溯再作新的尝试, 直至成功 或穷尽所有的可能而报告失败。 试探----纠错 回溯---尝试

2、求解过程
a)回溯法对任一解的生成,一般都采用逐步扩大解的方式, 每进行一步,都试图在当前部分解的基础上扩大部分解。 b)扩大时,首先检查扩大后是否违反了约束条件,若不违反, 则扩大之,然后在此基础上,按类似方法,直至成为完全解。 若违反,则放弃该步以及它所生成的部分解,然后按类似方 法尝试其他可能的扩大方式,若都违反,则回溯到上一层, 然后按类似方法尝试其他可能的扩大方式,此时,若发现已 尝试过所有方式,则结束,表示该解的生成失效。
实例2 求解稳定婚姻序对问题

定义 假定两个不相交的集合A和B含有的元素个数 都是n, 要确定n个有序对<a, b>, a∈A, b∈B, 这n 个有序对要满足某种限制。限制可以是多种多样的, 其中有一种就是所谓的“稳定婚姻条件”。满足 “稳定婚姻条件” 的序对为稳定婚姻序对。
?如何组成稳定的n对夫妇呢?
四个矩阵MR,WR, MW和WM中只有两个是独立的。现 在可以将不稳定婚姻情况形式化如下:存在a∈A, b∈B, 输出 中有这样两个有序对<a, b’>和<a’, b>(即a’和b’不是夫妇), 如果下述两个不等式都成立 , 则包含有序对<a, b’>和<a’, b> 的输出为不稳定婚姻, MW[a’, b’]<MW[a’, b] (1) WM[b’, a’]<WM[b’, a] (2) 如不存在这样的a’和b’ ,则输出的n个有序对就是稳定的婚姻。

1、稳定婚姻问题叙述如下:A是n个男子的集合, B是 n个女子的集合, 每个男子按自己的选择意愿将n个女 子从1到n排列, 同样地每个女子也将n个男子从1到n 排列。将他们组成n对夫妇, 如果存在这样一个男子和 一个女子, 这两人不是夫妇, 但他们相互喜欢的程度胜 过对自己的配偶的喜爱,这样的n对夫妇称为不稳定婚 姻。如果不存在这样的男子和女子, 则称为稳定婚姻。 问题是如何将这n个男子、n个女子组成稳定的n对夫 妇?
× × 马 × ×
×
× ×
×
a)列出所有可能的动作, 马的可能走步有8种,如上图 中的8个标记为×的格子:

A数组 2 B数组 1
1 2
-1 2
-2 1
-2 -1
-1 -2
1 -2
2 -1
? 如何表示马所走的位置是合理的

b) x,y是马原先位置的坐标, △x, △y 是A数组,B数组中的值。 如走步的目的地在棋盘内, 且格子未被访问,则走步是合理的 1≤x+△x ≤n 1 ≤y+ △y ≤n H[x+ △x][y+ △y ]=0
二、实例1 马步问题
1、问题提出 n×n的方棋盘有n2个格子,马在棋盘中初始位置的坐 标为(x0, y0),按马步走的规则,移动马并让马访问所 有格子, 且每个格子只访问一次。 2、算法思想设计 ?思考 马在某个方格,可以在一步内到达的不同位置最多有? 个。
?如何存储并表示马所走的位置呢
第五章 回溯法


一、 算法思想 二、 实例 1、马步问题 2、稳定婚姻序对问题 3、0-1背包问题 三 、 总结
6 9
10
12
( 纠 错)
2
5 8
7 11 3 12
( 尝 试) ( 回 退)
1
4
23 16 11
10 5 22
15 24 1
4 9 18
25 14 3
6 21
17 12
20 7
实例3 0-1背包问题
n=3 时 的 0-1 背 包 问 题 : w=[16,15,15], p=[45,25,25], c=30问如何装包,效益最大?
A
1 B 1 D 1 H 0 I 1 J
A
0 C 0
0
E 0 K 1 L
1
F 0
M
G
0 1
N
O
三、总结
(1)回溯法的实质是检测所有可能解,也就是穷尽所有的 可能情况,从中寻求问题的答案,因此其时间复杂度与穷 尽法一样。人工智能学应用回溯法求解时,要用启发信息、 启发函数来判断每一个可能的动作,按其函数值的大小将 所有可能的动作排成一列,换言之,把导致成功可能性大 的动作排在前边,这样很可能就得到了问题的答案。 (2)回溯法主要针对一类“求解”问题,这类问题的每个 解,一般都能分别被抽象为一个n元组(x1, x2, …,xn), 每个解通常需要满足一定的约束条件。
5 6 4 8 6 7 5 2
2 3 2 4 8 4 1 4
6 2 1 1 2 6 4 7
8 1 3 3 3 5 2 3
MW
4 8 6 5 4 3 7 6 矩阵
3 4 8 6 5 8 3 1
1 7 7 7 7 2 6 5
7 5பைடு நூலகம்5 2 1 1 8 8
MW[1.1]值为5,表示第1位男子将第1位女子作为其第5选择。
7 4 3 3 8 8 2 6
2 3 2 8 3 7 4 1
6 2 4 4 4 5 6 4
5 6 1 2 5 2 3 2
1 8 8 5 6 4 1 7
3 1 5 6 1 3 7 5
8 7 7 7 7 1 5 3
4 5 6 1 2 6 8 8
MR矩阵
MR[1,1]的值为7,表示第1位男子的第选择为第7位女子。

同样地可以由WR矩阵组成WM矩阵如下: 3 8 4 2 7 7 3 5 1 2 1 7 6 3 4 4 2 8 7 5 2 5 1 5 1 8 6 7 4 6 5 1 2 6 8
6 4 3 8 3
2
6 8
1
4 2
3
1 7
6
5 4
WM
8
2 5
7
8 6
5
3 1
4
7 3
矩阵 MW[3.4]值为6, 表示第3位女子将第4位男子作为其第6选择。

3、算法思想 第一步配成一对夫妇,即组成一个有序对,以此为问题的 部分解,以后每一步组成一个有序对,检测这个有序对如加入 到部分解中是否会引起不稳定的情况(试探),若不会引起不 稳定,则加入;若引起不稳定,则不加入(纠错),而组成并 检测另一有序对(尝试);如果尝试所有的序对,都引起不稳 定情况,则回溯到上一层,再重新试探、尝试、纠错,这样一 步步地将有序对加入到部分解中,直至得到问题的整个解,或 穷尽所有情况而无解。
记录走的步数 → H[x+ △x][y+ △y ]=i

?如何检测解的情况
c) 如果不合理,回溯检测是否有别的走法,直到解完整或者 没有解。 回溯检测需要“删去记录 H[x+ △x][y+ △y ] =0 判断”解是否完整” 检测i< n2 ,如果i= n2 ,解完整;如i≠ n2 ,解不完整 ,需要继续往下走。


(1, 7) (2, 4) (3, 3) (4, 8) (5, 5) (6, 2) (7, 6) 在第八步时,可能组成的有序对只有一个: (8, 1),但当将这一有序对加入到部分解中时第八位男子和第 六位女子会引起不稳定情况。因为 MW(8, 6)=1, MW(8, 1)=2 WM(6, 8)=4, WM(6, 7)=5 两个不等式 MW(8, 6)<MW(8, 1) 和 WM(6, 8)<WM(6, 7) 都成立. 因此这确是不稳定婚姻,故不能将这一有序对加入到部分解 中去. 但这又是此时唯一可能的一个有序对, 所以第八步失败。 可以认为是第七步中选择的有序对(7,6)导致了第八步的失败, 因此将这一有序对从部分解中删除, 则必须为第七步组成并检测 另一个有序对, 如果第七步中所有可能的有序对都导致失败, 则 须将第六步中选择的有序对从部分解中删除, 重新考虑第六步的 工作。这种方法要求删除已经得到的部分解的一部分并返回去重 做。(回溯法)
(3)求解策略
用回溯法求解问题的策略为深度优先策略。当确定(定义了) 问题的解空间的组织结构后,回溯法从开始结点(根结点)出发, 以深度优先搜索整个解空间。开始结点为活结点,同时也成为当 前的扩展结点。在当前扩展结点处,搜索向纵深方向移至一个新 结点,这个新结点成为新的活结点,并成为当前扩展结点。若在 当前扩展结点处不能再向纵深方向移动,则当前扩展结点就成为 死结点。此时,应回溯至最近的活结点处,并使这个结点成为当 前扩展结点。回溯法以这种方式递归地在解空间中搜索,直至找 到所要求的解空间中已无活结点时为止。
3、算法主要做的工作
(i)给数组A及数组B置数; (ii)H矩阵清零; (iii)H[X0,Y0] =1, 即确定马的初始位置; (iv)调用过程Tryhouse(2, x0, y0, Q); (v)如成功则打印结果,不然打印失败信息。
4、算法语言描述 Tryhouse (int i, x, y, q ) /* 马现在的位置坐标为x ,y , 这一步为第i步, q是成功标志 */ { int k, u ,v, q1 ; /* k是循环控制变量, u , v 是这一步终点的坐标。 */ k=0; q1=FALSE; do { K=K+1; U=X+A[K]; V=Y+B[K]; if ((U>0&&U<=N) && (V>0)&&(V<=N) ) if (h[u] [v]==0 ) { h[u] [v] =i; if (i<N*N ) { Tryhouse(i+1, U, V, q1); IF ( NOT q1) H[U,V]=0; } else q1=TRUE } while(q1==TRUE||k==8) ; q=q1
(4)回溯法可以用来求一个解,也可以用来求出所有的解。
4 8 6
6 5 8
2 3 1
5 1 2
8 6 3
1 7 4
3 4 7
7 2 5
3
6 2 3
2
3 1 5
4
1 3 7
7
4 8 2
6
5 7 4
8
7 4 1
5
2 6 8
1
8 5 6
7
2
8
4
5
6
3
1
WR矩阵
WR[3,4]的值为2, 表示第3位女子的第4选择为第2位男子, 余类推。
在解题过程中还需要知道某女子是某男子的第几选择, 可以由MR矩阵组成一个 MW矩阵如下:

4、整个程序要做的工作 (ⅰ)读入MR矩阵,并填充MW矩阵 (ⅱ)读入WR矩阵,并填充WM矩阵 (ⅲ)数组SINGLE置初值 (ⅳ)调用try过程 (ⅴ)如成功则调用打印过程

5、算法描述
Try(m: integer) { for (m的每个选择w) if (m与w的搭配是可行的) {将w许配给m; if (m不是M中最后一个元素) Try(m的下个元素) ; else记录改组解; 撤销m与w的搭配; /以求下一个解 } }
相关文档
最新文档