当前位置:   article > 正文

基于投资组合问题的凸二次规划模型及求解——Gurobi求解器+高阶牛顿法(python)_gurobi求解大规模问题

gurobi求解大规模问题

本学期上了最优化课程,学习到了一些凸优化的知识,想要尝试将这些优化理论应用到实际中。

这里基于均值-方差分析方法,针对以确定收益水平下的最小化风险为目标的投资组合问题建立了具有等式约束的凸二次规划模型,并分别利用GUROBI求解器和一种高阶牛顿算法对其进行求解。

模型描述如下(公式太多的地方就直接贴图片了):

分别利用Gurobi求解器和高阶牛顿法求解:

Gurobi:Gurobi是美国Gurobi Optimization公司开发的大规模优化求解器,目前已经成为综合能力全球领先的数学规划求解器,作为一个全局优化器,Gurobi支持的模型类型包括:连续和混合整数线性问题、凸目标或约束连续和混合整数二次问题、含有指对数、三角函数、高阶多项式目标和约束以及任何形式的分段约束的非线性问题等。另外,Gurobi提供了方便轻巧的API接口,支持C++、Java、Python等多种语言,同时支持包括Windows、Linux以及OS在内的多种平台。

基于绝对值光华逼近的高阶牛顿法(公式真的多我是真的懒,依旧贴图片):

代码如下:

  1. from gurobipy import GRB, GurobiError
  2. import gurobipy as gp
  3. from numpy import *
  4. import math
  5. import pandas as pd
  6. c=array([[0],[0],[0]])
  7. Q=array([[0.2,0.3,-0.01],[0.3,2.4,0.5],[-0.01,0.5,1.1]])
  8. A=array([[0.06,0.12,0.09],[1,1,1]])
  9. b=array([[0.06],[1]])
  10. c=array([[0],[0],[0]])
  11. x=array([[0],[0],[0]])
  12. y=array([[0],[0]])
  13. k=1000
  14. e=0.000001
  15. def guroby_solver(Q,A,b,c):
  16. try:
  17. m = gp.Model("QP_guroby")
  18. var = []
  19. constr = 0
  20. obj = 0
  21. for i in range(len(A[0])):
  22. var.append(m.addVar(lb=0, vtype=GRB.CONTINUOUS, name='var[%d]' % i)) #定义变量
  23. for i in range(len(A)):
  24. constr = 0
  25. for j in range(len(A[0])):
  26. if A[i][j] != 0:
  27. constr = constr + A[i][j] * var[j]
  28. m.addConstr(constr == b[i][0], name='constraint %d' % i) #添加约束
  29. for i in range(len(A[0])):
  30. for j in range(len(A[0])):
  31. obj = obj + Q[i][j] * var[i] * var[j]
  32. for i in range(len(A[0])):
  33. obj = obj + c[i][0] * var[i]
  34. m.setObjective(obj, GRB.MINIMIZE) #添加目标函数
  35. m.optimize()
  36. variable=[]
  37. for v in m.getVars():
  38. print(v.varName, v.x)
  39. variable.append(v.x)
  40. print('Obj:', m.objVal)
  41. except GurobiError:
  42. print('Error reported')
  43. return variable,m.objVal #GUROBI求解器求解函数
  44. def newton(x,y,e,k,Q,A,b,c):
  45. def cal_pk(m):
  46. x_pk=zeros((len(m),1))
  47. for i in range(len(m)):
  48. x_pk[i][0]=math.sqrt(m[i][0]**2+1/(k**2))
  49. return x_pk
  50. def cal_Fk(X,m):
  51. x_split=X[:m,:]
  52. y_split=X[m:,:]
  53. Fk_up=dot(A,cal_pk(x_split)-x_split)-b
  54. Fk_down=cal_pk(x_split)+x_split+ \
  55. dot(A.T,y_split)+dot(Q,x_split)-dot(Q,cal_pk(x_split))-c
  56. Fk=vstack((Fk_up,Fk_down))
  57. return Fk
  58. def cal_Fk_grad(X,m,n):
  59. x_split=X[:m,:]
  60. Dk=zeros((m,m))
  61. for i in range(m):
  62. Dk[i][i]=x_split[i][0]/math.sqrt(x_split[i][0]**2+1/(k**2))
  63. O=zeros((n,n))
  64. Fk_grad_up=hstack((dot(A,Dk-identity(3)),O))
  65. Fk_grad_down=hstack((Dk+identity(3)+dot(Q,identity(3)-Dk),A.T))
  66. Fk_grad=vstack((Fk_grad_up,Fk_grad_down))
  67. return Fk_grad
  68. X=vstack((x,y))
  69. while True:
  70. if dot(cal_Fk(X,len(x)).T,cal_Fk(X,len(x)))<e:
  71. break
  72. U=X-0.5*dot(linalg.inv(cal_Fk_grad(X,len(x),len(y))),cal_Fk(X,len(x)))
  73. V=X-dot(linalg.inv(cal_Fk_grad(U,len(x),len(y))),cal_Fk(X,len(x)))
  74. X=V+dot(linalg.inv(cal_Fk_grad(X,len(x),len(y))) \
  75. -2*linalg.inv(cal_Fk_grad(U,len(x),len(y))),cal_Fk(V,len(x)))
  76. re_x=X[:len(x),:]
  77. z=zeros((len(x),1))
  78. for i in range(len(x)):
  79. z[i][0]=abs(re_x[i][0])-re_x[i][0]
  80. mid=dot(Q,z)
  81. obj_fuc=dot(z.T,mid)+dot(c.T,z)
  82. print('高阶牛顿法的最优解为:',z)
  83. print('目标函数值为:',obj_fuc)
  84. return z,obj_fuc #牛顿法求解函数
  85. df=pd.DataFrame(index=range(13),columns=['rp','z1_g','z2_g', \
  86. 'z3_g','obj_g','z1_n', \
  87. 'z2_n','z3_n','obj_n'])
  88. for i in range(13):
  89. b[0][0]=0.06+i*0.005
  90. m,n=guroby_solver(Q,A,b,c)
  91. p,q=newton(x,y,e,k,Q,A,b,c)
  92. df['rp'][i]=b[0][0]
  93. df['z1_g'][i]=m[0]
  94. df['z2_g'][i]=m[1]
  95. df['z3_g'][i]=m[2]
  96. df['obj_g'][i]=n
  97. df['z1_n'][i]=p[0][0]
  98. df['z2_n'][i]=p[1][0]
  99. df['z3_n'][i]=p[2][0]
  100. df['obj_n'][i]=q[0][0]
  101. df.to_csv('Result.csv') #将计算结果导入excel

参考文献:

雍龙泉,贾伟,黎延海.基于光滑逼近函数的高阶牛顿法求解凸二次规划[J].科学技术与工程,2021,21(06):2151-2156. 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/593217
推荐阅读
相关标签
  

闽ICP备14008679号