4-皇后问题 分支限界
扩展结点 1 得新结点 2、3、4、5
活结点 2、3、4、5 入队
扩展结点 2 得新结点 6、7、8
利用限界函数杀死结点 6
活结点 7、8 入队
4-皇后问题 分支限界
扩展结点 3 得新结点 9、10、11
利用限界函数杀死结点 9、10
活结点 11 入队
扩展结点 4 得新结点 12、13、14
利用限界函数杀死结点 13、14
活结点 12 入队
4-皇后问题 分支限界
扩展结点 5 得新结点 15、16、17,利用限界函数杀死结点 17
活结点 15、16 入队
4-皇后问题 分支限界
扩展结点 7 得新结点 18、19,利用限界函数杀死结点 18、19
扩展结点 8 得新结点 20、21,利用限界函数杀死结点 21
活结点 20 入队
4-皇后问题 分支限界
扩展结点 11 得新结点 22、23,利用限界函数杀死结点 23
活结点 22 入队
4-皇后问题 分支限界
扩展结点 12 得新结点 24、25,利用限界函数杀死结点 24
活结点 25 入队
4-皇后问题 分支限界
扩展结点 15 得新结点 26、27,利用限界函数杀死结点 26
活结点 27 入队
4-皇后问题 分支限界
扩展结点 16 得新结点 28、29,利用限界函数杀死结点 28、29
扩展结点 20 得新结点 30,利用限界函数杀死结点 30
扩展结点 22 得答案结点 31,对应元组为$(2,4,1,3)$
4-皇后问题 分支限界
扩展结点 25 得答案结点 32,对于元组为$(3,1,4,2)$
扩展结点 27 得新结点 33,利用限界函数杀死结点 33
队列为空,再无可扩展活结点,算法停止,两个解均已找到
4-皇后问题 分支限界
扩展结点 1 得新结点 2、3、4、5
活结点 2、3、4、5 入栈
扩展结点 5 得新结点 6、7、8
用限界函数杀死结点 8
活结点 6、7 入栈
4-皇后问题 分支限界
扩展结点 7 得新结点 9、10,用限界函数杀死结点 9、10
扩展结点 6 得新结点 11、12,用限界函数杀死结点 11
活结点 12 入栈
4-皇后问题 分支限界
扩展结点 12 得新结点 13,用限界函数杀死结点 13
扩展结点 4 得新结点 14、15、16,用限界函数杀死结点 15、16
活结点 14 入栈
4-皇后问题 分支限界
扩展结点 14 得新结点 17、18,用限界函数杀死结点 17
活结点 18 入栈
4-皇后问题 分支限界
扩展结点 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, -, -) 同理,上下界吻合,就是最优解
0/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$
0/1 背包问题
| |
物品 1 |
物品 2 |
物品 3 |
物品 4 |
| 重量 |
4 |
7 |
5 |
3 |
| 价值 |
40 |
42 |
25 |
12 |
| 单价 |
10 |
6 |
5 |
4 |
对任一确定了部分分量的解
- 上界:已选物品总价值 + 剩余承重量采用单价最大的物品的总价值
- 下界:已选物品总价值
例如:若选了物品 1
- 价值上界 = 40 + 6 × 6 = 76
- 价值下界 = 40
0/1 背包问题
| |
物品 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$个作业的集合中选取子集$\jc$,要求$\jc$中所有作业都能在各自期限内完成,并且不在$\jc$中的作业导致的罚款总额最小
解的形式和子集和数问题一样
- 定长元组:$n$层二叉树
- 变长递增元组:$2^n$个结点
带限期的作业排序
\begin{align}
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}
设$\sc_X$是考察结点$X$时已选择的作业集合
令$m = \max \{ i \mid i \in \sc_X \}$
- 下界$l = \sum_{i < m, i \not \in \sc_X} p_i$,已经被考虑过但没被选择的作业的罚款之和
- 上界$u = \sum_{i \not \in \sc_X} p_i$,把还没考虑到的作业的罚款也全部算上
带限期的作业排序
\begin{align}
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}
n-皇后问题 分支限界
对最优化问题,估计的上下界可自然地用来选择下一个 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)$的总变化量为奇数
LC-搜索 正确性
若对$\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$
LC-搜索 正确性
条件$\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$就是成本最小的答案结点
在前面的华容道例子中,这两个条件都满足