pyomo热启动

时间:2019-03-19 21:08:36

标签: python cplex pyomo

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

solver.solve(instance,warmstart = True,tee = True)

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

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

1 个答案:

答案 0 :(得分:1)

确保为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将认为它不可行,并将拒绝您的解决方案。

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