为什么同样的Gurobi LP型号双价不同?
Why are the dual prices different for the same Gurobi LP model?
环境:Gurobi 8.1.1 + python3
我尝试构建以下线性规划模型并打印对偶价格。
min 100 x + y
s.t。 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
编辑:
这其实是退化造成的。增加变量的上限可以消除退化。 See the answer here.
环境:Gurobi 8.1.1 + python3
我尝试构建以下线性规划模型并打印对偶价格。
min 100 x + y
s.t。 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
编辑:
这其实是退化造成的。增加变量的上限可以消除退化。 See the answer here.