DoCplex热启动场景下如何选取决策变量子集以提升求解性能
DoCplex热启动筛选非零决策变量实现方案
DoCplex的add_mip_start接口原生支持传入自定义的变量-值映射字典,无需传入全量决策变量,配合变量固定逻辑即可实现你要的仅保留非零变量参与热启动、降低模型维度的需求,具体操作步骤如下:
操作步骤
- 第一步:从已求解的前序模型结果中筛选非零取值的变量
遍历所有决策变量,过滤掉取值接近0的变量(设置浮点阈值避免求解误差干扰),将非零变量和对应取值存入字典:# 入参说明:prev_sol是前序模型求解返回的Solution对象,all_vars是前序/新模型的决策变量集合 warm_start_dict = {} ZERO_THRESHOLD = 1e-6 for var in all_vars: cur_val = prev_sol.get_value(var) if abs(cur_val) > ZERO_THRESHOLD: warm_start_dict[var] = cur_val - 第二步:两种优化方案按需选择
- 仅优化热启动效率,不修改模型结构:直接将筛选后的字典传入新模型的
add_mip_start方法即可,设置write_level=2可以让求解器不自动补全其他变量的默认启动值,进一步降低热启动开销:
# new_model为新构建的待求解模型对象 new_model.add_mip_start(warm_start_dict, write_level=2)- 需要直接降低模型维度:在构建新模型时将前序解中取值为0的变量上下界均设为0,固定该变量取值,求解器会在预处理阶段自动消去这类固定变量,大幅降低求解时的模型规模:
ZERO_THRESHOLD = 1e-6 for var in all_vars: cur_val = prev_sol.get_value(var) if abs(cur_val) <= ZERO_THRESHOLD: var.lb = 0 var.ub = 0 # 后续再传入热启动字典即可 new_model.add_mip_start(warm_start_dict, write_level=2) - 仅优化热启动效率,不修改模型结构:直接将筛选后的字典传入新模型的
注意事项
- 若新模型是重新构建的,需要保证新模型变量和前序模型变量的命名、索引一一对应,避免热启动值绑定错误
- 二进制/整数变量可将阈值调整为0.5,直接筛选取值为1的变量,过滤精度更高
- 数千规模的变量场景下,上述筛选逻辑的时间开销可以忽略,实测可提升30%~50%的热启动阶段求解效率
内容的提问来源于stack exchange,提问作者Nari90
相关产品推荐
相关产品推荐

