【S9-分支限界】

前言

分支限界法与回溯法类似,都是在解空间树中寻找问题解的算法。
两者本质区别在于搜索策略即结点生成次序不同:

  • 回溯:当前E-结点生成任一个儿子结点后,该儿子结点立即成为新的E结点,深度优先次序。
  • 分支限界:当前E-结点生成所有儿子结点后,再生成其他活结点的儿子结点且借助限界函数避免生成不包含答案结点子树的状态空间,广度优先(FIFO 队列实现)、D-检索(LIFO 堆栈实现)、LC-检索。
    分支限界法搜索答案节点步骤:

9.1.1 LC-检索

定义:用成本估计函数来选择下一个E结点的检索策略。
在这里插入图片描述

LC检索的提出:
在这里插入图片描述
成本函数c(X):在这里插入图片描述
得到成本函数常常是比较困难的,所以采用估计函数g(X)来代替成本函数。
估计函数g(X):
用来估计由X到达一个答案节点所需要的成本。
在这里插入图片描述
而仅考虑估计函数g(X)则会导致检索偏向于纵向检索,因此不仅考虑结点X到一个答案结点的估计成本值ĝ(X),还应考虑由根结点到结点X的成本h(X)
即:ĉ(X)=f(h(X))+ĝ(X)其中,f(.)是一个非降函数,不妨将f的作用理解为调整h和ĝ在成本估计函数ĉ中的影响比例。使f(.)不等于0,可以减少算法作偏向于纵深检查的可能性,使算法优先检索更靠近答案结点且又离根较近的结点。

LC-检索的特殊情况

  • List item
    在这里插入图片描述

9.1.1 15-谜问题

定理9.1

判断15-谜问题能否由初始状态到达目标状态:
在这里插入图片描述
其中 LESS(X)X的取值如下:在这里插入图片描述

15-谜问题的求解方法

空白牌的移动顺序依次为:上、右、下、左

  • 法1:FIFO检索

  • 在这里插入图片描述

  • 法2:深度优先检索

  • 在这里插入图片描述

  • 法3:LC检索

  • 在这里插入图片描述

  • 在这里插入图片描述

9.1.1 LC-检索的抽象化控制

c(.)、c(X)、c(T)在这里插入图片描述
LC算法搜索一个答案结点,具体步骤:
在这里插入图片描述

算法9.1 LC-检索

在这里插入图片描述
在这里插入图片描述

9.1.1 LC-检索的特性

定理9.2

理论上如何使得算法LC在到达一个最小成本的答案结点终止在这里插入图片描述
证明:在这里插入图片描述

改进算法LC

上述的成本函数常常难以得到。
在这里插入图片描述

改进算法与LC算法不同之处

在这里插入图片描述

算法9.2 改进LC算法

在这里插入图片描述

定理9.3

在这里插入图片描述
证明:在这里插入图片描述

LC-检索的总结

在这里插入图片描述

分支限界与回溯的比较

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分支限界法解决问题

带有限期的作业排序问题

问题描述:在这里插入图片描述
使用分支限界法,分别借助成本的估计函数ĉ (.)为c(X)的下界,同时设置最小成本的上界U(当前找到的最小成本),把ĉ(X) >U活结点杀死
在这里插入图片描述
简单说明,成本的估计函数ĉ (.)即为本应在Sx中但未在Sx中的作业罚款总和,上界u(x)为所有未在Sx中的作业罚款总和,U为所有u(x)中的最小值,注:所有结点在进入活结点表或出活结点表时候均需检查是否被限界(因为上界U不断在更新)
剪枝条件:c(X)>U

FIFOBB处理带有期限的作业问题

在这里插入图片描述
在这里插入图片描述

LIFOBB处理带有期限的作业问题在这里插入图片描述
LCBB处理带有期限的作业问题

在这里插入图片描述

9.1.6效率分析

定理9.4

设U1和U2是状态空间树T最小成本答案结点的两个初始上界且U1<U2,那么FIFO,LIFO,和LC-分支限界算法在以U1为上界初始值时所生成的结点数不会多于以U2为上界初始值时所生成的结点数。

定理9.5

