二次规划问题(Quadratic programming,QP)指包含二次项的问题,基本型为
Gurobi是一种数学规划的商业求解器,能够快速、有效解决线性规划、二次规划、整数规划等问题,本文采用python调用Gurobi模块实现二次规划求解。
求解以下二次规划问题:
python代码如下
from gurobipy import *
import gurobipy
# 创建模型
M_QCP = Model("QCP")
X = M_QCP.addVars(3,lb=0, ub=1e4, name="X")
# # 更新变量环境
M_QCP.update()
# 设置目标函数
M_QCP.setObjective(2 * X[0] ** 2 - 4 * X[0] * X[1] + 4 * X[1] ** 2 - 6 * X[0] - 3 * X[1] + 2 * X[2], GRB.MINIMIZE)
# 添加约束
M_QCP.addConstr(X[0] + X[1] + X[2] <= 3, "Con1")
M_QCP.addConstr(4 * X[0] + X[1] <= 6, "Con2")
conn = [X[0]-1,X[1]-1,X[2]-1]
for i in range(len(conn)):
M_QCP.addConstr(conn[i] >= 0, "Con%d"%(i+2))
M_QCP.Params.NonConvex = 2
M_QCP.optimize()
M_QCP.write("QCP.lp")
print('=======================')
print(' =========最优解======== ')
print('===================')
print('Obj is :', M_QCP.ObjVal) # 输出目标值
print('x is :', X[0],X[1],X[2]) # 输出 x 的值
运行结果:
目标函数最小值-5,此时X为(1,1,1)。
注意,这里介绍了一种循环的方法来建立相同表述的约束条件,例如。
conn = [X[0]-1,X[1]-1,X[2]-1]
for i in range(len(conn)):
M_QCP.addConstr(conn[i] >= 0, "Con%d"%(i+2))
实际上针对 这个约束完全不需要在约束条件里设置,只需要在定义决策变量时将 下界设为1就可以了,这里只是举个例子来介绍约束条件的批量输入小技巧。
X = M_QCP.addVars(3,lb=1, ub=1e4, name="X")