扩展结点 1 得新结点 2、3、4、5
活结点 2、3、4、5 入队
扩展结点 2 得新结点 6、7、8
利用限界函数杀死结点 6
活结点 7、8 入队
扩展结点 3 得新结点 9、10、11
利用限界函数杀死结点 9、10
活结点 11 入队
扩展结点 4 得新结点 12、13、14
利用限界函数杀死结点 13、14
活结点 12 入队
扩展结点 5 得新结点 15、16、17,利用限界函数杀死结点 17
活结点 15、16 入队
扩展结点 7 得新结点 18、19,利用限界函数杀死结点 18、19
扩展结点 8 得新结点 20、21,利用限界函数杀死结点 21
活结点 20 入队
扩展结点 11 得新结点 22、23,利用限界函数杀死结点 23
活结点 22 入队
扩展结点 12 得新结点 24、25,利用限界函数杀死结点 24
活结点 25 入队
扩展结点 15 得新结点 26、27,利用限界函数杀死结点 26
活结点 27 入队
扩展结点 16 得新结点 28、29,利用限界函数杀死结点 28、29
扩展结点 20 得新结点 30,利用限界函数杀死结点 30
扩展结点 22 得答案结点 31,对应元组为$(2,4,1,3)$
扩展结点 25 得答案结点 32,对于元组为$(3,1,4,2)$
扩展结点 27 得新结点 33,利用限界函数杀死结点 33
队列为空,再无可扩展活结点,算法停止,两个解均已找到
扩展结点 1 得新结点 2、3、4、5
活结点 2、3、4、5 入栈
扩展结点 5 得新结点 6、7、8
用限界函数杀死结点 8
活结点 6、7 入栈
扩展结点 7 得新结点 9、10,用限界函数杀死结点 9、10
扩展结点 6 得新结点 11、12,用限界函数杀死结点 11
活结点 12 入栈
扩展结点 12 得新结点 13,用限界函数杀死结点 13
扩展结点 4 得新结点 14、15、16,用限界函数杀死结点 15、16
活结点 14 入栈
扩展结点 14 得新结点 17、18,用限界函数杀死结点 17
活结点 18 入栈
扩展结点 18 得答案结点 19,对应元组为$(3,1,4,2)$
另一个解$(2,4,1,3)$可从结点 3 继续扩展得到
$4$个任务分派给$4$个人,每个任务恰只分派给一个人
每个任务分派给每个人的成本见下表,求成本最小的分派方案
|
任务 1 |
任务 2 |
任务 3 |
任务 4 |
人员 1 |
9 |
2 |
7 |
8 |
人员 2 |
6 |
4 |
3 |
7 |
人员 3 |
5 |
8 |
1 |
8 |
人员 4 |
7 |
6 |
9 |
4 |
解的形式:$(x_1, x_2, x_3, x_4)$,其中$x_i$表示人员$i$被分派的任务
显式条件:$x_i \in \{1,2,3,4\}$,隐式条件:解是$\{1,2,3,4\}$的置换
|
任务 1 |
任务 2 |
任务 3 |
任务 4 |
人员 1 |
9 |
2 |
7 |
8 |
人员 2 |
6 |
4 |
3 |
7 |
人员 3 |
5 |
8 |
1 |
8 |
人员 4 |
7 |
6 |
9 |
4 |
对任一确定了部分分量的解
- 上界:已分派任务的成本和 + 与已分派任务不冲突的主对角线的和
- 下界:已分派任务的成本和 + 与已分派任务不冲突的每行最小值的和
例如,若给人员 1 分派任务 3
- 成本上界 = 7 + 6 + 8 + 4 = 25
- 成本下界 = 7 + 4 + 5 + 4 = 20
9 |
2 |
7 |
8 |
6 |
4 |
3 |
7 |
5 |
8 |
1 |
8 |
7 |
6 |
9 |
4 |
分派 (2, -, -, -) 的成本上界 13 就可以剪枝同层其它所有结点
分派 (2, 1, -, -) 同理,上下界吻合,就是最优解
设背包承重量为 10,各物品价值如下,求可装包最大价值子集
|
物品 1 |
物品 2 |
物品 3 |
物品 4 |
重量 |
4 |
7 |
5 |
3 |
价值 |
40 |
42 |
25 |
12 |
单价 |
10 |
6 |
5 |
4 |
解的形式:$(x_1, x_2, x_3, x_4)$,其中$x_i$表示是否选择该物品
显式条件:$x_i \in \{1,0\}$
隐式条件:$4 x_1 + 7 x_2 + 5 x_3 + 3 x_4 \le 10$
|
物品 1 |
物品 2 |
物品 3 |
物品 4 |
重量 |
4 |
7 |
5 |
3 |
价值 |
40 |
42 |
25 |
12 |
单价 |
10 |
6 |
5 |
4 |
对任一确定了部分分量的解
- 上界:已选物品总价值 + 剩余承重量采用单价最大的物品的总价值
- 下界:已选物品总价值
例如:若选了物品 1
- 价值上界 = 40 + 6 × 6 = 76
- 价值下界 = 40
|
物品 1 |
物品 2 |
物品 3 |
物品 4 |
重量 |
4 |
7 |
5 |
3 |
价值 |
40 |
42 |
25 |
12 |
单价 |
10 |
6 |
5 |
4 |
部分解 (1, 0, 1, -) 下界 65,可剪枝上界为 60、64 的两个活结点
有$n$个作业和一台处理机,作业$i$对应一个三元组$(p_i, d_i, t_i)$
- $t_i$:表示作业$i$需要$t_i$个单位处理时间
- $d_i$:表示完成期限
- $p_i$:表示作业$i$在期限内未完成导致的罚款
目标:从$n$个作业的集合中选取子集$\Jcal$,要求$\Jcal$中所有作业都能在各自期限内完成,并且不在$\Jcal$中的作业导致的罚款总额最小
解的形式和子集和数问题一样
- 定长元组:$n$层二叉树
- 变长递增元组:$2^n$个结点
$$
\begin{align*}
\quad n = 4, ~ & (p_1, d_1, t_1) = (5,1,1), ~ (p_2, d_2, t_2) = (10,3,2) \\
& (p_3, d_3, t_3) = (6,2,1), ~ (p_4, d_4, t_4) = (3,1,1)
\end{align*}
$$
设$\Scal_X$是考察结点$X$时已选择的作业集合
令$m = \max \{ i \mid i \in \Scal_X \}$
- 下界$l = \sum_{i < m, i \not \in \Scal_X} p_i$,已经被考虑过但没被选择的作业的罚款之和
- 上界$u = \sum_{i \not \in \Scal_X} p_i$,把还没考虑到的作业的罚款也全部算上
$$
\begin{align*}
\quad n = 4, ~ & (p_1, d_1, t_1) = (5,1,1), ~ (p_2, d_2, t_2) = (10,3,2) \\
& (p_3, d_3, t_3) = (6,2,1), ~ (p_4, d_4, t_4) = (3,1,1)
\end{align*}
$$
对最优化问题,估计的上下界可自然地用来选择下一个 E-结点
对非优化问题如 4-皇后,结点 22 离答案结点 31 仅一步之遥,却又向右兜了个大圈子,“智能”的选择下一个 E-结点的方法?
分支限界中,估计的界能体现从该结点得到最优解的可能性
对非优化问题,没有现成的界可用,没有条件就创造条件
构造一个结点成本函数$c(X)$衡量从根结点搜索到$X$并在$X$之下搜索到一个答案结点所需的成本:
- 若$X$是答案结点,则$c(X)$是从根结点到$X$的搜索成本
- 若$X$不是答案结点且子树$X$上不含任何答案结点,则$c(X) = \infty$
- 若$X$不是答案结点但子树$X$上包含答案结点,则$c(X)$等于子树$X$上具有最小搜索成本的答案结点的成本
如何定义搜索成本?
- 在生成一个答案结点之前需要生成的总结点数
- 到最近的答案结点的路径长度
答案结点为 31、32,故若通过路径长度定义的搜索成本
$X$ |
1 |
3 |
11 |
22 |
31 |
4 |
12 |
25 |
32 |
其它 |
$c(X)$ |
4 |
4 |
4 |
4 |
4 |
4 |
4 |
4 |
4 |
∞ |
如果有$c(X)$指引每步扩展哪个 E-结点就完美了
但计算$c(X)$的复杂度与求解原问题是相同的
结点$X$的成本可以分为两部分:$c(X) = f(X) + g(X)$
- $f(X)$是根结点到结点$X$的成本,已发生成本,是确定的
- $g(X)$是由$X$到达一个答案结点所需的成本,是未知的
结点成本估计函数$\hat{c}(X) = f(X) + \hat{g}(X)$,其中$\hat{g}(X)$是对$g(X)$的估计,根据$\hat{c}(X)$选择 E-结点称为最小成本 (least cost, LC) 搜索
- 若$\hat{g}(X) = 0$,退化为采用队列的分支限界法
- 若$f(X) = 0$,退化为采用栈的分支限界法,因为若$Y$是$X$的子结点,则有$\hat{g}(Y) \le \hat{g}(X)$
问题描述:通过合法移动,将左边的棋盘变成右边的状态
合法移动:每次将一个邻接于空格的牌移动到空格位置
|
|
|
|
|
|
|
|
|
|
|
1 |
2 |
3 |
4 |
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
|
8 |
|
$\Longrightarrow$ |
|
5 |
6 |
7 |
8 |
9 |
10 |
7 |
11 |
|
|
|
9 |
10 |
11 |
12 |
13 |
14 |
15 |
12 |
|
|
|
13 |
14 |
15 |
|
目标状态是否可由初始状态到达?
记$p(i)$为编号$i$的牌在初始状态中的位置,$p(16)$为空格的位置
记$l(i)$为编号小于$i$但位置在$i$之后的牌的数目
引入变量$q$,若空格初始在深色格上,$q=1$,否则$q=0$
当且仅当$\sum_{i=1}^{16} l(i) + q$为偶数时,目标状态可达
|
|
|
|
|
|
|
|
|
|
1 |
2 |
3 |
4 |
|
|
1 |
2 |
3 |
4 |
5 |
6 |
|
8 |
|
|
5 |
6 |
7 |
8 |
9 |
10 |
7 |
11 |
|
|
9 |
10 |
11 |
12 |
13 |
14 |
15 |
12 |
|
|
13 |
14 |
15 |
|
|
|
|
|
|
|
|
|
|
|
1 |
2 |
a |
b |
|
|
1 |
2 |
3 |
4 |
c |
d |
|
e |
|
|
5 |
6 |
7 |
8 |
f |
g |
h |
11 |
|
|
9 |
10 |
11 |
12 |
13 |
14 |
15 |
12 |
|
|
13 |
14 |
15 |
|
空格每次移动,$q$变化$1$,下面证明$\sum_{i=1}^{16} l(i)$的变化量是奇数
空格左/右移:$l(16)$增大/减小$1$,其它不变
空格上移:$l(16)$增大$4$,下证$l(a),\ldots,l(d)$的总变化量为奇数
- 对$a$、$b$,若$a < b$,则$l(b)$增大$1$,若$a > b$,则$l(a)$减小$1$
- 对$a$、$c$和$a$、$d$同理,每一对的$l(\cdot)$值的变化量为$1$,总变化量为奇数
空格下移:$l(16)$减小$4$,$l(e),\ldots,l(h)$的总变化量为奇数
若对$\forall X,Y: c(X) < c(Y) \rightarrow \hat{c}(X) < \hat{c}(Y)$,则 LC-搜索能找到最小成本 (离根结点最近、空格移动次数最少) 的答案结点
反设$a$、$b$都是答案结点,$c(a) < c(b)$,但 LC-搜索最后搜到了$b$
记$a$、$b$的最近公共祖先为$R$,根据定义
$c(R) = c(a_i)_{i = 1, \ldots, n} = c(a) < c(b) = c(b_j)_{j = 1, \ldots, m}$
对$\forall i,j: c(a_i) < c(b_j)$,从而$\hat{c}(a_i) < \hat{c}(b_j)$
故$LC$-搜索在搜到$a$之前都不会扩展$b_1$
条件$\forall X,Y: c(X) < c(Y) \rightarrow \hat{c}(X) < \hat{c}(Y)$太苛刻了
若结点成本估计函数$\hat{c}(\cdot)$满足
- 对任意结点$X$有$\hat{c}(X) \le c(X)$
- 对任意答案结点$Y$有$c(Y) = \hat{c}(Y)$
则 LC-搜索能找到最小成本的答案结点
证明:设搜到的答案结点为$Z$,对剩余活结点$X$有$\hat{c}(Z) \le \hat{c}(X)$
从而$c(Z) = \hat{c}(Z) \le \hat{c}(X) \le c(X)$,即$Z$就是成本最小的答案结点
在前面的华容道例子中,这两个条件都满足