【Gurobi】| Gurobi中非线性约束的对偶值的获取:QCP、QCQP、SOCP
作者:刘兴禄,清华大学,清华-伯克利深圳学院
欢迎关注我们的微信公众号 运小筹
Gurobi中非线性约束的对偶值是可以成功获取的,但是在求解模型之前,需要将参数QCPDual
设置为1.
注意:如果打开参数QCPDual
的话,求解器一般会来求解KKT 方程组来获得QCP的对偶变量。
下面是一个具体的例子。
from gurobipy import *
# Create a new model
m = Model("QCQP")
# Create variables
x = m.addVar(lb = 0, vtype=GRB.CONTINUOUS , name="x")
y = m.addVar(lb = 0, vtype=GRB.CONTINUOUS , name="y")
# Set objective
m.setObjective (1/2 * x * x + y * y - x * y - 2 * x - 6 * y, GRB.MINIMIZE)
m.setParam('QCPDual', 1)
# Add constraints
m.addConstr(-x + 2 * y <= 2, "c0")
m.addConstr(x * x + 1/2 * y <= 2, "c1")
m.addConstr (2 * x + y <= 3, "c2")
# Write model to file
m.write("QCQP.lp")
# Solve the model
m.optimize ()
for con in m.getConstrs():
print(con.ConstrName, '----', con.Pi)
for con in m.getQConstrs():
print(con.QCName, '----', con.QCPi)
求解日志如下
Changed value of parameter QCPDual to 1
Prev: 0 Min: 0 Max: 1 Default: 0
Gurobi Optimizer version 9.0.1 build v9.0.1rc0 (win64)
Optimize a model with 2 rows, 2 columns and 4 nonzeros
Model fingerprint: 0xb070fdc1
Model has 3 quadratic objective terms
Model has 1 quadratic constraint
Coefficient statistics:
Matrix range [1e+00, 2e+00]
QMatrix range [1e+00, 1e+00]
QLMatrix range [5e-01, 5e-01]
Objective range [2e+00, 6e+00]
QObjective range [1e+00, 2e+00]
Bounds range [0e+00, 0e+00]
RHS range [2e+00, 3e+00]
QRHS range [2e+00, 2e+00]
Presolve time: 0.01s
Presolved: 8 rows, 8 columns, 16 nonzeros
Presolved model has 2 second-order cone constraints
Ordering time: 0.00s
Barrier statistics:
AA' NZ : 2.100e+01
Factor NZ : 3.600e+01
Factor Ops : 2.040e+02 (less than 1 second per iteration)
Threads : 1
Objective Residual
Iter Primal Dual Primal Dual Compl Time
0 -1.49326539e+01 -4.35523979e+00 1.76e+00 3.70e+00 4.65e+00 0s
1 -6.12239820e+00 -1.12395144e+01 1.94e-06 1.22e-01 5.19e-01 0s
2 -8.53301014e+00 -8.99477729e+00 1.54e-07 1.02e-03 4.24e-02 0s
3 -8.82682363e+00 -8.85269793e+00 3.11e-13 5.50e-06 2.35e-03 0s
4 -8.83955816e+00 -8.84007974e+00 1.03e-13 4.22e-09 4.74e-05 0s
5 -8.83999672e+00 -8.84000230e+00 3.74e-12 5.43e-11 5.08e-07 0s
Barrier solved model in 5 iterations and 0.02 seconds
Optimal objective -8.83999672e+00
Solving KKT system to obtain QCP duals...
c0 ---- -1.0799994965216462
c2 ---- -1.8399999978917783
c1 ---- -1.1253017667406413e-10
可以看到,日志中说
Solving KKT system to obtain QCP duals...
可见确实是通过求解KKT方程组获得的dual。
公众号往期推文如下