在线性问题中定义多个约束后,获取当前可能接受的变量边界

Posted

技术标签:

【中文标题】在线性问题中定义多个约束后,获取当前可能接受的变量边界【英文标题】:Get the current possible accepted bounds of a variable after having defined several constraints in a linear problem 【发布时间】:2019-12-10 08:50:56 【问题描述】:

基于以下线性问题的简单示例,在对变量 x 应用一些约束后,您将如何检索变量可能接受的边界?它应该返回两个参数:

    可能的最小值 (61.0) 最大可能值 (93.0)

使用 x.lb()x.ub() 返回在创建变量时分配给变量的边界,但不考虑对其应用的约束。

from ortools.linear_solver import pywraplp
# Create the linear solver with the GLOP backend.
solver = pywraplp.Solver('lp_pricing_problem', pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
# Define a variable with a range from 0 to 1000.
x = solver.NumVar(0, 1000, 'MyVariable')
# Define some constraints on it.
solver.Add(x <= 147)
solver.Add(x <= 93)
solver.Add(x >= 61)
solver.Add(x >= 17)

print(x.lb()) # 0.0
print(x.ub()) # 1000.0

# Minimize x
objective = solver.Objective()
objective.SetCoefficient(x, 1)
objective.SetMinimization()

status = solver.Solve()

# Print the solution
if status == solver.OPTIMAL:
    print(x.solution_value()) # 61.0

这个问题的真正目的是了解为什么求解器会返回 INFEASIBLE 状态,例如,当约束没有正确定义时:

solver.Add(x <= 147)
solver.Add(x <= 93)
solver.Add(x >= 61)
solver.Add(x <= 17)

在这种情况下,我想看看变量x必须小于等于17,同时大于等于61。如果你想一个更好的方法来调试这种问题,请不要犹豫,在这里分享。

非常感谢您的帮助和想法。

罗曼

【问题讨论】:

【参考方案1】:

将其作为目标。最小化和最大化这个变量。

【讨论】:

嗨 Laurent,非常感谢您的回答。但是,这只有在找到解决方案的情况下才有效,对吗?在问题的第二部分,这个约束会使其失败:solver.Add(x &lt;= 17) 当状态为 INFEASIBLE 时,有没有办法让优化器找到最佳解决方案? 没有意义,没有找到解决办法。 是的,我的评论不正确。我应该说:当我们有status == solver.INFEASIBLE 时,我们如何获得通过对x 应用约束得到的范围?也就是说,发现变量x必须小于等于17,同时又大于等于61。 没有好的解决方案。您可以扫描只有一个变量的线性约束。但是你会想推断如果 x + y >= 10,那么 x >= 10 - max(y)...继续,你会想要一个完整的传播。 为了让我的意思更清楚,假设你写 x >= 10; x

以上是关于在线性问题中定义多个约束后,获取当前可能接受的变量边界的主要内容,如果未能解决你的问题,请参考以下文章

Java 基础系列之volatile变量

【一个或多个ActiveX控件无法显示】和【在线视频问题】

多线程—— 内存可见性

Java并发之volatile二

一个具有多个可接受值的变量。这在Lua中可能吗?

微信小程序如何将接口获取的数据传递给自定义组件