42
与与与与与与与与 17.1 与与与与与与与 17.2 与与与与与 与与与与FIFO 与与与与 与与与与与 与与与与 Chapter17 分分分分 分分分分 22/3/12 1

Chapter17 分支定界

Embed Size (px)

DESCRIPTION

Chapter17 分支定界. 与回溯算法的比较 17.1 分支定界的思想 17.2 算法的应用 货箱装船: FIFO 、最大收益 旅行商问题:最小耗费. 分支定界 VS. 回溯算法. 相同点: 都使用树形结构(子集树或排列树)来组织解空间 不同点: 回溯算法使用 DFS 方法来搜索树; 分支定界使用 BFS 方法或 最小耗费 方法来搜索树 分支定界的解空间比回溯算法要大得多 当内存容量有限时,回溯法更易成功! 但有时候,分支定界能够找到最优解。. 1 、算法的思想. 对 E- 节点的扩充方式:引入 活节点表 - PowerPoint PPT Presentation

Citation preview

与回溯算法的比较17.1 分支定界的思想 17.2 算法的应用

货箱装船: FIFO 、最大收益旅行商问题:最小耗费

Chapter17 分支定界分支定界

23/4/20 1

分支定界 分支定界 VS. VS. 回溯算法回溯算法 相同点:

都使用树形结构(子集树或排列树)来组织解空间 不同点:

回溯算法使用 DFS 方法来搜索树;分支定界使用 BFS 方法或最小耗费方法来搜索树

• 分支定界的解空间比回溯算法要大得多• 当内存容量有限时,回溯法更易成功!• 但有时候,分支定界能够找到最优解。

23/4/20 2

11 、算法的思想、算法的思想对对 E-E- 节点的扩充方式:引入节点的扩充方式:引入活节点表活节点表【【思想思想】】每个活节点有且仅有一次机会变成 每个活节点有且仅有一次机会变成 E-E- 节点。节点。当一当一

个节点变为个节点变为 E-E- 节点时,则生成从该节点移动一步即可到节点时,则生成从该节点移动一步即可到达的所有新节点。达的所有新节点。在生成的节点中,在生成的节点中,抛弃抛弃那些不可能导出那些不可能导出(最优)可行解的节点,其余节点(最优)可行解的节点,其余节点加入加入活节点表,然后从活节点表,然后从表中选择一个节点作为下一个表中选择一个节点作为下一个 E-E- 节点。节点。

从活节点表中取出所选择的节点并进行扩充,直到找到解或从活节点表中取出所选择的节点并进行扩充,直到找到解或活动表为空,扩充过程才结束。活动表为空,扩充过程才结束。

23/4/20 3

选择选择 E-E- 节点的方法节点的方法• 先进先出:活节点表的性质与队列相同先进先出:活节点表的性质与队列相同• 最小耗费或最大收益:每个节点都有一个对应的耗费或最小耗费或最大收益:每个节点都有一个对应的耗费或

收益收益• 查找一个具有最小耗费的解,则活节点表可用最小查找一个具有最小耗费的解,则活节点表可用最小

堆来建立堆来建立• 搜索一个具有最大收益的解,则活节点表可用最大堆搜索一个具有最大收益的解,则活节点表可用最大堆

来构造活节点表来构造活节点表• 下一个 下一个 E-E- 节点就是满足条件的活节点节点就是满足条件的活节点

23/4/20 4

示例示例 11 :迷宫老鼠问题:迷宫老鼠问题

(( 11 ,, 22 ))(( 22 ,, 11 ))Step1:Step1: (( 11 ,,

11 ))

E-E- 节点 活节点表节点 活节点表

Step2:Step2: (( 11 ,,22 ))

(( 22 ,, 11 ))(( 11 ,, 33 ))

Step3:Step3: (( 22 ,,11 ))

(( 11 ,, 33 ))(( 33 ,, 11 ))

Step4:Step4: (( 11 ,,33 )) (( 33 ,, 11 ))Step5:Step5: (( 33 ,,11 ))

