python - Pyomo 热启动

标签 python cplex pyomo

我有一个 MIP 要使用 Pyomo 求解,并且我想为 cplex 设置初始解决方案。 所以谷歌搜索我发现我可以将实例的某些变量设置为某个值,然后执行此操作:

solver.solve(实例,warmstart=True,tee=True)

但是当我运行 cplex 时,它似乎没有使用热启动,因为例如我传递了一个值为 16 的解决方案,但在 5 秒内它返回了一个值为 60 的解决方案。 所以我不知道有什么错误或其他不起作用的东西。

附注 我不知道这是否是一个问题,但我的热启动解决方案仅将一些变量设置为一个值,但不是全部。可能有问题吗?

最佳答案

确保您向 CPLEX 提供的解决方案可行。否则,CPLEX 将拒绝它并从头开始。

如果您的解决方案可行,则 CPLEX 可能只是找到了比您的解决方案更好的解决方案,因为毕竟这是 CPLEX 的工作,并且根据我自己的经验,CPLEX 非常擅长于此。这是一个最大化问题吗?如果是这样,在您的示例中,CPLEX 找到了比您的解决方案 (objective=16) 更好的解决方案 (objective=60),这是预期的行为。

遗憾的是,CPLEX 在冗长方面通常很贪婪,因此很难从求解器日志中知道是否使用了热启动(不像其竞争对手 GUROBI,它清楚地写在日志中)。但是,您似乎使用 warmstart=True 参数正确启动了热启动。

但是,如果您的问题不是最大化问题,则 CPLEX 可能不会区分您指定值的变量和仍保留上次求解结果的变量。另外,考虑到所有未手动指定的值都是 CPLEX 之前找到的值,仅向一小部分变量赋予值可能会使问题变得不可行。例如:约束 x<=2y。求解器发现 x=2, y=1 作为可行解。您定义 x:=3,则不遵守您的约束(对于 CPLEX,y 仍然 =1,因此约束 x<=2y 为 3<=2,这是错误的)。 CPLEX 将认为它不可行并拒绝您的解决方案。

如果您绝对想在最终解决方案中使用自己的值,我可以为您提供的一个替代方案是,不要为变量定义值,而是创建一个显式定义变量值的约束。如果需要,此约束随后可以被“停用”。但要小心,因为这并不一定会产生最优解,而是“当某些变量具有特定值时的最优解”。

关于python - Pyomo 热启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55250019/

相关文章:

python - 如何有条件地抓取网站数据?

python-3.x - 如何设置索引变量的值? - 皮莫

pyomo - 为变量 pyomo 设置初始值和对偶值

python - 如何在 pyomo.environ 模块下创建二维集合对象

python - 如何对 Pandas 数据框的单行进行排序

python - 奇怪的 if 语句

python - 如何优雅地处理 Ctrl + C 并关闭 Discord Py 机器人?

android - 是否可以在 Android 应用程序中使用 CPLEX?

java - 更新半连续变量的下限不再使其保持半连续

python - 使用 python cplex 的 0-1 背包