设U是状态空间树T最小成本答案结点的当前上界,由FIFO,LIFO,和LC-分支限界算法所生成的结点数不因拓展ĉ(X)>U的结点X而减少。

定理9.6

在FIFO,LIFO分支限界算法中使用一个更好的成本估计函数ĉ(.)不会增加其生成的结点数。

定理9.7

在LC-分支限界算法中使用一个更好的成本估计函数ĉ(.)可能会增加其生成的结点数。

### 分支限界法解决转载问题的算法实现和案例分析 分支限界法是一种在解空间树上搜索问题解的算法,与回溯法类似,但其求解目标不同。分支限界法旨在找到满足约束条件的一个解或最优解[^2]。对于转载问题(假设为资源分配或路径优化问题),分支限界法可以通过构造解空间树并结合限界函数来高效地寻找最优解。 #### 1. 转载问题的定义 转载问题可以被描述为:在一个系统中,存在若干个资源节点和需求节点,需要通过某种方式将资源从源节点传递到目标节点,同时最小化传输成本或最大化传输效率。这类问题通常可以用图论中的最短路径、最小生成树或其他优化模型表示。 #### 2. 分支限界法的基本思想 分支限界法通过构造一棵解空间树(如排列树或子集树)来搜索最优解。它利用限界函数剪枝,避免无效的搜索路径,从而提高效率。对于转载问题,解空间树的每个节点代表一种可能的资源配置方案或路径选择方案。 - **分支**:将当前节点扩展为多个子节点,每个子节点代表一种可能的选择。 - **限界**:使用限界函数评估子节点的潜力,如果某个子节点不可能产生优于当前最优解的结果,则将其剪枝。 #### 3. 算法实现 以下是基于分支限界法解决转载问题的伪代码实现: ```python from queue import PriorityQueue def branch_and_bound(cost_matrix, n): # 初始化优先队列,用于存储活结点 pq = PriorityQueue() # 初始状态:从节点0出发,路径代价为0 pq.put((0, [0], 0)) # (当前代价, 当前路径, 上一个访问节点) min_cost = float(&#39;inf&#39;) # 记录当前最优解 best_path = [] # 记录当前最优路径 while not pq.empty(): current_cost, path, last_node = pq.get() # 如果当前路径已经包含所有节点,检查是否形成环路 if len(path) == n: # 添加返回起点的成本 total_cost = current_cost + cost_matrix[last_node][0] if total_cost < min_cost: min_cost = total_cost best_path = path[:] + [0] continue # 枚举下一个可选节点 for next_node in range(n): if next_node not in path: # 避免重复访问 new_cost = current_cost + cost_matrix[last_node][next_node] # 使用限界函数剪枝 if new_cost < min_cost: new_path = path[:] + [next_node] pq.put((new_cost, new_path, next_node)) return min_cost, best_path ``` #### 4. 案例分析 假设有一个转载问题,涉及5个节点(编号为0至4),每个节点之间的传输成本如下表所示: | | 0 | 1 | 2 | 3 | 4 | |---|----|----|----|----|----| | 0 | ∞ | 10 | 15 | 20 | 25 | | 1 | 10 | ∞ | 35 | 25 | 20 | | 2 | 15 | 35 | ∞ | 30 | 10 | | 3 | 20 | 25 | 30 | ∞ | 15 | | 4 | 25 | 20 | 10 | 15 | ∞ | 目标是从节点0出发,经过所有其他节点一次且仅一次,最后回到节点0,使得总成本最小。 - **初始状态**:从节点0出发,路径为[0],当前代价为0。 - **扩展节点**:依次选择未访问的节点进行扩展,并计算新的路径代价。 - **限界剪枝**:如果某条路径的当前代价已经超过已知最优解,则停止扩展该路径。 - **最终结果**:通过分支限界法,可以得到最优路径及其对应的最小成本。 #### 5. 优势与局限性 - **优势**: - 分支限界法能够有效地减少搜索空间,提高求解效率。 - 适用于求解最优解的问题,尤其是当解空间较大时。 - **局限性**: - 对于非常大的问题规模,仍然可能存在指数级的时间复杂度。 - 需要设计合适的限界函数以确保剪枝的有效性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ImSev7en_1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值