(( 33 ,, 22 ))Step6:Step6: (( 33 ,,22 ))

(( 33 ,, 33 )) Goal:Goal: (( 33 ,, 33 ) ) NULLNULL

23/4/20 5

示例示例 22 :: 0/10/1 背包问题背包问题

• FIFOFIFO 分支定界分支定界 n=3, w=[20,15,15], p=[40,25,25], c=30n=3, w=[20,15,15], p=[40,25,25], c=30

E-E- 节点 活节点表节点 活节点表AA BB CC

BB CC EE

CC EE FF GG

EE FF GG

解解 11 :: [1,0,0], [1,0,0], 收益收益4040FF GG

解解 22 :: [0,1,1], [0,1,1], 收益收益5050GG NULLNULL

23/4/20 6

FIFOFIFO 分支定界法小结分支定界法小结• 对于迷宫问题,对于迷宫问题, FIFOFIFO 法总能找到从入口到出口的最短法总能找到从入口到出口的最短

路径;而回溯法却不能保证路径;而回溯法却不能保证• 在解空间树上的在解空间树上的 FIFOFIFO 法,类似从根节点出发的法,类似从根节点出发的 BFSBFS 方方

法;法;• 与与 BFSBFS 的区别在于:在的区别在于:在 FIFOFIFO 分支定界中,不可行的节分支定界中,不可行的节

点不会被搜索!点不会被搜索!

23/4/20 7

最大收益最大收益 -- 分支定界思想分支定界思想• 使用一个最大堆:其中的 使用一个最大堆:其中的 E-E- 节点按照每个活节点收益节点按照每个活节点收益

值的降序,或是按照活节点任意子树的叶节点所能获得值的降序,或是按照活节点任意子树的叶节点所能获得的收益估计值的降序从队列中取出的收益估计值的降序从队列中取出

23/4/20 8

再解示例再解示例 22 :最大收益法:最大收益法

E-E- 节点 活节点表节点 活节点表AA BB CC

BB EE CC

EE CC

解解 11 :: [1,0,0], [1,0,0], 收益收益4040CC

解解 22 :: [0,1,1], [0,1,1], 收益收益5050GG NULLNULL

n=3, w=[20,15,15], p=[40,25,25], c=30n=3, w=[20,15,15], p=[40,25,25], c=30

FF GG

FF GG

23/4/20 9

最大收益最大收益 -- 分支定界小结分支定界小结• 定界函数确定最大收益的上限定界函数确定最大收益的上限;如果一个节点的定界函数;如果一个节点的定界函数

值不大于目前最优解的收益值,则此节点会被删除而不作值不大于目前最优解的收益值,则此节点会被删除而不作为为 E-E- 节点展开节点展开

• 节点取出策略:使节点按照它们收益的定界函数值的非升节点取出策略:使节点按照它们收益的定界函数值的非升序从最大堆中取出;这种策略从可能到达一个好的叶节点序从最大堆中取出;这种策略从可能到达一个好的叶节点的活节点出发,而不是从目前具有较大收益值的节点出发的活节点出发,而不是从目前具有较大收益值的节点出发

23/4/20 10

示例示例 33 :旅行商问题:旅行商问题• FIFOFIFO 分支定界分支定界

E-E- 节点 活节点表节点 活节点表BB

CC DD EE FF GG

CC DD EE

EE FF GG HH II JJ KK

FF 路径路径 1234112341 ,, 5959GG 路径路径 1243112431 ,, 6666HH 路径路径 1324113241 ,, 2525IIJJKK

路径路径 13421342 ,不展,不展开开路径路径 1423114231 ,, 2525

路径路径 14321432 ,不展,不展开开23/4/20 11

再解示例再解示例 33 :最小耗费法:最小耗费法• 使用最小堆存储活节点使用最小堆存储活节点

E-E- 节点 活节点表节点 活节点表BB EE DD CCEE DD JJ KK CC

DD HH JJ KK II CC

HH 路径路径 1324113241 ,, 2525

