算法设计与分析


分支限界法

计算机学院    张腾

tengzhang@hust.edu.cn

课程大纲

算法设计与分析分治法动态规划贪心法回溯法分支限界法迭代改进n-皇后问题任务分派问题0/1背包问题带期限的作业排序华容道问题

分支限界法

分支限界法:对穷举法的改进带剪枝的搜索

状态空间树生长的两种策略:

  • 回溯深度优先,E-结点 R 每生成一个新的儿子 C 时,C 就变成了新的 E-结点,当完全检测了子树 C 之后,R 结点再次成为 E-结点
  • 分支限界宽度优先,在生成当前 E-结点全部儿子之后再生成其它活结点的儿子

存储活结点的数据结构

  • 队列:先进先出,对状态生成树做 BFS
  • :后进先出,对状态生成树做 D-Search
4-皇后问题 分支限界

扩展结点 1 得新结点 2、3、4、5

活结点 2、3、4、5 入队

队列 2 3 4 5

扩展结点 2 得新结点 6、7、8

利用限界函数杀死结点 6

活结点 7、8 入队

队列 3 4 5 7 8

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4

g 2 2 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 1 1 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4

4-皇后问题 分支限界

扩展结点 3 得新结点 9、10、11

利用限界函数杀死结点 9、10

活结点 11 入队

队列 4 5 7 8 11  

扩展结点 4 得新结点 12、13、14

利用限界函数杀死结点 13、14

活结点 12 入队

队列 5 7 8 11 12  

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4 12 12 4->12 1 13 13 4->13 2 14 14 4->14 4

4-皇后问题 分支限界

扩展结点 5 得新结点 15、16、17,利用限界函数杀死结点 17

活结点 15、16 入队

队列 7 8 11 12 15 16

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4 12 12 4->12 1 13 13 4->13 2 14 14 4->14 4 15 15 5->15 1 16 16 5->16 2 17 17 5->17 3

4-皇后问题 分支限界

扩展结点 7 得新结点 18、19,利用限界函数杀死结点 18、19

扩展结点 8 得新结点 20、21,利用限界函数杀死结点 21

活结点 20 入队

队列 11 12 15 16 20  

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4 12 12 4->12 1 13 13 4->13 2 14 14 4->14 4 15 15 5->15 1 16 16 5->16 2 17 17 5->17 3 18 18 7->18 2 19 19 7->19 4 20 20 8->20 2 21 21 8->21 3

4-皇后问题 分支限界

扩展结点 11 得新结点 22、23,利用限界函数杀死结点 23

活结点 22 入队

队列 12 15 16 20 22  

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4 12 12 4->12 1 13 13 4->13 2 14 14 4->14 4 15 15 5->15 1 16 16 5->16 2 17 17 5->17 3 18 18 7->18 2 19 19 7->19 4 20 20 8->20 2 21 21 8->21 3 22 22 11->22 1 23 23 11->23 3

4-皇后问题 分支限界

扩展结点 12 得新结点 24、25,利用限界函数杀死结点 24

活结点 25 入队

队列 15 16 20 22 25  

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4 12 12 4->12 1 13 13 4->13 2 14 14 4->14 4 15 15 5->15 1 16 16 5->16 2 17 17 5->17 3 18 18 7->18 2 19 19 7->19 4 20 20 8->20 2 21 21 8->21 3 22 22 11->22 1 23 23 11->23 3 24 24 12->24 2 25 25 12->25 4

4-皇后问题 分支限界

扩展结点 15 得新结点 26、27,利用限界函数杀死结点 26

活结点 27 入队

队列 16 20 22 25 27  

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4 12 12 4->12 1 13 13 4->13 2 14 14 4->14 4 15 15 5->15 1 16 16 5->16 2 17 17 5->17 3 18 18 7->18 2 19 19 7->19 4 20 20 8->20 2 21 21 8->21 3 22 22 11->22 1 23 23 11->23 3 24 24 12->24 2 25 25 12->25 4 26 26 15->26 2 27 27 15->27 3

4-皇后问题 分支限界

扩展结点 16 得新结点 28、29,利用限界函数杀死结点 28、29

扩展结点 20 得新结点 30,利用限界函数杀死结点 30

