python二次规划包cvxopt的应用
-
将二次规划模型转化成标准形式,如下:
转化过程:
-
Anaconda Prompt终端中安装cvxopt包
pip install cvxopt
- 代码求解
from cvxopt import solvers, matrix
#输入参数
a=matrix([1.3,1.7,1.6,2.0,2.4,2.0]) #
MC=10.0 #
MP=10.0 #
C=13.81 #
PP=67.6 #
r=matrix([0.5413,-0.5331,3.1365,-0.1012,0.2158,0.9516]) #
r=r/100 #单位是%
delta_s=matrix([0.0,-0.0052,-0.002852675,7.8E-05,0.0,-0.003913261]) #一阶差分
Q=215.72 #
ER=0.005
#ER=0
b1=23.65 #
B=46.53 #
#协方差
u = matrix([[ 0.56151323,0.02505385,0.13533642,0.00212289,0.49597174,0.41500665],
[0.02505385,0.0095071,0.02321269,0.00208772,0.00916027,0.00735012],
[0.13533642,0.02321269,0.16043025,0.00609671,0.17117526,0.13249022],
[0.00212289,0.00208772,0.00609671,0.0008067,0.00116325,0.00218411],
[0.49597174,0.00916027,0.17117526,0.00116325,0.49047643,0.39924501],
[0.41500665,0.00735012,0.13249022,0.00218411,0.39924501,0.34130143]])
#一阶差分协方差
v = matrix([[0.0,0.0,0.0,0.0,0.0,0.0],
[0,0.00129,0.00006,0,0,0.00018],
[0,0.00006,0.00001,0,0,0.00002],
[0,0,0,0,0,0],
[0,0,0,0,0,0],
[0,0.00018,0.00002,0,0,0.00018]])
#化标准格式的项
ADD=matrix([[(a[0]+MC),0.0,0.0,0.0,0.0,0.0],
[0.0,a[1],0.0,0.0,0.0,0.0],
[0.0,0.0,a[2]+MP,0.0,0.0,0.0],
[0.0,0.0,MP,a[3]+MP,0.0,0.0],
[0.0,0.0,MP,MP,a[4]+MP,0.0],
[0.0,0.0,MP,MP,MP,a[5]+MP]])
#目标函数1/2 x^Px+q^x
P =u+v+ADD # matrix里区分int和double,所以数字后面都需要加小数点
P=P*2
q = matrix([-2*MC*C,0.0,-2*MP*PP,-2*MP*PP,-2*MP*PP,-2*MP*PP])
#不等式约束Gx≤h
G = matrix([[-r[0]-delta_s[0],-1.0,0.0,0.0,0.0,0.0,0.0,0.0],
[-r[1]-delta_s[1],0.0,-1.0,0.0,0.0,0.0,0.0,0.0],
[-r[2]-delta_s[2],0.0,0.0,-1.0,0.0,0.0,0.0,-1.0],
[-r[3]-delta_s[3],0.0,0.0,0.0,-1.0,0.0,0.0,-1.0],
[-r[4]-delta_s[4],0.0,0.0,0.0,0.0,-1.0,0.0,-1.0],
[-r[5]-delta_s[5],0.0,0.0,0.0,0.0,0.0,-1.0,-1.0]])
h = matrix([-ER*Q,-b1,-0.0,-0.0,-0.0,-0.0,-0.0,-B])
#等式约束Ax=b
A=matrix([[1.0],[1.0],[1.0],[1.0],[1.0],[1.0]])
b=matrix([Q])
# 调用优化函数solvers.qp求解
sol = solvers.qp(P,q,G,h,A,b)
print(sol['x']) # 打印结果,sol里面还有很多其他属性,读者可以自行了解
打印结果
转载请注明出处,谢谢。