MILP优化中缩小目标函数量级得到更优解的问题咨询
MILP目标函数缩放后得到更优解的原因及规避方案
产生原因
- 数值浮点截断误差:你指定的
SOLVER=1对应APOPT混合整数求解器,内部采用双精度浮点数运算。当目标函数量级达到1e6级别时,单个improvements离散变量调整带来的数百到数千的收入提升,会因浮点数有效位数限制被判定为可忽略的微小扰动,导致分支定界过程中错误裁剪存在更优解的分支。即便你设置了minlp_gap_tol=1.0e-10、minlp_integer_tol=1.0e-10,大数量级下相对误差对应的绝对误差可达0.0001~0.1级别,足够淹没小幅度的目标提升。 - 目标与约束量级不匹配:你的约束条件(总设施数≤50、商业贡献≤100)均为100以内的小量级,和百万级的目标函数存在4~5个数量级的差距。求解器默认的数值缩放策略会优先保障约束可行性,降低目标函数的数值优先级,导致部分可行的优化方向被忽略。
- 相对Gap判定偏差:
minlp_gap_tol为相对Gap阈值,计算公式为(上界-下界)/上界。未缩放时1e6量级的目标下,你观察到的10997.87的收入差值对应的相对Gap仅为1.1e-3,若求解过程中触发了迭代次数、时间限制等终止条件,求解器很可能在达到你设置的1e-10严格Gap之前就提前终止,输出次优解。
规避方案
- 建模阶段统一量纲缩放:提前对目标函数和约束进行量级缩放,将所有数值控制在1~1e4的合理区间。你本次将目标除以100的操作是完全合规的优化手段,得到最优离散变量组合后再乘以100还原真实收入即可,不会对变量组合的最优性产生任何影响。
- 补充设置绝对Gap阈值:在原有
minlp_gap_tol的基础上,新增minlp_gap_abs_tol参数,按照业务可接受的最小优化幅度设置,例如你能接受的最小收入提升为10,就设置m.options.minlp_gap_abs_tol = 10,可彻底避免大目标量级下相对Gap的判定偏差。 - 调整求解器数值精度参数:将Gekko的全局数值精度阈值
m.options.eps调整为1e-12,进一步降低浮点截断误差的影响,配合已设置的minlp_integer_tol提升整数解的判定精度。 - 拆解目标函数避免过大系数:如果你的自定义目标规则中存在单变量系数超过1e4的情况,尽量将系数拆分或者提前做归一化处理,避免不同项的系数差超过3个数量级。
内容的提问来源于stack exchange,提问作者Mathias Sven
相关产品推荐
相关产品推荐