扩展结点 22 得答案结点 31,对应元组为$(2,4,1,3)$

队列 25 27        

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4 12 12 4->12 1 13 13 4->13 2 14 14 4->14 4 15 15 5->15 1 16 16 5->16 2 17 17 5->17 3 18 18 7->18 2 19 19 7->19 4 20 20 8->20 2 21 21 8->21 3 22 22 11->22 1 23 23 11->23 3 24 24 12->24 2 25 25 12->25 4 26 26 15->26 2 27 27 15->27 3 28 28 16->28 1 29 29 16->29 3 30 30 20->30 3 31 31 22->31 3

4-皇后问题 分支限界

扩展结点 25 得答案结点 32,对于元组为$(3,1,4,2)$

扩展结点 27 得新结点 33,利用限界函数杀死结点 33

队列为空,再无可扩展活结点,算法停止,两个解均已找到

队列            

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4 12 12 4->12 1 13 13 4->13 2 14 14 4->14 4 15 15 5->15 1 16 16 5->16 2 17 17 5->17 3 18 18 7->18 2 19 19 7->19 4 20 20 8->20 2 21 21 8->21 3 22 22 11->22 1 23 23 11->23 3 24 24 12->24 2 25 25 12->25 4 26 26 15->26 2 27 27 15->27 3 28 28 16->28 1 29 29 16->29 3 30 30 20->30 3 31 31 22->31 3 32 32 25->32 2 33 33 27->33 2

4-皇后问题 分支限界

扩展结点 1 得新结点 2、3、4、5

活结点 2、3、4、5 入栈

2 3 4 5

扩展结点 5 得新结点 6、7、8

用限界函数杀死结点 8

活结点 6、7 入栈

2 3 4 6 7

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 5->6 1 7 7 5->7 2 8 8 5->8 3

4-皇后问题 分支限界

扩展结点 7 得新结点 9、10,用限界函数杀死结点 9、10

扩展结点 6 得新结点 11、12,用限界函数杀死结点 11

活结点 12 入栈

2 3 4 12    

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 5->6 1 7 7 5->7 2 8 8 5->8 3 11 11 6->11 2 12 12 6->12 3 9 9 7->9 1 10 10 7->10 3

4-皇后问题 分支限界

扩展结点 12 得新结点 13,用限界函数杀死结点 13

扩展结点 4 得新结点 14、15、16,用限界函数杀死结点 15、16

活结点 14 入栈

2 3 14      

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 14 14 4->14 1 15 15 4->15 2 16 16 4->16 4 6 6 5->6 1 7 7 5->7 2 8 8 5->8 3 11 11 6->11 2 12 12 6->12 3 9 9 7->9 1 10 10 7->10 3 13 13 12->13 2

4-皇后问题 分支限界

扩展结点 14 得新结点 17、18,用限界函数杀死结点 17

活结点 18 入栈

2 3 18      

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 14 14 4->14 1 15 15 4->15 2 16 16 4->16 4 6 6 5->6 1 7 7 5->7 2 8 8 5->8 3 11 11 6->11 2 12 12 6->12 3 9 9 7->9 1 10 10 7->10 3 13 13 12->13 2 17 17 14->17 2 18 18 14->18 4

4-皇后问题 分支限界

扩展结点 18 得答案结点 19,对应元组为$(3,1,4,2)$

另一个解$(2,4,1,3)$可从结点 3 继续扩展得到

2 3        

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 14 14 4->14 1 15 15 4->15 2 16 16 4->16 4 6 6 5->6 1 7 7 5->7 2 8 8 5->8 3 11 11 6->11 2 12 12 6->12 3 9 9 7->9 1 10 10 7->10 3 13 13 12->13 2 17 17 14->17 2 18 18 14->18 4 19 19 18->19 2

n-皇后问题 分支限界

回溯法和分支限界法都用限界函数剪去不满足约束的子树

为何不叫约束函数而叫限界函数?限了什么界?

n-皇后问题不是最优化问题,所以只有分支、没有限界

以最小化问题为例

  • 对每个结点,根据确定了的分量,估计其对目标函数取值的上下界
  • 对下界还不如该上界的结点,直接剪枝
  • 一旦得到一个可行解,所有下界大于其目标函数值的结点被剪枝

