逻辑benders分解

目录

1.可行割

(1)组合benders割(本质是cover cut 覆盖割)

(2)最小可行割(minimal infeasible set,MIS) 

2.最优割

(1)常规最优割

(2)analytical benders cut——需要严格的数学证明

注:

LBBD的两种实现方式:

branch and check步骤:


前文综述:

benders分解算法 逻辑思路整理(加星)-CSDN博客

以下默认为min问题。

——本文主体内容和图片来自李延通老师的ppt。

benders分解是指把问题分解为主问题和子问题。主问题松弛后得到的信息输入到子问题中,求解子问题后生成一些割加入到主问题中去。加入的割可以提升主问题的下界(主问题提供的解),继续反馈给子问题后,降低了上界(子问题提供的解),直到上下界相等,求解完成。

经典的benders分解,指的是子问题是线性规划问题;

基于整数的benders分解,指的是子问题是整数规划;

而基于逻辑的benders分解,指的是子问题返给主问题的割是根据逻辑得到的割。

对于调度问题,通常有以下几种。

1.可行割

类似背包约束。假设问题的上界是13。子问题得到的解为15,此时返回可行割。

(1)组合benders割(本质是cover cut 覆盖割)

即当前的解不合理,需要从当前被分配的工件集中去除至少1个工件。下图中M2机器至少得去除一个工件,\sum_{j\in R_{k}}^{}v_{jk}\leqslant \left | R_{k} \right |-1=4-1=3

将该cut加入到主问题中,告诉主问题下次必须得从R_{k}=\left \{ 1,3,5,6\right \}中去除至少1个工件,使得新工件集合数量\sum_{j\in R_{k}}^{}v_{jk}最多为3个。即下次主问题中必须有一个v_{jk}取值会有变化,从1变为0,即从原本的分配中被移除。

但是该cut效果有限,原因是,只能保证删除1个。删除1个后就失效了。需要我们继续添加割,此时迭代步骤会变多。

因此我们想要得到更好的可行割,更强的割,希望割去更多的工件,减少了迭代反复的次数,加速算法的收敛,求解效率会提高。

(2)最小可行割(minimal infeasible set,MIS) 

最小可行割就是为了解决上述问题而产生的。它计算了每个批次最多保存的工件的个数。

首先介绍最小子集:

即当前的≥上界,但再继续删除就<上界了,寻找这样的一个边界集合S_{k}

需要从R_{k}中依次移除工件,只要解≥上界,就依次移除,即v_{jk}=1变为v_{jk}=0。继续移除,直到移除后子问题的解(上界)<上界了,就得到最终的最小可行割S_{k},如V2所示。

2.最优割

主问题因为松弛掉部分约束,得到的是下界,是基于部分信息得到的决策。我们希望子问题得到一些割进而能提升主问题的下界。

(1)常规最优割

普适性比较强:

若下一次主问题求解时:

a)分配给机器k的工件仍为相同的一组工件v_{jk}=1,即\sum_{j\in R_{k}}^{}v_{jk}=\left | R_{k} \right |,此时有C_{max}=C_{max}^{\ast }\left ( R_{k} \right )

告诉主问题,假如下次你仍然分配这些工件给机器k,则最大完工时间如(V5)所示。

b)分配的解有变化,假如某工件从机器k上被移除,则右边为0或负数,此时V5是无效的。

总之该式给与了一个下界。

由于上述割在被移除的时候,不等式右边直接缩减为0,因此需要考虑增强技术。常用的是分析bender割。

(2)analytical benders cut——需要严格的数学证明

以带有设置时间的UPM问题为例,通常\Delta _{j}=p_{kj}+max_{i\in R_{k}, i\neq j}\left \{ s_{kij} \right \}

分析如下:假如将工件j移除,则v_{jk}=0。则最多减少了加工时间p_{kj}以及可能的最大设置时间s_{kij}\left ( i\neq j \right )。这是最多可能减少的部分,因此为主问题提供了一个更紧的下界。

注:

LBBD的两种实现方式:

branch and check步骤:

