Python CPLEX 从不可行解开始热启动

Python CPLEX warm starts from infeasible solution

我目前已经解决了一个(整数)LP 问题,其中包括以下作为伪代码的数学约束。

Packages_T1 + Packages_T2 + Packages_T3 + RPackages = 25

它代表三辆包裹卡车(T1、T2 和 T3),每辆包裹都可以分配,加上一个 residual/spilled 包裹变量,它在 objective 函数中使用。当前值25代表包裹总需求。

假设我想重新解决这个问题,但将当前的 25 包需求更改为 35 包。当我从之前的包含 25 个包的解决方案热启动时,CPLEX 错误地指出所提供的解决方案不可行:这非常有道理。然而,它随后无法修复以前的解决方案,即使最直接的方法是为每个这些约束“向上”RPackages 变量。

我的问题是是否有可能仍然使用以前解决的问题的信息作为新问题的热启动。有没有办法,例如,从解决方案中删除所有 RPackages 并重新计算它们以适应新的约束右侧?我想到的“不得已”的方法是自己手动重新计算所有这些 RPackages 值并在旧解决方案中替换它们,但首选更自动化的解决方案来解决此问题。我正在使用标准 CPLEX Python API 作为参考。

提前致谢。

即使热启动不可行,CPLEX 也可以使用一些信息。

让我使用

中的动物园示例

https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/

from docplex.mp.model import Model

mdl = Model(name='buses')
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)

warmstart=mdl.new_solution()
warmstart.add_var_value(nbbus40,4)
warmstart.add_var_value(nbbus30,0)
mdl.add_mip_start(warmstart)


sol=mdl.solve(log_output=True)

for v in mdl.iter_integer_vars():
    print(v," = ",v.solution_value)

给予

Warning:  No solution found from 1 MIP starts.
Retaining values of one MIP start for possible repair.