回溯法_ppt课件
合集下载
算法分析与设计回溯法ppt课件
问题求解的方法
硬性处理法
– 列出所有候选解,逐个检查是否为所需要的解 – 理论上,候选解数量有限,并且通过检查所有或部分
候选解能够得到所需解时,上述方法可行
– 实际中则很少使用,因为候选解的数量通常都非常大 (比如指数级,甚至是大数阶乘),即便采用最快的 计算机也只能解决规模较小的问题。
回溯或分枝限界法
这种以深度优先方式搜索问题的解的方法称为 回溯法
回溯法思想
第一步:为问题定义一个状态空间(state space)。这 个空间必须至少包含问题的一个解
第二步:组织状态空间以便它能被容易地搜索。典型 的组织方法是图或树
第三步:按深度优先的方法从开始结点进行搜索
– 开始结点是一个活结点(也是 E-结点:expansion node) – 如果能从当前的E-结点移动到一个新结点,那么这个新结点将
权衡:限界函数生成结点数和限界函数 本身所需的计算时间
效率分析
效率分析中应考虑的因素
– (1)—(3)与实例无关 – (4)与实例相关
有可能只生成O(n)个结点,有可能生成 几乎全部结点
最坏情况时间
– O(p(n)2n),p(n)为n的多项式 – O(q(n)n!),q(n)为n的多项式
Monte Carlo效率估计(1)
解空间
隐式约束描述了xi必须彼此相关的情况, 如0/1背包问题中的背包重量M
回溯法求解的经典问题(1) 8-皇后问题
在一个8*8棋盘上放置8个皇后,且使得每两个 之间都不能互相“攻击”,也就是使得每两个 都不能在同一行、同一列及同一条斜角线上。
8皇后问题的解可以表示为8-元组(x1,…,x8) , 其中其中xi是第i行皇后所在的列号。
回溯法求解的经典问题(2) 子集和数问题
算法设计与分析-第8章-回溯法PPT课件
{ ( ), (1), (2), (3), (1, 2), (1, 3), (2, 3), (1, 2, 3) }
(2)可能解由一个等长向量{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) }
4 34 2 2 3 4 3 4 13 1 4 24 12 12 3 3 12 1 5 7 10 12 15 17 21 23 26 28 31 33 37 39 42 44 47 49 53 55 58 60 63 65
解向量:由根结点到叶结点的路径所定义
图8.1.1-3 n=4的八皇后问题解空间树
1
1
0
2
1
0
6
9
1
0
10
13
不可行解
1
0
1
0
1
0
8
11
12
14
15
不可行解 价值=20 价值=55 价值=30 价值=25 价值=0
.
15
8.1.2 回溯法的设计思想
TSP问题搜索解空间的方法---应用目标函数剪枝
再如,对于n=4的TSP问题,其代价矩阵如图所示,
∞3 6 7 C= 12 ∞ 2 8
.
21
8.1.3 回溯法的求解过程
简言之:
1) 逐级扩展解向量 x1 ,x2 , … , xi-1
xi
2) 动态测试部分解
用 Bi (x1 , x2 ,… ,xi-1 ,xi) ---剪枝函数动态测试, 判定路径 x1 x2 … xi-1 xi 是否可行。
(2)可能解由一个等长向量{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) }
4 34 2 2 3 4 3 4 13 1 4 24 12 12 3 3 12 1 5 7 10 12 15 17 21 23 26 28 31 33 37 39 42 44 47 49 53 55 58 60 63 65
解向量:由根结点到叶结点的路径所定义
图8.1.1-3 n=4的八皇后问题解空间树
1
1
0
2
1
0
6
9
1
0
10
13
不可行解
1
0
1
0
1
0
8
11
12
14
15
不可行解 价值=20 价值=55 价值=30 价值=25 价值=0
.
15
8.1.2 回溯法的设计思想
TSP问题搜索解空间的方法---应用目标函数剪枝
再如,对于n=4的TSP问题,其代价矩阵如图所示,
∞3 6 7 C= 12 ∞ 2 8
.
21
8.1.3 回溯法的求解过程
简言之:
1) 逐级扩展解向量 x1 ,x2 , … , xi-1
xi
2) 动态测试部分解
用 Bi (x1 , x2 ,… ,xi-1 ,xi) ---剪枝函数动态测试, 判定路径 x1 x2 … xi-1 xi 是否可行。
第5章回溯法PPT课件
二、回溯的一般描述
一旦某个j元组(x1,x2,…,xj)违反D中仅涉及 x1,x2,…,xj 的一个约束,就可以肯定,以(x1, x2,…,xj)为前缀的任何n元组
(x1,x2,…,xj,xj+1,…,xn)都不会是问题P 的解。
三、回溯的一般步骤
回溯法正是针对这类问题,利用这类问题的 上述性质而提出来的比枚举法效率更高的算 法。
由于这是第一次用计算机证明数学定理,所以哈肯 和阿佩尔的工作,不仅是解决了一个难题,而且从 根本上拓展了人们对“证明”的理解,引发了数学 家从数学及哲学方面对“证明”的思考。
实例—n皇后问题
在一个n×n的棋盘上放置n个国际象棋中 的皇后,要求所有的皇后之间都不形成攻 击。请你给出所有可能的排布方案数。
n
4
5
6
7
8
总数
2
10
4
40
92
n皇后问题
对于n皇后问题而言,我们很难找出很合适的方法 来快速的得到解,因此,我们只能采取最基本的枚 举法来求解。
但我们知道,在n×n的棋盘上放置n个棋子的所有
回溯算法(一)
什么是回溯
入口回溯
▪迷宫游戏
回溯
➢什么是回溯法
回溯
▪回溯法是一个既带
有系统性又带有跳跃
性的的搜索算法
回溯
▪回溯法是以深度优先的方式系统地搜索问题 出口 的解, 它适用于解一些组合数较大的问题。
回溯(Trackback)是什么?
为什么回溯?
怎样回溯?
What
Why
How
一、回溯的概念
解问题P的最朴素的方法就是枚举法,即对E 中的所有n元组逐一地检测其是否满足D的全 部约束,显然,其计算量是相当大的。
算法回溯法PPT
回溯法是一种通过搜索所有可能的解来找出所有解的算法,如果候选解被确认不是一个解或者至少不是最后一个解,回溯算法会通过在上一步进行一些变化来丢弃该解,即“回溯”。文档首先通过农夫过河的例子,展示了如何使用回溯法解决问题,包括定义搜索空间(狼、羊、菜)和判断函数(没有农夫看管,狼会吃羊,羊会吃菜)。接着,文档通过批处理作业调度的例子,详细解释了回溯法的应用,包括输入(n个作业在两台机器上的处理时间)、输出(最优调度序列和最短完成时间)以及具体的算法步骤。其中,算法步骤包括初始化解向量、最短完成时间等参数,然后通过循环和判断来不断尝试不同的作业调度方案,直到找到最优解文档还提供了具体的算法实现代码,包括Ok函数用于判断作业是否发生冲突,以及BatchJob函数用于实现批处理作业调度的回溯算法。
最大团问题-回溯法ppt课件
G的最大团是指G中所含顶点数最多的团。
下图G中,子集{1,2}是G的大小为2的完全子图。这
个完全子图不是团,因为它被G的更大的完全子图{1,2,
5}包含。{1,2,5}是G的最大团。{1,4,5}和{2,3,5}
也是G的最大团。
1
2
3
4
5
01
问题描述
4
03 算法设计
无向图G的最大团问题可以看作是图G的顶点集V的子集选取问题。因此可 以用子集树表示问题的解空间。设当前扩展节点Z位于解空间树的第i层。在 进入左子树前,必须确认从顶点i到已入选的顶点集中每一个顶点都有边相连。 在进入右子树之前,必须确认还有足够多的可选择顶点使得算法有可能在右 子树中找到更大的团。
8
07 改进
•选择合适的搜索顺序,可以使得上界函数更有效的发挥作用。 例如在搜索之前可以将顶点按度从小到大排序。这在某种意义上 相当于给回溯法加入了启发性。 •定义Si={vi,vi+1,...,vn},依次求出Sn,Sn-1,...,S1的解。从 而得到一个更精确的上界函数,若cn+Si<=max则剪枝。同时注意 到:从Si+1到Si,如果找到一个更大的团,那么vi必然属于找到 的团,此时有Si=Si+1+1,否则Si=Si+1。因此只要max的值被更 新过,就可以确定已经找到最大值,不必再往下搜索了。
1
i=3 cn=2 bestn=0 2
i=4 tn=3
1
i=2 cn=0 bestn=3
2
2
i=3 cn=1 bestn=3
3
4
4
3
3
i=5 cn=2 bestn=0
4
4
下图G中,子集{1,2}是G的大小为2的完全子图。这
个完全子图不是团,因为它被G的更大的完全子图{1,2,
5}包含。{1,2,5}是G的最大团。{1,4,5}和{2,3,5}
也是G的最大团。
1
2
3
4
5
01
问题描述
4
03 算法设计
无向图G的最大团问题可以看作是图G的顶点集V的子集选取问题。因此可 以用子集树表示问题的解空间。设当前扩展节点Z位于解空间树的第i层。在 进入左子树前,必须确认从顶点i到已入选的顶点集中每一个顶点都有边相连。 在进入右子树之前,必须确认还有足够多的可选择顶点使得算法有可能在右 子树中找到更大的团。
8
07 改进
•选择合适的搜索顺序,可以使得上界函数更有效的发挥作用。 例如在搜索之前可以将顶点按度从小到大排序。这在某种意义上 相当于给回溯法加入了启发性。 •定义Si={vi,vi+1,...,vn},依次求出Sn,Sn-1,...,S1的解。从 而得到一个更精确的上界函数,若cn+Si<=max则剪枝。同时注意 到:从Si+1到Si,如果找到一个更大的团,那么vi必然属于找到 的团,此时有Si=Si+1+1,否则Si=Si+1。因此只要max的值被更 新过,就可以确定已经找到最大值,不必再往下搜索了。
1
i=3 cn=2 bestn=0 2
i=4 tn=3
1
i=2 cn=0 bestn=3
2
2
i=3 cn=1 bestn=3
3
4
4
3
3
i=5 cn=2 bestn=0
4
4
回溯法_ppt课件
例如 取N=3 , 问题所有可能的解为(解空间): (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1) 若取W= (16,15, 15), P= (40,25, 25), C=30 穷举法求解相当于分别计算每个可能解,再求优解 时间复杂性: O(2n)
//h(i)表示在当前扩展节点处x[t]的第i个可选值
实 现 递 归
} }
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --;
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --; 分析:
E={ (x1, x2,… xn), xi si , si为有限集 }称为问题的解空间. 约束条件 显约束:每个xi 的范围都给定的约束.满足显约束的 全体向量构成解空间. 隐约束:元组的分量间满足函数关系f(x1,...xn)
算法设计与分析 >回溯法
求解过程可表示为在一棵解空间树 作 深度优先搜索. 解空间树构造: 1. 子集树 : 当解向量为不定长 n 元组时 , 树中从根至每一结点的路径 集合构成解空间 . 树的每个结点称为一个解状态 , 有儿子的结点称为 可扩展结点,叶结点称为终止结点,若结点v对应解状态(x1, x2,… xi), 则其儿子对应扩展的解状态 (x1, x2,… xi, xi+1 ).满足所有约束条件 的解状态结点称为回答结点.0-1背包问题的解空间就是子集树 2.排序树:当解向量为定长n元组时, 树中从根至叶结点的路径的集合 构成解空间.树的每个叶结点称为一个解状态 .旅行商问题的解空间就 是排序树 搜索过程: 搜索按深度优先策略从根开始, 当搜索到任一结点时,判断该点是否 满足约束条件D(剪枝函数),满足则继续向下深度优先搜索,否则跳过 该结点以下的子树(剪枝),向上逐级回溯.
//h(i)表示在当前扩展节点处x[t]的第i个可选值
实 现 递 归
} }
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --;
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --; 分析:
E={ (x1, x2,… xn), xi si , si为有限集 }称为问题的解空间. 约束条件 显约束:每个xi 的范围都给定的约束.满足显约束的 全体向量构成解空间. 隐约束:元组的分量间满足函数关系f(x1,...xn)
算法设计与分析 >回溯法
求解过程可表示为在一棵解空间树 作 深度优先搜索. 解空间树构造: 1. 子集树 : 当解向量为不定长 n 元组时 , 树中从根至每一结点的路径 集合构成解空间 . 树的每个结点称为一个解状态 , 有儿子的结点称为 可扩展结点,叶结点称为终止结点,若结点v对应解状态(x1, x2,… xi), 则其儿子对应扩展的解状态 (x1, x2,… xi, xi+1 ).满足所有约束条件 的解状态结点称为回答结点.0-1背包问题的解空间就是子集树 2.排序树:当解向量为定长n元组时, 树中从根至叶结点的路径的集合 构成解空间.树的每个叶结点称为一个解状态 .旅行商问题的解空间就 是排序树 搜索过程: 搜索按深度优先策略从根开始, 当搜索到任一结点时,判断该点是否 满足约束条件D(剪枝函数),满足则继续向下深度优先搜索,否则跳过 该结点以下的子树(剪枝),向上逐级回溯.
回溯法ppt课件
分析:
可能解由一个等长向量(x1, x2, …, xn)组成, 其中
xi=1(1≤i≤n)表示物品i装入背包 xi=0(1≤i≤n)表示物品i没有装入背包
如:
当n=3时,其解空间是:
{ (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)}
第5章 回溯法
学习要点
5.1 回溯法概述 5.2 回溯法的典型示例 5.3 回溯法的效率分析 本章小结
1
5.1 回溯法概述
5.1.1 问题的解空间 问题的解空间 两类典型的解空间
5.1.2 回溯法的基本思想 回溯法的基本思想 算法的框架 例:排列与组合 小结
15
排列树
分析
求赋权图G的具有最小权的Hamilton圈1
1解空间30:
2
2 34
64
5 10
3 42 4 2 3
3
4
20
4
34
23
2
当起点1固定时,上图有3!个周游路线(排列问题)
16
回溯法的基本思想
回溯法
回溯法是一种选优搜索法,按选优条件向前搜 索,以达到目标。
但当探索到某一步时,发现原先选择并不优或 达不到目标,就退回一步重新选择,这种走不 通就退回再走的技术为回溯法,而满足回溯条 件的某个状态的点称为“回溯点”。
若(x1, x2,… xi xi+1)满足约束条件, 则继续添加 xi+2 ;
若所有可能的xi+1 si+1均不满足约束条件,则去 掉xi , 回溯到(x1, x2,… xi-1), 添加尚未考虑过的xi;
可能解由一个等长向量(x1, x2, …, xn)组成, 其中
xi=1(1≤i≤n)表示物品i装入背包 xi=0(1≤i≤n)表示物品i没有装入背包
如:
当n=3时,其解空间是:
{ (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)}
第5章 回溯法
学习要点
5.1 回溯法概述 5.2 回溯法的典型示例 5.3 回溯法的效率分析 本章小结
1
5.1 回溯法概述
5.1.1 问题的解空间 问题的解空间 两类典型的解空间
5.1.2 回溯法的基本思想 回溯法的基本思想 算法的框架 例:排列与组合 小结
15
排列树
分析
求赋权图G的具有最小权的Hamilton圈1
1解空间30:
2
2 34
64
5 10
3 42 4 2 3
3
4
20
4
34
23
2
当起点1固定时,上图有3!个周游路线(排列问题)
16
回溯法的基本思想
回溯法
回溯法是一种选优搜索法,按选优条件向前搜 索,以达到目标。
但当探索到某一步时,发现原先选择并不优或 达不到目标,就退回一步重新选择,这种走不 通就退回再走的技术为回溯法,而满足回溯条 件的某个状态的点称为“回溯点”。
若(x1, x2,… xi xi+1)满足约束条件, 则继续添加 xi+2 ;
若所有可能的xi+1 si+1均不满足约束条件,则去 掉xi , 回溯到(x1, x2,… xi-1), 添加尚未考虑过的xi;
第7讲-回溯法
– 解的表示:假定第i个皇后放在第i行,用4-元组 (x1,x2,…,x4)表示解,其中xi表示放置皇后i的列号。
– 显示约束:Si=(1,2,3,…4),1i4 – 隐示约束:没有两个xi(1i4)可以相同(在不同的
列上),且没有两个皇后在同一斜对角线上。
0
1
5
2
应用举例
a
b
c
f
d
e
应用回溯法求解3着色问题; 应用回溯法求解哈密顿回路问题。
两种形式的问题的解
问题的解是所搜索集合的子集,以达到某种优 化目标
问题的解是所搜索集合中元素的一个排列,以 达到某种约束要求
回溯法可以很方便地遍历一个集合的所有子集 或所有的排列
子集树
当问题是需要求n个元素的子集,以便达到某种优化
目标时,我们可以把这个解空间组织成一棵子集树。
若Si的大小为k,则有kn个子集。当n很大时,解空间 将非常巨大。
x1 第1层
S2 第2层
……
……
S1
S2 ……
……
第n层
Sn ……
子集树的回溯法伪码
Backtrack(i) 递归描述
1 if i > n then update(x)
2 else
7
×××× ×
××
1234 1
34
8
××
12
问题举例
子集和数问题:已知n+1个正整数: w1,w2,…,wn和M,要求找出wi的和数等于 M的所有子集。
– 解的表示1:用其和数为M的wi的下标来表示解向 量。则可以用k-元组(x1,x2,…,xk)来表示解,1kn。 不同的解可以是大小不同的元组。
3 for each a ∈Si do
– 显示约束:Si=(1,2,3,…4),1i4 – 隐示约束:没有两个xi(1i4)可以相同(在不同的
列上),且没有两个皇后在同一斜对角线上。
0
1
5
2
应用举例
a
b
c
f
d
e
应用回溯法求解3着色问题; 应用回溯法求解哈密顿回路问题。
两种形式的问题的解
问题的解是所搜索集合的子集,以达到某种优 化目标
问题的解是所搜索集合中元素的一个排列,以 达到某种约束要求
回溯法可以很方便地遍历一个集合的所有子集 或所有的排列
子集树
当问题是需要求n个元素的子集,以便达到某种优化
目标时,我们可以把这个解空间组织成一棵子集树。
若Si的大小为k,则有kn个子集。当n很大时,解空间 将非常巨大。
x1 第1层
S2 第2层
……
……
S1
S2 ……
……
第n层
Sn ……
子集树的回溯法伪码
Backtrack(i) 递归描述
1 if i > n then update(x)
2 else
7
×××× ×
××
1234 1
34
8
××
12
问题举例
子集和数问题:已知n+1个正整数: w1,w2,…,wn和M,要求找出wi的和数等于 M的所有子集。
– 解的表示1:用其和数为M的wi的下标来表示解向 量。则可以用k-元组(x1,x2,…,xk)来表示解,1kn。 不同的解可以是大小不同的元组。
3 for each a ∈Si do
算法设计与分析6回溯法PPT课件
n
m a x w i x i i1
n
s . t . S i x i C i1
1.解空间 x1,x2, ,xn,xi x i0,1{0 , 1 } , 1 i n
2.解空间结构树:高度为n+1的完全二叉树,结点总数为 2n1 1,左孩子为1,
右孩子为0.
2021/3/12
8
0-1背包问题的具体求解过程
1
W=(30,12,44,46,50)
1
1.令Wup=0,将物体的序号按价值体积比
2 1
排序结果是(2,1,3,4,5)
3
2.生成部分解(1,1,1,0),估计当前部分解 1
的价值为Weva=94.3,Weva>Wup
4 0
3.继续向下搜索生成结点6,得到可行解 (1,1,1,0,0),得到价值为86,更新
5 0
Wup=86
6
2021/3/12
12
实例1:0-1背包问题
4.回溯:沿右孩子回溯到左孩子4,生成 相应右孩子7,得到部分解(1,1,0,1),此时 Weva=93 5.因为Weva>Wup,继续生成结点8,9, 得到可行解(1,1,0,1,0),价值为88,更新 Wup=88
2021/3/12
0-1背包问题
问题描述:3个物W=[16,15,15] ,S=[45,25,25] ,C=30 1.定义解空间: (0,0,0),(0,0,1)…(1,1,1),含有2 n 个解。 2.确定解空间的结构(二叉树)如图 3.进行深度优先搜索
n=3时的0-1背包问题用完全二叉树表示的解空间
2021/3/12
求解过程:
1.初始化:目标函数置为0,将物品按价值体积比的非增顺序排 序
m a x w i x i i1
n
s . t . S i x i C i1
1.解空间 x1,x2, ,xn,xi x i0,1{0 , 1 } , 1 i n
2.解空间结构树:高度为n+1的完全二叉树,结点总数为 2n1 1,左孩子为1,
右孩子为0.
2021/3/12
8
0-1背包问题的具体求解过程
1
W=(30,12,44,46,50)
1
1.令Wup=0,将物体的序号按价值体积比
2 1
排序结果是(2,1,3,4,5)
3
2.生成部分解(1,1,1,0),估计当前部分解 1
的价值为Weva=94.3,Weva>Wup
4 0
3.继续向下搜索生成结点6,得到可行解 (1,1,1,0,0),得到价值为86,更新
5 0
Wup=86
6
2021/3/12
12
实例1:0-1背包问题
4.回溯:沿右孩子回溯到左孩子4,生成 相应右孩子7,得到部分解(1,1,0,1),此时 Weva=93 5.因为Weva>Wup,继续生成结点8,9, 得到可行解(1,1,0,1,0),价值为88,更新 Wup=88
2021/3/12
0-1背包问题
问题描述:3个物W=[16,15,15] ,S=[45,25,25] ,C=30 1.定义解空间: (0,0,0),(0,0,1)…(1,1,1),含有2 n 个解。 2.确定解空间的结构(二叉树)如图 3.进行深度优先搜索
n=3时的0-1背包问题用完全二叉树表示的解空间
2021/3/12
求解过程:
1.初始化:目标函数置为0,将物品按价值体积比的非增顺序排 序
算法课件(四)回溯法
以(x1,x2,…,xj)为前缀的任何n元组(x1, x2,…,xj,xj+1,…,xn)都不会是问题P的解,
因而就不必去搜索它们、检测它们。
• 回溯法正是针对这类问题,利用这类问题的上述
性质而提出来的比枚举法效率更高的算法。
生成问题状态的基本方法
扩展结点:一个正在产生儿子的结点称为扩展结点 活结点:一个自身已生成但其儿子还没有全部生成 的节点称做活结点
3. 对于问题的一个实例,解向量满足显式约束条件的
所有多元组,构成了该实例的一个解空间。
所有可能解的个数是8!
四皇后问题的解空间树
1 1 2 2 2 3 3 4 4 5 4 2 6 3 7 9 4 3 8 4 2 4 13 3 3 1 19 4 1 3 24 4 1 18 4 29 3 2 1 35 4 1 2 40 4 1 3 34 4 45 2 2 1 51 3 1 2 56 3 1 50 3 61 2 4
回溯法的一般描述
• 回溯法有“通用解题法”之称,用它可以系统地 搜索问题的所有解。
• 可用回溯法求解的问题P,通常要能表达为:对
于已知的由n元组(x1,x2,…,xn)组成的一 个状态空间E={(x1,x2,…,xn)∣xi∈Si , i=1,2,…,n} • 给定关于n元组中的一个分量的一个约束集D,称 E中满足D的全部约束条件的任一n元组为问题P的 一个解。
状态结点,以便继续往深层搜索;
• 否则跳过对以该状态结点为根的子树的搜索,而
一边逐层地向该状态结点的祖先结点回溯,一边
“杀死”其儿子结点已被搜索遍的祖先结点,直
到遇到其儿子结点未被搜索遍的祖先结点,即转 向其未被搜索的一个儿子结点继续搜索。
• 在搜索过程中,只要所激活的状态结点又满足终
因而就不必去搜索它们、检测它们。
• 回溯法正是针对这类问题,利用这类问题的上述
性质而提出来的比枚举法效率更高的算法。
生成问题状态的基本方法
扩展结点:一个正在产生儿子的结点称为扩展结点 活结点:一个自身已生成但其儿子还没有全部生成 的节点称做活结点
3. 对于问题的一个实例,解向量满足显式约束条件的
所有多元组,构成了该实例的一个解空间。
所有可能解的个数是8!
四皇后问题的解空间树
1 1 2 2 2 3 3 4 4 5 4 2 6 3 7 9 4 3 8 4 2 4 13 3 3 1 19 4 1 3 24 4 1 18 4 29 3 2 1 35 4 1 2 40 4 1 3 34 4 45 2 2 1 51 3 1 2 56 3 1 50 3 61 2 4
回溯法的一般描述
• 回溯法有“通用解题法”之称,用它可以系统地 搜索问题的所有解。
• 可用回溯法求解的问题P,通常要能表达为:对
于已知的由n元组(x1,x2,…,xn)组成的一 个状态空间E={(x1,x2,…,xn)∣xi∈Si , i=1,2,…,n} • 给定关于n元组中的一个分量的一个约束集D,称 E中满足D的全部约束条件的任一n元组为问题P的 一个解。
状态结点,以便继续往深层搜索;
• 否则跳过对以该状态结点为根的子树的搜索,而
一边逐层地向该状态结点的祖先结点回溯,一边
“杀死”其儿子结点已被搜索遍的祖先结点,直
到遇到其儿子结点未被搜索遍的祖先结点,即转 向其未被搜索的一个儿子结点继续搜索。
• 在搜索过程中,只要所激活的状态结点又满足终
算法设计与分析》-回溯ppt课件
电路板陈列问题
其中两个能够的陈列如下图,那么该 电路板陈列的密度分别是2,3
左以下图中,跨越插槽2和3,4和5,以及 插槽5和6的连线数均为2。插槽6和7之间 无跨越连线。其他插槽之间只需1条跨越 连线。
算法分析
电路板陈列问题是NP难问题,因此
NP难 问题
不大能够找到解此问题的多项式时间
算法。思索采用回溯法系统的搜索问
陈列树 解空间大小: n!
满足约束条件的解,解 空间中的一个子集
可行解
最优解
使目的函数取极值〔极 大或极小〕的可行解, 一个或少数几个
可行解和 最优解
当前扩展结点成为死结点时,应往回挪动〔回溯〕至最近的 一个活结点处,并使这个活结点成为当前的扩展结点
所搜索到的结 点不是叶结点, 且满足约束条 件和目的函数 的界,其儿子 结点还未全部 搜索终了
now[j]>0且now[j]!=total[j]。用
这个条件来计算插槽i和i+1间的连线
密度。
算法效率
在解空间陈列树的每个节点处,算法 Backtrack破费O(m)计算时间为每个儿 子节点计算密度。因此计算密度所耗费 的总计算时间为O(mn!)。另外,生成陈 列树需求O(n!)时间。每次更新当前最优 解至少使bestd减少1,而算法运转终了 时bestd>=0。因此最优解被更新的额次 数为O(m)。更新最优解需求O(mn)时间 。综上,解电路板陈列问题的回溯算法 Backtrack所需求的计算时间为O(mn!)
树的搜索, 否那么,进 逐层向其祖 入该子树, 先结点回溯 继续按深度
优先战略搜
4索
5
搜索方式
内留意:这棵解空间 树不是遍历前预先建 立的,而是隐含在遍 历过程中。 容
课件:第五章回溯法
else if (aSaisfeg(oa)o)d{)R{reeccoorrdd((i为,a)a;末); 尾标记。
if ((ai =is=gno)al) {unfinish = false; output( );}
else i{fi+(a+h; aLs.sPounssh)(L1,.P2u, s…h-,Sno,n-s1()a;)}
启发式的搜索 从初始状态开始,每次选择最有可能达到终 止状态的结点进行搜索。
2021/11/25
计算机算法设计与分析
5
三种搜索的优劣之处
• 一般来说,三种搜索方法各有优劣之处:
• 广度优先搜索的优点是一定能找到解;缺点是 空间复杂性和时间复杂性都大。
• 深度优先搜索的优点是空间复杂性和时间复杂 性较小;缺点是不一定能找到解。
• 栈中的结点是分层次的,而现在没有区分它们 的层次。这就增加了回溯判断和操作的困难。
那采么用怎一么个办简?洁有效的方法:设计一个末 尾标记,每次压栈时,先压入末尾标记。
2021/11/25
计算机算法设计与分析
12
用末尾标记的迭代回溯
• Backtrack(Tree T) { • unfinish = true; L.Push(T.root); • while (unfinish || L≠Φ) { • a = L.Pop( ); • if (a is the last mark) backastep( );
• a = L.Pop( );
• if (a == -1) {i– –; a = rec[i]; rec[i]=0;used[a]=0;}
• else if (used[a]==0)
•
{rec[i]=a; used[a]=1;
第5章 回溯法ppt课件
2x3=2
x3=4 x3=2 x3=3
3
5
x4=4 x4=3
8 x4=4
10 13 15 x4=2 x4=3 x4=2
4
6
9
11 14 16
迷宫问题
演示
5.1 回溯法的算法框架
问题的解空间〔1)
1. 解向量:问题的解用向量表示
(x1, x2, …, xk) 模。 2. 约束条件
子树; 5. (2)限界函数:某个函数表达式或关系式。 6. 不真时,用于剪去得不到最优解的子树。 7. 回溯法:具有限界函数的深度优先搜索方法
回溯法的基本思想
1. 以深度优先方式搜索解空间。 2. 开始时,根结点为活结点,也是当前的扩展结点。 3. 对扩展结点,寻找儿子结点: 4. 如找到新结点,新结点成为活结点并成为扩展
子集树 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);
} }
排列树 void backtrack (int t){
if (t>n) output(x); else
1装载问题2批处理作业调度3n后问题401背包问题5最大团问题6图的m着色问题7旅行售货员问题n皇后问题国际象棋中的皇后在横向直向和斜向都能走步和吃子问在nn格的棋盘上如何摆上n个皇后而使她们都不能相互吃掉
第5章 回溯法
上海大学计算机学院
学习要点与要求
• 掌握与理解回溯法的DFS搜索策略与方法
• (1〕掌握递归回溯
第五章 回溯法 TraceBackingppt模板.ppt
启发式搜索
利用一些启发信息,提前判断出先搜索哪些状态可能尽 快找到问题的解或某些情况不可能取到最优解,从而可以提 前舍弃对这些状态的尝试。即考虑给定问题的特有性质,选 用合适的细则,提高搜索的效率。
2019/8/28
西安邮电学院
6
3。回溯法的基本思想
在确定了解空间的组织结构后,回溯从开始节点(根 结点)出发,以深度优先的方式搜索整个解空间。这个开 始节点成为一个活节点,同时成为党建的扩展节点。在当 前的扩展节点,搜索向深度方向进入一个新的节点。这个 新节点成为一个新的活节点,并成为当前的扩展节点。若 在当前扩展节点处不能再向深度方向移动,则当前的扩展 节点成为死节点,即该活节点成为死节点。此时回溯到最 近的一个活节点处,并使得这个活节点成为当前的扩展节 点。
当所给的问题是从n个元素的集合S中找出满足某种性质
的子集时,相应的解空间树为子集树。例如0-1背包问题。
该类子集树有2**n个叶节点。
2019/8/28
西安邮电学院
13
(2)排列树
当要求解的问题需要在n 元素的排列中搜索问题的解时, 解空间树被称作排列树(permutation tree)。 搜索空间为:
在定义了问题解空间后,还应该将解空间很好的组织 起来,使得我们的搜索比较的方便。在回溯法中,通常我 们将解空间组织成树或图的形式,特别地对于许多的离散 问题,解空间都可以组织成树的形式。
如上面的解空间可以用一个如下的二叉树表示。
2019/8/28
西安邮电学院
3
2019/8/28
图5-3 0-1背包问题的解空间树
回溯法适用范围: 组合数较大的问题
2019/8/28
西安邮电学院
2
5.1 回溯法的算法框架
利用一些启发信息,提前判断出先搜索哪些状态可能尽 快找到问题的解或某些情况不可能取到最优解,从而可以提 前舍弃对这些状态的尝试。即考虑给定问题的特有性质,选 用合适的细则,提高搜索的效率。
2019/8/28
西安邮电学院
6
3。回溯法的基本思想
在确定了解空间的组织结构后,回溯从开始节点(根 结点)出发,以深度优先的方式搜索整个解空间。这个开 始节点成为一个活节点,同时成为党建的扩展节点。在当 前的扩展节点,搜索向深度方向进入一个新的节点。这个 新节点成为一个新的活节点,并成为当前的扩展节点。若 在当前扩展节点处不能再向深度方向移动,则当前的扩展 节点成为死节点,即该活节点成为死节点。此时回溯到最 近的一个活节点处,并使得这个活节点成为当前的扩展节 点。
当所给的问题是从n个元素的集合S中找出满足某种性质
的子集时,相应的解空间树为子集树。例如0-1背包问题。
该类子集树有2**n个叶节点。
2019/8/28
西安邮电学院
13
(2)排列树
当要求解的问题需要在n 元素的排列中搜索问题的解时, 解空间树被称作排列树(permutation tree)。 搜索空间为:
在定义了问题解空间后,还应该将解空间很好的组织 起来,使得我们的搜索比较的方便。在回溯法中,通常我 们将解空间组织成树或图的形式,特别地对于许多的离散 问题,解空间都可以组织成树的形式。
如上面的解空间可以用一个如下的二叉树表示。
2019/8/28
西安邮电学院
3
2019/8/28
图5-3 0-1背包问题的解空间树
回溯法适用范围: 组合数较大的问题
2019/8/28
西安邮电学院
2
5.1 回溯法的算法框架
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//h(i)表示在当前扩展节点处x[t]的第i个可选值
实 现 递 归
} }
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --;
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --; 分析:
算法设计与分析 >回溯法
5、回溯法解题步骤: 1).针对所给问题,定义问题的解空间 2).确定解空间结构. 3).以深度优先方式搜索解空间.
算法模式 Procedure BACKTRACK(n); {k:=l; repeat if TK (x1,x2,...xK-1 )中的值未取遍 then { xK:=TK (x1,x2,..., x K-1 )中未取过的一个值; if BK (x1, x2, ..., x K) then //状态结点(x1,...xk)被激活 if k=n then output(x1, x2, ..., xk) //输出度优先 e1se k:=k-l; //回溯 until k=0; end;{BACKTRACK}
if (Constraint(t)&&Bound(t) ) Backtrack(t + 1); if语句含义:Constraint(t)和Bound(t)表示当前扩展 节点处的约束函数和限界函数。 Constraint(t): 返回值为true时,在当前扩展节点处 x[1:t]的取值问题的约束条件,否则不满足问题的约束条 件,可剪去相应的子树 Bound(t): 返回的值为true时,在当前扩展节点处 x[1:t]的取值为时目标函数越界,还需由Backtrack(t+1) 对其相应的子树做进一步搜索。否则,当前扩展节点处 x[1:t]的取值是目标函数越界,可剪去相应的子树 for循环作用:搜索遍当前扩展的所有未搜索过的 子树。 递归出口:Backtrack(t)执行完毕,返回t-1层继续 执行,对还没有测试过的x[t-1]的值继续搜索。当t=1时, 若以测试完x[1]的所有可选值,外层调用就全部结束。
旅行是包含所有顶点的一个循环,故可以把任意一个点作 为起点(因此也是终点)。针对该问题,任意选取点 1作为起点和 终点,则每一个旅行可用顶点序列1, v2 ,⋯, vn , 1来描述,v2, ⋯, vn 是(2, 3, ⋯, n) 的一个排列。可能的旅行可用一个树来描 述,其中每一个从根到叶的路径定义了一个旅行。下图给出了一 棵表示四顶点网络的树。从根到叶的路径中各边的标号定义了一 个旅行(还要附加1作为终点)。例如,到节点L的路径表示了旅 行1 , 2 , 3 , 4 , 1,而到节点O的路径表示了旅行1 , 3 , 4 , 2 , 1。网络中的每一个旅行都由树中的一条从根到叶的确定路径 来表示。因此,树中叶的数目为(n- 1 )!。
例如 取N=3 , 问题所有可能的解为(解空间): (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1) 若取W= (16,15, 15), P= (40,25, 25), C=30 穷举法求解相当于分别计算每个可能解,再求优解 时间复杂性: O(2n)
算法设计与分析 >回溯法
6、递归回溯
调用一次Backtrack(1)即可完成整个回溯搜索过程 void Backtrack(int t) { if (t > n) //t表示深度,t〉n表示算法以搜索到叶节点。 Output(x);//记录或输出得到的可行解x。 else for (int i = f(n,t);i <=g(n,t) ;i ++) //f(n,t)和g(n,t)表示当前扩展节点处为搜索过的子树 //的起始编号和终止编号 { x[t] = h(i); //h(i)表示在当前扩展节点处x[t]的第i个可选值 if (Constraint(t)&&Bound(t) ) Backtrack(t + 1);//递归到下一层看是否有可行解 } }
0-1背包问题解空间树 例如 取N=3 , 问题所有可能的解为(解空间): (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1) 可表示为一棵3层的完全正则二叉树 求解过程相当于在树中搜索 满足条件的叶结点.
回溯算法将用深度优先方式从根节点开始,通过搜索解空间 树发现一个最小耗费的旅行。对题中网络,利用前页的解空间树, 一个可能的搜索为A B C F L。在L点,旅行1 , 2 , 3 , 4 , 1作为当 前最好的旅行被记录下来。它的耗费是 5 9。从L点回溯到活节点F。 由于F没有未被检查的孩子,所以它成为死节点,回溯到 C点。C变 为E-节点,向前移动到G,然后是M。这样构造出了旅行1 , 2 , 4 , 3 , 1,它的耗费是6 6。既然它不比当前的最佳旅行好,抛弃它并回 溯到G,然后是C , B。从B点,搜索向前移动到D,然后是H , N。 这个旅行1 , 3 , 2 , 4 , 1的耗费是2 5,比当前的最佳旅行好,把它作 为当前的最好旅行。 从N点,搜索回溯到H,然后是 D。在D点,再次向前移动,到 达O点。如此继续下去,可搜 索完整个树,得出1 , 3 , 2 , 4 , 1是最少耗费的旅行。
7、迭代回溯
void IterativeBacktrack(void) { int t = 1; while (t > 0) { if (f(n,t) < = g(n,t)) for (int i = f(n,t);i < = g(n,t);i ++) //f(n,t)和g(n,t)表示当前扩展节点处未搜索过的子树 //的起始编号和终止编号 { x[t] = h(i);
E={ (x1, x2,… xn), xi si , si为有限集 }称为问题的解空间. 约束条件 显约束:每个xi 的范围都给定的约束.满足显约束的 全体向量构成解空间. 隐约束:元组的分量间满足函数关系f(x1,...xn)
算法设计与分析 >回溯法
求解过程可表示为在一棵解空间树 作 深度优先搜索. 解空间树构造: 1. 子集树 : 当解向量为不定长 n 元组时 , 树中从根至每一结点的路径 集合构成解空间 . 树的每个结点称为一个解状态 , 有儿子的结点称为 可扩展结点,叶结点称为终止结点,若结点v对应解状态(x1, x2,… xi), 则其儿子对应扩展的解状态 (x1, x2,… xi, xi+1 ).满足所有约束条件 的解状态结点称为回答结点.0-1背包问题的解空间就是子集树 2.排序树:当解向量为定长n元组时, 树中从根至叶结点的路径的集合 构成解空间.树的每个叶结点称为一个解状态 .旅行商问题的解空间就 是排序树 搜索过程: 搜索按深度优先策略从根开始, 当搜索到任一结点时,判断该点是否 满足约束条件D(剪枝函数),满足则继续向下深度优先搜索,否则跳过 该结点以下的子树(剪枝),向上逐级回溯.
2、穷举法改进 对于某些组合难题的较大实例,我们可以用穷举法求解, 但穷举法的规模较大,所以我们对它进行改进,提出了回溯法和 分支界限法两种算法设计技术。 它们每次只构造候选解的一个分量,然后评估这个部分 构造解:如果加上剩下的分量也不可能求得一个解,就绝不会生 成剩下的分量。 他们是一构造一棵解空间树为基础的,树的节点反映了 对一个部分解做出的特定选择,如果可以保证,节点子孙所对应 的选择不可能得出问题的一个结,两种技术都回立即停止处理这 个节点。 两种技术的区别在于他们能处理的问题类型不同,分支 界限法只能应用于最优问题,而回溯法可以搜索任何问题的所有 解和任一解。
4、形式化描述
设问题的解可表示为n元组(x1, x2,… xn), xisi , si为有限 集,n元组的子组(x1, x2,… xi) i<n 应满足一定的约束条件D. 设已 有满足约束条件的部分解(x1, x2,… xi), 添加xi+1 si+1,若(x1, x2, …xi ,xi+1 )满足约束条件, 则继续添加xi+2 ; 若所有可能的xi+1 si+1 均不满足约束条件,则去掉xi , 回溯到(x1, x2,… xi-1), 添加尚未考 虑过的xi , 如此反复进行,直到(x1, x2,… xk) kn满足所有的约束 条件或证明无解.
第五章. 回溯法 (Back traiking)
1、穷举法应用:有限离散问题总可以用穷举法求得问题的全部 例 题 0-1背包问题(0-1Knapsack Problem ) 设有n个物体和一个背包,物体i的重量为wi价值为pi背包的载荷为M, 若将物体i(1 i n,)装入背包,则有价值为pi . 目标是找到一个方案,使得能放入背包的物体总价值最高
回溯法举例: 若取W= (16,15, 15), P= (40,25, 25), C=30
回溯法举例: [旅行商问题] 在这个问题中,给出一个n 顶点网络(有向 或无向),要求找出一个包含所有n 个顶点的具有最小耗 费的环路。任何一个包含网络中所有n 个顶点的环路被称 作一个旅行(t o u r)。在旅行商问题中,要设法找到一 条最小耗费的旅行。 [分析]图给出了一个四顶点网络。在这个网络中,一些旅 行如下: 1 , 2 , 4 , 3 , 1;1 , 3 , 2 , 4 , 1和1 , 4 , 3 , 2 , 1。 旅行1 , 2 , 4 , 3 , 1的耗费为6 6;而1 , 3 , 2 , 4 , 1的耗费 为2 5;1 , 4 , 3 , 2 , 1为5 9。故1 , 3 , 2 , 4 , 1是该网络 中最小耗费的旅行。
实 现 递 归
} }
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --;
if (Constraint(t) &&Bound(t) ) { if (Solution(t)) Output(x); else t ++; } else t --; 分析:
算法设计与分析 >回溯法
5、回溯法解题步骤: 1).针对所给问题,定义问题的解空间 2).确定解空间结构. 3).以深度优先方式搜索解空间.
算法模式 Procedure BACKTRACK(n); {k:=l; repeat if TK (x1,x2,...xK-1 )中的值未取遍 then { xK:=TK (x1,x2,..., x K-1 )中未取过的一个值; if BK (x1, x2, ..., x K) then //状态结点(x1,...xk)被激活 if k=n then output(x1, x2, ..., xk) //输出度优先 e1se k:=k-l; //回溯 until k=0; end;{BACKTRACK}
if (Constraint(t)&&Bound(t) ) Backtrack(t + 1); if语句含义:Constraint(t)和Bound(t)表示当前扩展 节点处的约束函数和限界函数。 Constraint(t): 返回值为true时,在当前扩展节点处 x[1:t]的取值问题的约束条件,否则不满足问题的约束条 件,可剪去相应的子树 Bound(t): 返回的值为true时,在当前扩展节点处 x[1:t]的取值为时目标函数越界,还需由Backtrack(t+1) 对其相应的子树做进一步搜索。否则,当前扩展节点处 x[1:t]的取值是目标函数越界,可剪去相应的子树 for循环作用:搜索遍当前扩展的所有未搜索过的 子树。 递归出口:Backtrack(t)执行完毕,返回t-1层继续 执行,对还没有测试过的x[t-1]的值继续搜索。当t=1时, 若以测试完x[1]的所有可选值,外层调用就全部结束。
旅行是包含所有顶点的一个循环,故可以把任意一个点作 为起点(因此也是终点)。针对该问题,任意选取点 1作为起点和 终点,则每一个旅行可用顶点序列1, v2 ,⋯, vn , 1来描述,v2, ⋯, vn 是(2, 3, ⋯, n) 的一个排列。可能的旅行可用一个树来描 述,其中每一个从根到叶的路径定义了一个旅行。下图给出了一 棵表示四顶点网络的树。从根到叶的路径中各边的标号定义了一 个旅行(还要附加1作为终点)。例如,到节点L的路径表示了旅 行1 , 2 , 3 , 4 , 1,而到节点O的路径表示了旅行1 , 3 , 4 , 2 , 1。网络中的每一个旅行都由树中的一条从根到叶的确定路径 来表示。因此,树中叶的数目为(n- 1 )!。
例如 取N=3 , 问题所有可能的解为(解空间): (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1) 若取W= (16,15, 15), P= (40,25, 25), C=30 穷举法求解相当于分别计算每个可能解,再求优解 时间复杂性: O(2n)
算法设计与分析 >回溯法
6、递归回溯
调用一次Backtrack(1)即可完成整个回溯搜索过程 void Backtrack(int t) { if (t > n) //t表示深度,t〉n表示算法以搜索到叶节点。 Output(x);//记录或输出得到的可行解x。 else for (int i = f(n,t);i <=g(n,t) ;i ++) //f(n,t)和g(n,t)表示当前扩展节点处为搜索过的子树 //的起始编号和终止编号 { x[t] = h(i); //h(i)表示在当前扩展节点处x[t]的第i个可选值 if (Constraint(t)&&Bound(t) ) Backtrack(t + 1);//递归到下一层看是否有可行解 } }
0-1背包问题解空间树 例如 取N=3 , 问题所有可能的解为(解空间): (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1) 可表示为一棵3层的完全正则二叉树 求解过程相当于在树中搜索 满足条件的叶结点.
回溯算法将用深度优先方式从根节点开始,通过搜索解空间 树发现一个最小耗费的旅行。对题中网络,利用前页的解空间树, 一个可能的搜索为A B C F L。在L点,旅行1 , 2 , 3 , 4 , 1作为当 前最好的旅行被记录下来。它的耗费是 5 9。从L点回溯到活节点F。 由于F没有未被检查的孩子,所以它成为死节点,回溯到 C点。C变 为E-节点,向前移动到G,然后是M。这样构造出了旅行1 , 2 , 4 , 3 , 1,它的耗费是6 6。既然它不比当前的最佳旅行好,抛弃它并回 溯到G,然后是C , B。从B点,搜索向前移动到D,然后是H , N。 这个旅行1 , 3 , 2 , 4 , 1的耗费是2 5,比当前的最佳旅行好,把它作 为当前的最好旅行。 从N点,搜索回溯到H,然后是 D。在D点,再次向前移动,到 达O点。如此继续下去,可搜 索完整个树,得出1 , 3 , 2 , 4 , 1是最少耗费的旅行。
7、迭代回溯
void IterativeBacktrack(void) { int t = 1; while (t > 0) { if (f(n,t) < = g(n,t)) for (int i = f(n,t);i < = g(n,t);i ++) //f(n,t)和g(n,t)表示当前扩展节点处未搜索过的子树 //的起始编号和终止编号 { x[t] = h(i);
E={ (x1, x2,… xn), xi si , si为有限集 }称为问题的解空间. 约束条件 显约束:每个xi 的范围都给定的约束.满足显约束的 全体向量构成解空间. 隐约束:元组的分量间满足函数关系f(x1,...xn)
算法设计与分析 >回溯法
求解过程可表示为在一棵解空间树 作 深度优先搜索. 解空间树构造: 1. 子集树 : 当解向量为不定长 n 元组时 , 树中从根至每一结点的路径 集合构成解空间 . 树的每个结点称为一个解状态 , 有儿子的结点称为 可扩展结点,叶结点称为终止结点,若结点v对应解状态(x1, x2,… xi), 则其儿子对应扩展的解状态 (x1, x2,… xi, xi+1 ).满足所有约束条件 的解状态结点称为回答结点.0-1背包问题的解空间就是子集树 2.排序树:当解向量为定长n元组时, 树中从根至叶结点的路径的集合 构成解空间.树的每个叶结点称为一个解状态 .旅行商问题的解空间就 是排序树 搜索过程: 搜索按深度优先策略从根开始, 当搜索到任一结点时,判断该点是否 满足约束条件D(剪枝函数),满足则继续向下深度优先搜索,否则跳过 该结点以下的子树(剪枝),向上逐级回溯.
2、穷举法改进 对于某些组合难题的较大实例,我们可以用穷举法求解, 但穷举法的规模较大,所以我们对它进行改进,提出了回溯法和 分支界限法两种算法设计技术。 它们每次只构造候选解的一个分量,然后评估这个部分 构造解:如果加上剩下的分量也不可能求得一个解,就绝不会生 成剩下的分量。 他们是一构造一棵解空间树为基础的,树的节点反映了 对一个部分解做出的特定选择,如果可以保证,节点子孙所对应 的选择不可能得出问题的一个结,两种技术都回立即停止处理这 个节点。 两种技术的区别在于他们能处理的问题类型不同,分支 界限法只能应用于最优问题,而回溯法可以搜索任何问题的所有 解和任一解。
4、形式化描述
设问题的解可表示为n元组(x1, x2,… xn), xisi , si为有限 集,n元组的子组(x1, x2,… xi) i<n 应满足一定的约束条件D. 设已 有满足约束条件的部分解(x1, x2,… xi), 添加xi+1 si+1,若(x1, x2, …xi ,xi+1 )满足约束条件, 则继续添加xi+2 ; 若所有可能的xi+1 si+1 均不满足约束条件,则去掉xi , 回溯到(x1, x2,… xi-1), 添加尚未考 虑过的xi , 如此反复进行,直到(x1, x2,… xk) kn满足所有的约束 条件或证明无解.
第五章. 回溯法 (Back traiking)
1、穷举法应用:有限离散问题总可以用穷举法求得问题的全部 例 题 0-1背包问题(0-1Knapsack Problem ) 设有n个物体和一个背包,物体i的重量为wi价值为pi背包的载荷为M, 若将物体i(1 i n,)装入背包,则有价值为pi . 目标是找到一个方案,使得能放入背包的物体总价值最高
回溯法举例: 若取W= (16,15, 15), P= (40,25, 25), C=30
回溯法举例: [旅行商问题] 在这个问题中,给出一个n 顶点网络(有向 或无向),要求找出一个包含所有n 个顶点的具有最小耗 费的环路。任何一个包含网络中所有n 个顶点的环路被称 作一个旅行(t o u r)。在旅行商问题中,要设法找到一 条最小耗费的旅行。 [分析]图给出了一个四顶点网络。在这个网络中,一些旅 行如下: 1 , 2 , 4 , 3 , 1;1 , 3 , 2 , 4 , 1和1 , 4 , 3 , 2 , 1。 旅行1 , 2 , 4 , 3 , 1的耗费为6 6;而1 , 3 , 2 , 4 , 1的耗费 为2 5;1 , 4 , 3 , 2 , 1为5 9。故1 , 3 , 2 , 4 , 1是该网络 中最小耗费的旅行。