二次规划问题(Quadratic programming,QP)指包含二次项的问题,基本型为

min \ \frac{1}{2} x^{^{T}}Gx+b^{^{T}}x

s.t. \ c^{T}x \geq 0

Gurobi是一种数学规划的商业求解器,能够快速、有效解决线性规划、二次规划、整数规划等问题,本文采用python调用Gurobi模块实现二次规划求解。

求解以下二次规划问题:

min \ 2x_{1}^{2}-4x_{1}x_{2}+4x_{2}^{2}-6x_{1}-3x_{2}+2x_{3}

  s.t.\ x_{1}+x_{2}+x_{3}\leq 3

         4x_{1}+x_{2}\leq 6

         x_{1},x_{2},x_{3}\geq 1

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)。

注意,这里介绍了一种循环的方法来建立相同表述的约束条件,例如x_{1},x_{2},x_{3}\geq 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))

实际上针对 x_{1},x_{2},x_{3}\geq 1 这个约束完全不需要在约束条件里设置,只需要在定义决策变量时将 下界设为1就可以了,这里只是举个例子来介绍约束条件的批量输入小技巧。

X = M_QCP.addVars(3,lb=1, ub=1e4, name="X")
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