(1)因为子问题需要多次求解,因此当主问题复杂,子问题简单时,适合用本方法。特别是branch and check法,主问题只需要求解一次。更加的适用。

(2)其它的一些加强技术包括,提升主问题的下界。因为初始主问题包含的信息很少,所以最好加入一些有效不等式,得到一些较好的下界。换句话说,有效不等式加入主问题中很有用。

(3)其它的一些加强的benders cut。

### Benders Decomposition 的实际应用案例与代码实现 #### 背景介绍 Benders 分解是一种用于解决大规模优化问题的有效方法,尤其适用于具有特定结构的混合整数线性规划 (MILP) 或两阶段随机规划问题。通过将原问题分解为主问题 (Master Problem, MP) 和子问题 (Subproblem),它能够显著降低计算复杂度并提高求解效率。 以下是有关 Benders 分解的应用实例及其代码实现的相关讨论: --- #### 应用领域概述 Benders 分解被广泛应用于多个领域,包括但不限于供应链管理、运输调度、电力系统优化以及金融投资组合设计等问题。其核心思想在于利用对偶理论生成切割平面 (cutting plane),从而逐步逼近最优解[^1]。 --- #### Python 实现示例 以下是一个基于 `Pyomo` 工具包的简单 Benders 分解算法实现,该示例解决了经典的生产计划问题。 ```python from pyomo.environ import * import numpy as np def benders_decomposition(): # 创建模型对象 model = ConcreteModel() # 参数定义 num_products = 2 # 假设有两种产品 demand = {0: 50, 1: 30} # 各种产品的市场需求量 capacity = 80 # 总生产能力限制 # 主问题变量 model.x = Var(range(num_products), within=NonNegativeReals) # 子问题变量 sub_model = ConcreteModel() sub_model.y = Var(within=NonNegativeReals) # 定义目标函数 def master_objective_rule(model): return sum(10 * model.x[i] for i in range(num_products)) + sub_model.y model.obj = Objective(rule=master_objective_rule, sense=maximize) # 添加容量约束到主问题 def capacity_constraint_rule(model): return sum(model.x[i] for i in range(num_products)) <= capacity model.capacity_con = Constraint(rule=capacity_constraint_rule) # 初始化迭代过程 cuts = [] iteration_limit = 100 tolerance = 1e-6 gap = float('inf') iter_count = 0 while abs(gap) > tolerance and iter_count < iteration_limit: # 解决主问题 solver = SolverFactory('glpk') results = solver.solve(model) # 获取当前决策变量值 x_values = [model.x[i].value for i in range(num_products)] # 构建子问题 sub_model.sub_obj = Objective(expr=sum(x_values[i]*sub_model.y for i in range(num_products)), sense=minimize) sub_results = solver.solve(sub_model) dual_value = sub_model.dual[sub_model.sub_obj] # 更新割集 cut_expr = sum(dual_value * x_values[i] for i in range(num_products)) cuts.append(cut_expr) # 将新割加入主问题 def add_cut_rule(model, k): return cuts[k] >= sub_model.y setattr(model, f'cut_{iter_count}', Constraint(rule=add_cut_rule)) # 计算上下界差距 upper_bound = value(model.obj) lower_bound = max([c.value() for c in cuts]) gap = upper_bound - lower_bound iter_count += 1 return model, iter_count benders_decomposition() ``` 上述代码展示了如何使用 Pyomo 来实现基本的 Benders 分解框架,并针对具体问题动态添加割集以改进解决方案的质量[^2]。 --- #### SCIP 中的实践指南 对于希望深入学习 Benders 分解技术的研究人员来说,《SCIP | 数学规划求解器 SCIP 超详细的使用教程》提供了详尽的操作指导和高级功能解析。特别是,在处理 CPLEX LP 文件时,可以通过指定文件路径读取输入数据来简化配置流程。 例如,加载外部 LP 数据的方法如下所示: ```python scip_instance.readProblem("path/to/cplex_file.lp") ``` 这使得用户可以直接导入标准格式的数据源而无需手动编码转换逻辑。 --- ####
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值