【【定界函数定界函数】】如果一个如果一个节点的定界值不比当前节点的定界值不比当前最优旅行更小,则将被最优旅行更小,则将被删除而不被展开!删除而不被展开!

23/4/20 12

最小耗费最小耗费 -- 分支定界小结分支定界小结• 定界函数确定最小耗费的下限;如果一个节点的定界值定界函数确定最小耗费的下限;如果一个节点的定界值

不比当前最优旅行更小,则将被删除而不被展开不比当前最优旅行更小,则将被删除而不被展开• 节点取出策略:使节点按照它们耗费的定界函数值的非节点取出策略:使节点按照它们耗费的定界函数值的非

降序从最小堆中取出降序从最小堆中取出

23/4/20 13

分支定界法分支定界法 -- 小结小结• 设计定界函数的原则:利用最少的时间,在内存允许范设计定界函数的原则:利用最少的时间,在内存允许范

围内去解决问题围内去解决问题• 好的定界函数:一个能够有效地减少计算时间,并因此好的定界函数:一个能够有效地减少计算时间,并因此

使产生的节点数目也减少使产生的节点数目也减少• 通过产生具有最少节点的树来解决问题并不是根本的目通过产生具有最少节点的树来解决问题并不是根本的目

标标

23/4/20 14

分支定界法 分支定界法 VS. VS. 回溯法回溯法• 分支定界法在直觉上好于回溯法,在寻找最优解的许多情分支定界法在直觉上好于回溯法,在寻找最优解的许多情

况下,可能会比回溯法检查更少的节点况下,可能会比回溯法检查更少的节点• 但是,回溯法比分支定界在但是,回溯法比分支定界在占用空间方面占用空间方面更具优势:回溯更具优势:回溯

法是法是 O(O( 解空间的最大路径长度解空间的最大路径长度 )) ;分支定界是;分支定界是 O(O( 解空间解空间大小大小 ))

• 子集树:子集树: O(2O(2nn)) VS. VS. O(n)O(n)

• 排列树:排列树: O(n!)O(n!) VS. VS. O(n)O(n)

23/4/20 15

课后练习课后练习• Page519Page519 :练习:练习 22 ,, 0/10/1 背包问题背包问题– 1) 1) 绘制绘制 n=4n=4 时,解空间树时,解空间树– 2) 2) 描述描述 FIFO -FIFO - 分支定界过程分支定界过程– 4) 4) 描述最大收益描述最大收益 -- 分支定界过程分支定界过程

23/4/20 16

22 、算法的应用、算法的应用 货箱装船问题:子集树货箱装船问题:子集树

FIFOFIFO 分支定界分支定界 最大收益分支定界最大收益分支定界

旅行商问题:排列树旅行商问题:排列树 最小耗费分支定界最小耗费分支定界

23/4/20 17

(( 11 )货箱装船问题)货箱装船问题• 11 )) FIFOFIFO 分支定界分支定界– Page519Page519 :程序:程序 17-117-1

– 注意:队列权值注意:队列权值 -1-1 ,标识活节点表的结尾,标识活节点表的结尾– AddLiveNodeAddLiveNode 可能会失败!需处理异常可能会失败!需处理异常– 时间和空间复杂度: 时间和空间复杂度: O(2O(2nn) )

23/4/20 18

队列权值队列权值 -1-1 ,标识,标识每层活节点的结尾每层活节点的结尾

23/4/20 19

FIFOFIFO 分支定界的优化分支定界的优化• 目的:当右孩子对应的重量加上剩余货箱的重量超出 目的:当右孩子对应的重量加上剩余货箱的重量超出

bestwbestw 时,才选择右孩子时,才选择右孩子• 问题:在问题:在 ii 变为变为 nn 之前, 之前, bestwbestw 的值一直保持不变,因此的值一直保持不变,因此

在在 ii 等于等于 nn 之前对右孩子的测试总能成功之前对右孩子的测试总能成功• 解决方法:应当提早改变 解决方法:应当提早改变 bestwbestw 的值,即:由于仅在向左的值,即:由于仅在向左