估计上下界的函数就是限界函数,要既方便计算又能有效剪枝,其设计是分支限界法的关键

分派问题

$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

g root root n1 u = 9 + 4 + 1 + 4 = 18 l = 9 + 3 + 1 + 4 = 17 root->n1 1 n2 u = 2 + 6 + 1 + 4 = 13 l = 2 + 3 + 1 + 4 = 10 root->n2 2 n3 u = 7 + 6 + 8 + 4 = 25 l = 7 + 4 + 5 + 4 = 20 root->n3 3 n4 u = 8 + 6 + 8 + 9 = 31 l = 8 + 3 + 1 + 6 = 18 root->n4 4 n5 u = 2 + 6 + 1 + 4 = 13 l = 2 + 6 + 1 + 4 = 13 n2->n5 1 n6 u = 2 + 3 + 5 + 4 = 14 l = 2 + 3 + 5 + 4 = 14 n2->n6 3 n7 u = 2 + 7 + 5 + 9 = 23 l = 2 + 7 + 1 + 7 = 17 n2->n7 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

g root root n1 u = 40 + 6 × 6 = 76 l = 40 root->n1 1 n2 u = 6 × 10 = 60 l = 0 root->n2 0 n10 n1->n10 1 n3 u = 40 + 5 × 6 = 70 l = 40 n1->n3 0 n4 u = 40 + 25 + 4 × 1 = 69 l = 40 + 25 = 65 n3->n4 1 n5 u = 40 + 4 × 6 = 64 l = 40 n3->n5 0 n11 n4->n11 1 40 + 25 = 65 40 + 25 = 65 n4->40 + 25 = 65 0

部分解 (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*} $$

g root root n1 u = 10 + 6 + 3 = 19 l = 0 root->n1 1 n2 u = 5 + 6 + 3 = 14 l = 5 root->n2 2 n3 u = 5 + 10 + 3 = 18 l = 5 + 10 = 15 > 14 root->n3 3 n4 u = 5 + 10 + 6 = 21 l = 5 + 10 + 6 = 21 > 14 root->n4 4 n5 u = 6 + 3 = 9 l = 0 n1->n5 2 n6 u = 10 + 3 = 13 l = 10 > 9 n1->n6 3 n7 n1->n7 4 n10 u = 5 + 3 = 8 l = 5 n2->n10 3 n11 u = 5 + 6 = 11 l = 5 + 6 = 11 > 8 n2->n11 4 n8 n5->n8 3 n9 n5->n9 4 n12 n10->n12 4

回溯 vs. 分支限界

共同点:

  • 都是对穷举法的改进
  • 都将解空间组织成状态空间树
  • 都利用约束对状态空间树剪枝

目标问题:分支限界多用于最优化问题,除了约束外,还利用结点关于目标函数的上下界进行剪枝

生长策略:分支限界会扩展当前 E-结点的全部子结点、估计其上下界并保存,当前结点扩展完毕后,选择潜力最大的活结点作为下一个 E-结点

n-皇后问题 分支限界

对最优化问题,估计的上下界可自然地用来选择下一个 E-结点

对非优化问题如 4-皇后,结点 22 离答案结点 31 仅一步之遥,却又向右兜了个大圈子,“智能”的选择下一个 E-结点的方法?

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4 12 12 4->12 1 13 13 4->13 2 14 14 4->14 4 15 15 5->15 1 16 16 5->16 2 17 17 5->17 3 18 18 7->18 2 19 19 7->19 4 20 20 8->20 2 21 21 8->21 3 22 22 11->22 1 23 23 11->23 3 24 24 12->24 2 25 25 12->25 4 26 26 15->26 2 27 27 15->27 3 28 28 16->28 1 29 29 16->29 3 30 30 20->30 3 31 31 22->31 3 32 32 25->32 2 33 33 27->33 2

结点成本函数

分支限界中,估计的界能体现从该结点得到最优解的可能性

对非优化问题,没有现成的界可用,没有条件就创造条件

构造一个结点成本函数$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

