Gurobi + python 求解二次规划问题

二次规划问题(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")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值