根据之前的文章线性规划和对偶规划学习总结,我们知道,解有三种状态:
1.无解;
2.有界解;
3.无界解。
在gurobi中,可以通过提取状态,知道模型状态。也就是利用对偶理论可以知道当前模型解的可能情况。
(1)获取解的状态
model.status
可能的取值如上所示。status==2,代表最优;status==3,代表无可行解;status==5,为无界解。刚好与最上边的三种状态对应。
(2)获取对应属性信息
a)最优,可以直接获取变量及其约束所对应的对偶变量值(也叫影子价格)
#获取变量的值
for v in model.getVars():
print(v.varName, '=', v.x)
# 获取对偶变量的值,与约束相关
model.getAttr(grb.GRB.Attr.Pi, model.getConstrs())
或者可以写成循环形式
for con in model.getConstrs(): #循环获取
print(con.ConstrName, '----', con.Pi)
b)无解,可以获取约束的极射线
for con in model.getConstrs():
print(con.ConstrName, '----', con.FarkasDual)
c)无界,可以获取无界射线
仅仅适用于无界线性模型,可以提供一个向量,当添加到任何可行解时,该向量将生成一个新的可行解,但会改进目标。
model.getAttr(grb.GRB.Attr.UnbdRay)
注意,后两种情况,必须在model.optimize()之前设定,model.setParam('InfUnbdInfo', 1) 。