Python CPLEX从不可行的解决方案开始

Python CPLEX从不可行的解决方案开始,python,linear-programming,cplex,Python,Linear Programming,Cplex,我目前解决了一个(整数)LP问题,其中包括以下作为伪代码的数学约束 Packages_T1 + Packages_T2 + Packages_T3 + RPackages = 25 它表示三个包装车(T1、T2和T3),每个包装车可分配包装,加上目标函数中使用的剩余/溢出包装变量。当前值25表示总包装需求 假设我想重新解决这个问题,但将当前25包的需求更改为35包。当我从上一个解决方案开始,使用25个包时,CPLEX错误地指出所提供的解决方案不可行:这非常有意义。但是,它随后无法修复以前的解决

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

Packages_T1 + Packages_T2 + Packages_T3 + RPackages = 25
它表示三个包装车(T1、T2和T3),每个包装车可分配包装,加上目标函数中使用的剩余/溢出包装变量。当前值25表示总包装需求

假设我想重新解决这个问题,但将当前25包的需求更改为35包。当我从上一个解决方案开始,使用25个包时,CPLEX错误地指出所提供的解决方案不可行:这非常有意义。但是,它随后无法修复以前的解决方案,即使最直接的方法是为每个约束“增加”
RPackages
变量

我的问题是,是否有可能仍然使用以前解决的问题中的信息作为新问题的热身开始。例如,是否有办法从解决方案中删除所有
rpackage
,并重新计算它们以适应右侧的新约束?我想到的一个“最后手段”是自己手动重新计算所有这些
RPackages
值,并将它们替换到旧的解决方案中,但最好使用更自动化的解决方案。我使用标准的cplexpythonapi作为参考


提前谢谢。

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

让我举一个动物园的例子

给予


非常感谢您的迅速回复。这最后两条信息确实是我目前开始解决问题时观察到的。您是否知道有任何方法可以验证CPLEX是否实际使用(部分)开始时提供的不可行解决方案?如果您编写warmstart.add_var_value(nbbus40,8),那么您将在日志中看到“1/1 MIP启动提供的解决方案。MIP启动‘m1’定义的初始解决方案,目标为4000.0000”。这很有意义,假设nbbus40=8的值满足模型中的唯一约束,因此提供了可行的解决方案。在过去,当从现有解决方案重新启动同一问题时,这对我来说也很有效。然而,在我的新案例中,由于原始问题中描述的等式约束,现有的热启动解决方案在新问题中不可行。因此,我觉得CPLEX完全忽略了.sol文件中的信息,从零开始,尽管这并不是最佳选择。您有任何进一步的建议吗?您可以使用•级别4 MIPStartRepair:CPLEX尝试修复MIP start如果不可行,根据设置尝试修复不可行MIP start的频率的参数CPXPARAM\u MIP\u Limits\u repairties(即,IloCplex::Param::MIP::Limits::repairties)。在mdl.add\u mip\u start(warmstart,efforce\u level=4)中,我已经在代码中实现了这一点,但没有效果。它仍然会提示我消息,没有从MIP开始找到解决方案,CPLEX将保留一个以备可能的修复。我将尝试编辑我的MIP开始文件,使其符合右侧的新约束,如果失败,现在就从头开始运行程序。非常感谢你的努力!
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.