如何在我们的 MIP 问题中使用 or-tools 设置像 y = max(x1,x2,x3) 这样的等式约束?

Posted

技术标签:

【中文标题】如何在我们的 MIP 问题中使用 or-tools 设置像 y = max(x1,x2,x3) 这样的等式约束?【英文标题】:How to set an equality constraint like y = max(x1,x2,x3) in our MIP problem with or-tools? 【发布时间】:2019-05-22 18:29:23 【问题描述】:

我使用 or-tools 来解决 MIP 问题,我想添加一个变量 y 等于其他变量 Xi 中的最大值的约束。例如:y = max(x1,x2,x3)。 or-tools 中是否有任何 max 函数可以做到这一点?

我可以添加 4 个约束,例如:

y >= x1
y >= x2
y >= x3
y <= MAX  # where MAX is the upper bound of y.

但可能会出现错误的情况

x3 >= y.

【问题讨论】:

你的意思是max([x1,x2,x3])? 是的!这就是我的意思。 这不起作用。 Python 解释 max() 并且不将其传递给求解器。 【参考方案1】:

使用 python 的 max() 运算符不起作用。 你应该看看文献

见:https://www.leandro-coelho.com/how-to-linearize-max-min-and-abs-functions/

【讨论】:

很好的答案。现在我将如何考虑超过 2 个变量中的 max()?【参考方案2】:

只要把它放到一些简单的结构中,比如:

-元组max((x1,x2,x3))

-列表max([x1,x2,x3])

-或设置max(x1,x2,x3)

最后一种情况是最好的,因为在检查差异之前消除重复。

【讨论】:

我不知道我们可以简单地使用 max()。我认为图书馆有一个特殊的功能。例如,Gurobi 有自己的函数 grb.max_()。我会试试这个!谢谢! 我尝试并得到以下 ValueError:线性求解器不支持运算符“”。你知道为什么吗? 因为 python 将 max() 解释为一组函数。它不会将其传递给求解器。

以上是关于如何在我们的 MIP 问题中使用 or-tools 设置像 y = max(x1,x2,x3) 这样的等式约束?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 SCIP 求解器获得 Google OR-Tools 和 Python 中的相对 MIP 差距?

OR-Tools:获取每一个最优解

or-tools python中的变量除法

OR-Tools MIP Solver - 根据 int 定义目标,而不是 IntVar

Google OR-Tools(使用 SCIP 求解器) - 如何访问求解器找到的中间解决方案?

如何在 or-tools 中定义复杂的目标函数?