You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

手动实现Benders分解的性能优化及核心点选择等技术咨询

关于Docplex手动实现Benders分解的性能优化问题

我在Docplex上手动实现了Benders分解求解问题,需要存储部分变量传递给主问题或子问题,但问题规模增大后运行速度明显变慢。

当前变量存储与更新逻辑

我用numpy数组存储变量:

alpha_bar_bd = np.zeros((demand,facility))
beta_bar_bd = np.zeros((demand))

每次迭代中按如下方式更新:

for i in range(1, demand + 1):
    beta_bar_bd[i-1] = beta_bd[i].solution_value
    for j in range(1, facility + 1):
        alpha_bar_bd[i-1, j-1] = alpha_bd[i, j].solution_value

注意到这些数组的解值大多为0,仅选中的部分设施对应的值非零,想知道能否仅聚焦非零元素进行安全更新,避免信息丢失?

另外,我通过字典定义CPLEX变量:

# Define sets
alpha_bd = [(i, j) for i in range(1, demand+1) for j in range(1, facility + 1)]

# Define variables
alpha_bd = m_bd.continuous_var_dict(alpha_bd, name="alpha")

其中添加约束的操作耗时最长:

m_bd_ub.add_constraint(theta_bd <= sum(
    (u_bd[j] * alpha_bd[i, j].solution_value) for i in range(demand) for j in range(facility)) + sum(
    ((-u_bd[j] + 1) * pi_bd[i, j].solution_value)
    for i in range(demand) for j in range(facility)) + sum(
    (y_bd[j] * eta_bd[i, j].solution_value) for i in range(demand) for j in range(facility)) + sum(
    zeta_bd[i].solution_value for i in range(demand)), ctname='new constraint')

咨询问题

  1. 如何优化上述操作以提升运行速度?
  2. 已知Pareto最优割可提升收敛速度,但核心点选择不当反而会增加计算耗时,请问如何有效选择核心点?
  3. 我尝试通过以下方式用numpy数组定义变量,但未提升速度,此情况是否正常?是否操作有误?
alpha_bd = np.array([[m_bd_lb.continuous_var(name='alpha_bd_{0}_{1}'.format(i, j), lb=0) for j in range(1, facility + 1)] for i in range(1, demand + 1)])

内容的提问来源于stack exchange,提问作者diabolik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:25:32