手动实现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')
咨询问题
- 如何优化上述操作以提升运行速度?
- 已知Pareto最优割可提升收敛速度,但核心点选择不当反而会增加计算耗时,请问如何有效选择核心点?
- 我尝试通过以下方式用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
相关产品推荐
相关产品推荐

