python - 为什么同一 Gurobi LP 型号的双重价格不同?
问题描述
环境:Gurobi 8.1.1 + python3
我尝试构建以下线性程序模型并打印对偶价格。
最小 100 x + y
st x + y >= 1 && 0 <= x, y <= 1
以下是代码:
from gurobipy import *
m = Model()
x = m.addVar(name='X', vtype=GRB.CONTINUOUS, ub=1, lb=0, obj=0)
y = m.addVar(name='Y', vtype=GRB.CONTINUOUS, ub=1, lb=0, obj=0) # first x then y
m.setObjective( x + 100 * y , sense=GRB.MINIMIZE )
m.addConstr( x + y >= 1 )
m.optimize()
print(m.getAttr('Pi', m.getConstrs()))
输出为 1。
但是当两个变量的定义顺序不同时,看下面的代码,输出是100。
from gurobipy import *
m = Model()
y = m.addVar(name='Y', vtype=GRB.CONTINUOUS, ub=1, lb=0, obj=0)
x = m.addVar(name='X', vtype=GRB.CONTINUOUS, ub=1, lb=0, obj=0) # first y then x
m.setObjective( x + 100 * y , sense=GRB.MINIMIZE )
m.addConstr( x + y >= 1 )
m.optimize()
print(m.getAttr('Pi', m.getConstrs()))
为什么它们不同?
解决方案
我猜这是因为在预求解中消除了所有变量,并且不需要单纯形来解决问题。如果禁用预求解,则两个公式的对偶值相同:m.Params.Presolve = 0
编辑:
这实际上是由于退化。增加变量的上限可以消除退化。在这里查看答案。
推荐阅读
- php - 我的代码中是否有错误我的footer.php?
- geolocation - HBase 中的 Geomesa 属性索引
- php - Sylius:如何使用 SyliusResourceBundle 正确呈现实体上的图像预览?
- c++ - ssh_channel_write 和 read 之间的时间异常长?
- typescript - 没有从坐标获取时区
- c# - 以编程方式在 Win 10 中切换焦点辅助模式
- intellij-idea - 如何启用 Flutter/Dart 语言实验?
- windows-7 - 为什么格式化 win 7 电脑到 windows 10 的 CPU-Z bench 分数翻了一番?
- ios - 如何使用昵称代替全名 Apple Developer Account?
- css - Angular 7/CSS 动画:将焦点上的表单字段扩展指定数量?