与presolve增量解决是如何工作的?
回答你好,
我添加了一些约束模型,称为model.solve(),这似乎触发presolve。
优化模型与2241行、5671列,339845 0
…
Presolve删除1234行和4072列
Presolve时间:0.04秒
Presolved: 1007行、1599列,83284 0
然后我添加了一些新的约束条件(边界)模型。这一次我叫model.solve(),似乎presolve不再触发了。
它只是打印出并开始解决:
优化模型与2241行、5671列,339845 0
我写信是想问的第二个解决()调用利用presolve运行在第一次解决()调用。
谢谢!
-
你好,
你能提供更多的日志输出吗?你能提供更多的信息关于你的模型和代码片段的你如何称呼Model.optimize ()函数两次?
一般来说,Gurobi总是试图利用信息从先前的运行。当解决一次MIP,随后添加一个约束,然后再解决MIP, Gurobi将首先检查是否最优解的解决提供了一个初始可行点第二个优化。为有限合伙人Gurobi将试图重用最佳依据第二优化运行,不得打印presolve消息。
最好的问候,
Jaromił0 -
嗨Jaromil,多谢你的响应。
是的,所以我要处理一个问题涉及到线性约束和我打电话的析取Gurobi每个LP子问题来解决。
说我有一个析取约束1 x1 < < = = 3 \ / 2 x1 < < = = 0连同其他一些线性约束。
我第一次添加这些模型和线性约束除了以下约束:
2 < = x1 < = 3
本质上是一个放松的脱节。
然后,我叫
model.optimize ()
接下来,我部门脱节和添加新的边界
1 x1 < < = = 3
然后我叫model.optimize ()。
最后,我尝试其他分支:
2 x1 < < = = 0
和调用model.optimize ()。
我意识到Gurobi现在支持分段线性约束和MIP编码可以有相同的问题。但是我的程序需要一些更细粒度的控制,并在每个搜索解决LP后状态。我想知道这将创建多少开销。
这是这个重复的日志调用有限合伙人的过程
0 -
你好,
只因为你是改变变量范围,双重基础保持可行和Gurobi可以利用这些信息从先前的优化运行进行热启动。因此,你看不到presolve输出为每个优化因为Gurobi不必从头开始。
你可以添加一个析取约束使用addGenConstrOr ()函数。这种方式,你不需要自己分支,但是你失去了分支控制。显然,这取决于你的程序在做什么在两个优化,您可能需要自己控制分支的一步。最好尝试两种方法,找出最适合您的程序。
最好的问候,
Jaromił1 -
嗨Jaromil,
谢谢你的信息!这是非常有用的!
安德鲁
0
请登录留下你的评论。
评论
4评论