子树移动时子树移动时最优装载重量最优装载重量才会增大,因此可以在每次进行才会增大,因此可以在每次进行这种移动时改变 这种移动时改变 bestwbestw 的值的值

• Page521Page521 :程序:程序 17-217-2

23/4/20 20

23/4/20 21

寻找最优子集寻找最优子集• FIFOFIFO 分支定界寻找最优子集:记录从每个活节点到达根分支定界寻找最优子集:记录从每个活节点到达根

的路径的路径• 在找到最优装载所对应的叶节点之后,就可以利用所记在找到最优装载所对应的叶节点之后,就可以利用所记

录的路径返回到根节点来设置 录的路径返回到根节点来设置 x x 的值的值

23/4/20 22

定义活节点队列中元素类型定义活节点队列中元素类型template<class T>template<class T>class QNode class QNode {{ …… …… private:private: QNode *parent; // QNode *parent; // 指向父节点的指针指向父节点的指针 bool LChild; // bool LChild; // 当且仅当是父节点的左孩子时当且仅当是父节点的左孩子时 ,, 为为 truetrue T weight; //T weight; // 由到达本节点的路径所定义的部分解的值由到达本节点的路径所定义的部分解的值};};

23/4/20 23

注意:程序未删除类型为 QNode 的节点。为了删除这些节点,可以保存由这些节点的指针,以便在程序结束时删除这些节点。

23/4/20 24

23/4/20 25

由叶子到根反向构造

23/4/20 26

(( 22 )最大收益)最大收益 -- 分支定界分支定界• 活节点列表是一个最大优先级队列,其中每个 活节点 x 都有一个相

应的重量上限(最大收益)。这个重量上限是节点 x 相应的重量加上剩余货箱的总重量,所有的活节点按其重量上限的递减顺序变为 E- 节点

– 【结论 1 】如果节点 x 的重量上限是 x .uweight ,则在子树中不可能存在重量超过 x.uweight 的节点

– 【结论 2 】:当某个叶节点成为 E- 节点并且其他任何活节点都不会帮助我们找到具有更大重量的叶节点时,最优装载的搜索终止

23/4/20 27

最大收益最大收益 -- 实现方法实现方法• 【【方法一方法一】】最大优先级队列中的活节点都是互相独立的,因此每个最大优先级队列中的活节点都是互相独立的,因此每个

活节点内部活节点内部必须必须记录从子集树的根到此节点的路径记录从子集树的根到此节点的路径。一旦找到了最。一旦找到了最优装载所对应的叶节点,就利用这些路径信息来计算 优装载所对应的叶节点,就利用这些路径信息来计算 x x 值。值。

• 【【方法二方法二】】除了把节点加入最大优先队列之外,节点还必须放在另除了把节点加入最大优先队列之外,节点还必须放在另一个独立的树结构中,这个树结构用来表示所生成的一个独立的树结构中,这个树结构用来表示所生成的子集树子集树的一部的一部分。当找到最大装载之后,就可以沿着路径从叶节点一步一步返回分。当找到最大装载之后,就可以沿着路径从叶节点一步一步返回到根,从而计算出 到根,从而计算出 x x 值。值。

23/4/20 28

最大堆的节点类型定义最大堆的节点类型定义

23/4/20 29

向最大堆添加活节点向最大堆添加活节点

23/4/20 30

基于方法二的最优装载基于方法二的最优装载• 使用最大堆来表示活使用最大堆来表示活节点的最大优先队列时,节点的最大优先队列时,需要预测这个队列的最需要预测这个队列的最大长度。可以使用一个大长度。可以使用一个基于指针的最大优先队基于指针的最大优先队列来取代基于数组的队列来取代基于数组的队列列• 注意剩余重量数组注意剩余重量数组 rr ::r[n] = 0r[n] = 0r[n-1] = r[n]+w[n]r[n-1] = r[n]+w[n]r[n-2] = r[n-1]+w[n-1]r[n-2] = r[n-1]+w[n-1]……r[1] = r[2]+w[2]r[1] = r[2]+w[2]

23/4/20 31

活节点的重量上限

当前 E 节点的重量

23/4/20 32

算法的改进思想算法的改进思想• 【问题】 bestw 表示当前所有可行节点的重量的最大值,而优先队

列中可能有许多其 uweight 不超过 bestw 的活节点,因此这些节点不可能帮助我们找到最优的叶节点,所以可以将这些节点删除

• 【解决】 bestw 在算法执行过程中是不断增大的,在每次 bestw 增大时,删除队列中所有 uweight < bestw 的节点。这种策略要求删除具有最小 uweight 的节点。

• 【可引入】双端优先队列(第 9章的参考文献)

23/4/20 33

(( 22 )旅行商问题)旅行商问题• 解空间是排列树解空间是排列树• 方法一:只使用一个优先队列,方法一:只使用一个优先队列,

队列中的每个元素中都包含到达队列中的每个元素中都包含到达根的路径根的路径

• 方法二:是保留一个部分解空间方法二:是保留一个部分解空间树和一个优先队列,优先队列中树和一个优先队列,优先队列中的元素并不包含到达根的路径的元素并不包含到达根的路径

23/4/20 34

MinHeapNodeMinHeapNodetemplate<class T>template<class T>class MinHeapNode class MinHeapNode {{ friend AdjacencyWDigraph<T>;friend AdjacencyWDigraph<T>; public:public: operator T () const {return lcost;}operator T () const {return lcost;} private:private: T lcost, T lcost, ////该节点子树中任意叶节点中的最小耗费该节点子树中任意叶节点中的最小耗费 cc, cc, //// 解空间树中从根节点到当前节点的耗费解空间树中从根节点到当前节点的耗费 rcost; //rcost; // 从顶点从顶点 x[s:n-1]x[s:n-1] 出发的所有边的最小耗费之和出发的所有边的最小耗费之和 int s, int s, //// 当前旅行路径当前旅行路径 x[0:s],x[0:s], //// 剩余待访问的节点是剩余待访问的节点是 x[s+1: n-1]x[s+1: n-1] *x; *x; //// 从从 11 到到 n n 的整数排列,其中的整数排列,其中 x[0]=1x[0]=1 };};

23/4/20 35

计算有向图中从每个顶点出发的边中耗费最小的边所具有的耗费MinOut

如果有向图中存在某些顶点没有出边,则搜索停止,说明图中没有旅行路径

23/4/20 36

BBTSPBBTSP (续(续 11 )) MinSum :累计所有顶点发出边的最小耗费之和 初始 E 节点为根的孩子, x[0]=1

23/4/20 37

s=n-2s=n-2 的的 E-E- 节点,这时节点,这时 E-E- 节点是某个单独叶节点的父节节点是某个单独叶节点的父节点点

当某个叶节点成为 E- 节点后,搜索过程即终止

边 (x[n-2],x[n-1])边 (x[n-1],x[1])

23/4/20 38

待检查边 (x[s],x[i])x[i] 是 x[s+1..n-1] 上顶点

cc 表示当前孩子节点的路径前缀 (x[0:s],x[i]) 的耗费

后续孩子节点筛选标准:cc+各剩余顶点的出边耗费的最小值之和。

23/4/20 39

BBTSPBBTSP (续(续 33 ))

• 返回最优旅行路返回最优旅行路径的耗费径的耗费 bestcbestc ,,及最优路径顶点序及最优路径顶点序列数组列数组 vv

23/4/20 40

本章小结本章小结 与回溯算法的比较与回溯算法的比较 分支定界的思想 分支定界的思想 分支定界的应用分支定界的应用

货箱装船:货箱装船: FIFOFIFO 分支、最大收益分支、最大收益旅行商问题:最小耗费旅行商问题:最小耗费

23/4/20 41

课后练习课后练习• Page519Page519 :练习:练习 22 的的 1)1) 、、 2)2) 、、 4)4)

• 提高篇:提高篇:• Page535Page535 :练习:练习 2323 ,, FIFOFIFO 分支定界实现 分支定界实现 8-8- 皇后问题皇后问题

23/4/20 42