在线性问题中定义多个约束后,获取当前可能接受的变量边界
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 <= 17)
当状态为 INFEASIBLE 时,有没有办法让优化器找到最佳解决方案?
没有意义,没有找到解决办法。
是的,我的评论不正确。我应该说:当我们有status == solver.INFEASIBLE
时,我们如何获得通过对x
应用约束得到的范围?也就是说,发现变量x
必须小于等于17,同时又大于等于61。
没有好的解决方案。您可以扫描只有一个变量的线性约束。但是你会想推断如果 x + y >= 10,那么 x >= 10 - max(y)...继续,你会想要一个完整的传播。
为了让我的意思更清楚,假设你写 x >= 10; x
以上是关于在线性问题中定义多个约束后,获取当前可能接受的变量边界的主要内容,如果未能解决你的问题,请参考以下文章