g 1 1 2 2 1->2 1 3 3 1->3 2 4 4 1->4 3 5 5 1->5 4 6 6 2->6 2 7 7 2->7 3 8 8 2->8 4 9 9 3->9 1 10 10 3->10 3 11 11 3->11 4 12 12 4->12 1 13 13 4->13 2 14 14 4->14 4 15 15 5->15 1 16 16 5->16 2 17 17 5->17 3 18 18 7->18 2 19 19 7->19 4 20 20 8->20 2 21 21 8->21 3 22 22 11->22 1 23 23 11->23 3 24 24 12->24 2 25 25 12->25 4 26 26 15->26 2 27 27 15->27 3 28 28 16->28 1 29 29 16->29 3 30 30 20->30 3 31 31 22->31 3 32 32 25->32 2 33 33 27->33 2

最小成本搜索

如果有$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)$的总变化量为奇数

华容道 分支限界

g n1 1 2 3 4 5 6 8 9 10 7 11 13 14 15 12 n2 1 2 4 5 6 3 8 9 10 7 11 13 14 15 12 n1->n2 n3 1 2 3 4 5 6 8 9 10 7 11 13 14 15 12 n1->n3 n4 1 2 3 4 5 6 7 8 9 10 11 13 14 15 12 n1->n4 n5 1 2 3 4 5 6 8 9 10 7 11 13 14 15 12 n1->n5 n6 1 2 4 5 6 3 8 9 10 7 11 13 14 15 12 n2->n6 n7 1 2 4 5 6 3 8 9 10 7 11 13 14 15 12 n2->n7 n8 1 2 3 5 6 8 4 9 10 7 11 13 14 15 12 n3->n8 n9 1 2 3 4 5 6 8 11 9 10 7 13 14 15 12 n3->n9 n11 1 2 3 4 5 6 7 8 9 10 15 11 13 14 12 n4->n11 n12 1 2 3 4 5 6 7 8 9 10 11 13 14 15 12 n4->n12 n10 1 2 3 4 5 6 7 8 9 10 11 13 14 15 12 n4->n10 n13 1 3 4 5 2 6 8 9 10 7 11 13 14 15 12 n5->n13 n14 1 2 3 4 5 10 6 8 9 7 11 13 14 15 12 n5->n14 n15 1 2 3 4 5 6 8 9 10 7 11 13 14 15 12 n5->n15 n16 1 2 4 8 5 6 3 9 10 7 11 13 14 15 12 n6->n16 n18 1 2 4 5 6 3 8 9 10 7 11 13 14 15 12 n7->n18 n17 1 6 2 4 5 3 8 9 10 7 11 13 14 15 12 n7->n17 n19 1 2 3 5 6 8 4 9 10 7 11 13 14 15 12 n8->n19 n21 1 2 3 4 5 6 8 11 9 10 7 13 14 15 12 n9->n21 n20 1 2 3 4 5 6 8 11 9 10 7 12 13 14 15 n9->n20 n23 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 n10->n23 n22 1 2 3 4 5 6 7 9 10 11 8 13 14 15 12 n10->n22

华容道 LC-分支限界

  • $f(X)$取根结点到$X$的路径长度
  • $\hat{g}(X)$为不在其正确位置的牌数目

g n1 1 2 3 4 5 6 8 9 10 7 11 13 14 15 12 n2 1 2 4 5 6 3 8 9 10 7 11 13 14 15 12 n1->n2 n3 1 2 3 4 5 6 8 9 10 7 11 13 14 15 12 n1->n3 n4 1 2 3 4 5 6 7 8 9 10 11 13 14 15 12 n1->n4 n5 1 2 3 4 5 6 8 9 10 7 11 13 14 15 12 n1->n5 n10 1 2 3 4 5 6 7 8 9 10 11 13 14 15 12 n4->n10 n11 1 2 3 4 5 6 7 8 9 10 15 11 13 14 12 n4->n11 n12 1 2 3 4 5 6 7 8 9 10 11 13 14 15 12 n4->n12 n22 1 2 3 4 5 6 7 9 10 11 8 13 14 15 12 n10->n22 n23 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 n10->n23

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$

g R R a1 a1 R->a1 b1 b1 R->b1 n1 a1->n1 n2 b1->n2 an an n1->an a a an->a bm bm n2->bm b b bm->b

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$就是成本最小的答案结点

在前面的华容道例子中,这两个条件都满足