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

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

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

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

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

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

代码如下:

from gurobipy import GRB, GurobiError
import gurobipy as gp
from numpy import *
import math
import pandas as pdc=array([[0],[0],[0]])
Q=array([[0.2,0.3,-0.01],[0.3,2.4,0.5],[-0.01,0.5,1.1]])
A=array([[0.06,0.12,0.09],[1,1,1]])
b=array([[0.06],[1]])
c=array([[0],[0],[0]])
x=array([[0],[0],[0]])
y=array([[0],[0]])
k=1000
e=0.000001def guroby_solver(Q,A,b,c):try:m = gp.Model("QP_guroby")var = []constr = 0obj = 0for i in range(len(A[0])):var.append(m.addVar(lb=0, vtype=GRB.CONTINUOUS, name='var[%d]' % i))  #定义变量for i in range(len(A)):constr = 0for j in range(len(A[0])):if A[i][j] != 0:constr = constr + A[i][j] * var[j]m.addConstr(constr == b[i][0], name='constraint %d' % i)     #添加约束for i in range(len(A[0])):for j in range(len(A[0])):obj = obj + Q[i][j] * var[i] * var[j]for i in range(len(A[0])):obj = obj + c[i][0] * var[i]m.setObjective(obj, GRB.MINIMIZE)    #添加目标函数m.optimize()variable=[]for v in m.getVars():print(v.varName, v.x)variable.append(v.x)print('Obj:', m.objVal)except GurobiError:print('Error reported')return variable,m.objVal          #GUROBI求解器求解函数def newton(x,y,e,k,Q,A,b,c):def cal_pk(m):x_pk=zeros((len(m),1))for i in range(len(m)):x_pk[i][0]=math.sqrt(m[i][0]**2+1/(k**2))return x_pkdef cal_Fk(X,m):x_split=X[:m,:]y_split=X[m:,:]Fk_up=dot(A,cal_pk(x_split)-x_split)-bFk_down=cal_pk(x_split)+x_split+ \dot(A.T,y_split)+dot(Q,x_split)-dot(Q,cal_pk(x_split))-cFk=vstack((Fk_up,Fk_down))return Fkdef cal_Fk_grad(X,m,n):x_split=X[:m,:]Dk=zeros((m,m))for i in range(m):Dk[i][i]=x_split[i][0]/math.sqrt(x_split[i][0]**2+1/(k**2))O=zeros((n,n))Fk_grad_up=hstack((dot(A,Dk-identity(3)),O))Fk_grad_down=hstack((Dk+identity(3)+dot(Q,identity(3)-Dk),A.T))Fk_grad=vstack((Fk_grad_up,Fk_grad_down))return Fk_gradX=vstack((x,y))while True:if dot(cal_Fk(X,len(x)).T,cal_Fk(X,len(x)))<e:breakU=X-0.5*dot(linalg.inv(cal_Fk_grad(X,len(x),len(y))),cal_Fk(X,len(x)))V=X-dot(linalg.inv(cal_Fk_grad(U,len(x),len(y))),cal_Fk(X,len(x)))X=V+dot(linalg.inv(cal_Fk_grad(X,len(x),len(y))) \-2*linalg.inv(cal_Fk_grad(U,len(x),len(y))),cal_Fk(V,len(x)))re_x=X[:len(x),:]z=zeros((len(x),1))for i in range(len(x)):z[i][0]=abs(re_x[i][0])-re_x[i][0]mid=dot(Q,z)obj_fuc=dot(z.T,mid)+dot(c.T,z)print('高阶牛顿法的最优解为:',z)print('目标函数值为:',obj_fuc)return z,obj_fuc              #牛顿法求解函数df=pd.DataFrame(index=range(13),columns=['rp','z1_g','z2_g', \'z3_g','obj_g','z1_n', \'z2_n','z3_n','obj_n'])
for i in range(13):b[0][0]=0.06+i*0.005m,n=guroby_solver(Q,A,b,c)p,q=newton(x,y,e,k,Q,A,b,c)df['rp'][i]=b[0][0]df['z1_g'][i]=m[0]df['z2_g'][i]=m[1]df['z3_g'][i]=m[2]df['obj_g'][i]=ndf['z1_n'][i]=p[0][0]df['z2_n'][i]=p[1][0]df['z3_n'][i]=p[2][0]df['obj_n'][i]=q[0][0]
df.to_csv('Result.csv')     #将计算结果导入excel

参考文献:

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

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

  1. 常用算法 之二 牛顿迭代法求解PT100温度(高阶方程求解)

    问题   在最近的工作中用到了PT100铂电阻,它适用于医疗.电机.工业.温度计算.卫星.气象.阻值计算等高精温度设备,应用范围非常之广泛.类似的还有PT1000.   PT后的100即表示它在0℃时 ...

  2. 机器学习笔记之概率图模型(四)基于贝叶斯网络的模型概述

    机器学习笔记之概率图模型--基于贝叶斯网络的模型概述 引言 基于贝叶斯网络的模型 场景构建 朴素贝叶斯分类器 混合模型 基于时间变化的模型 特征是连续型随机变量的贝叶斯网络 动态概率图模型 总结 引言 ...

  3. 高阶系统怎么用matlab降阶,一种基于非线性规划的高阶系统最优降阶方法

    一种基于非线性规划的高阶系统最优降阶方法 [技术领域] [0001] 本发明涉及一种基于非线性规划的高阶系统最优降阶方法,它是一种线性时不变 系统的最优降阶方法,是针对单输入单输出系统给出的一种使得降 ...

  4. 基于实验数据的轮胎模型

    参考CarSim的轮胎公式,本篇介绍一种基于实验数据的轮胎模型.输入为垂直力,侧偏角,外倾角,滑移率,输出为牵引力,侧向力和回正力矩.模型对轮胎进行了简化,不考虑路面摩擦,车速及轮胎Mx,My转矩.程 ...

  5. 基于检索的自然语言处理模型研究梳理

    © 作者|张北辰 研究方向 | 自然语言处理 导读 大规模预训练模型可以隐式的编码知识并应用于下游任务,为开放域问答.对话.摘要等任务带来了巨大的性能提升.然而不断扩大语言模型参数量以及训练数据规模也 ...

  6. 赛桨PaddleScience v1.0 Beta:基于飞桨核心框架的科学计算通用求解器

    近年来,关于AI for Science的主题被广泛讨论,重点领域包含使用AI方法加速设计并发现新材料,助力高能物理及天文领域的新问题探索,以及加速智慧工业实时设备数据与模型的"数字孪生&q ...

  7. 【2021年数学建模国赛C题第一问】基于TOPSIS法评价类模型

    根据附件 1,对 402 家供应商的供货特征进行量化分析,建立反映保障企业生产重要性的数学模型,在此基础上确定 50 家最重要的供应商,并在论文中列表给出结果. 一.问题重述 1.1问题背景 1.2需 ...

  8. 基于MATLABCPLEX 的机组最优组合,成功求解表格化,图示化的机组组合结果(学习参考)

    背景概述 MATLAB是是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,是科研中不可缺少的建模工具. IBM CPLEX ...

  9. [论文]基于强化学习的无模型水下机器人深度控制

    基于强化学习的无模型水下机器人深度控制 摘要 介绍 问题公式 A.水下机器人的坐标框架 B.深度控制问题 马尔科夫模型 A.马尔科夫决策 B.恒定深度控制MDP C.弯曲深度控制MDP D.海底追踪的 ...

  10. matlab油气田渗流,基于有限差分的油水兩相渗流方程求解油藏数值模拟毕业设计稿.doc...

    基于有限差分的油水兩相渗流方程求解油藏数值模拟毕业设计稿 本 科 毕 业 设 计(论文) 基于有限差分的油水两相渗流方程求解 学生姓名: 学 号: 专业班级: 指导教师: 2012年 06 月 20 ...

最新文章

  1. 用户sa 登陆失败 SQLServer 错误18456 图解
  2. 在谈PHP中的 抽象类(abstract class)和 接口(interface)
  3. microsoft office 卸载不了
  4. Django - 内置admin
  5. 你画我猜微擎版小程序源码
  6. 华三 h3c Vlan静态路由
  7. 哥,我跟你讲,我想创业
  8. 智子社区顾问白硕:人工智能的诗与远方,一文读懂NLP起源、流派和技术
  9. 一万块内工作站型计算机配置,1.5万元i7-7700K用于图形工作站高端电脑配置推荐...
  10. 【转】win7 旗舰版激活密钥
  11. 大厂面试中HR可能会问到的问题
  12. linux mysql常用基本操作,Linux下MySQL数据库常用基本操作 一
  13. 2个相同的 stm32 can通讯不成功_CAN通讯系列--CAN通讯简介1
  14. Lession11 集合和泛型(ArrayList方法、Arraylist类、ArrayList添加对象、ArrayList长度、HashTable类、Hashtable类练习-----)
  15. vue调倍速后声音变了_pr加速人声后声音变调失真怎么办?
  16. C#基于联通短信Sgip协议构建短信网关程序.net
  17. 云管理平台的安全措施
  18. EDA-什么是综合?什么是适配?
  19. C#实现删除自身程序
  20. Windows10如何设置为免密码登录?

热门文章

  1. 计算机科学导论填空题,计算机科学导论习题
  2. java 高级笔试题_JAVA高级工程师笔试题及答案
  3. 小编详解网络蜘蛛的安全隐患及预防方法
  4. 【NOIP2013提高组】华容道
  5. Python科学计算初探——余弦相似度
  6. 斐讯k1潘多拉专版固件_斐讯K1、K2路由器刷机Breed/华硕老毛子、梅林、潘多拉/openwrt固件...
  7. c语言运动员成绩查询,运动会成绩管理系统
  8. 清华大学计算机信息学院舒教授,清华大学出计算机与信息分社.ppt
  9. 儿童学计算机编程好处,十个理由告诉你孩子为什么要学习编程?
  10. linux命令大全---入门篇(菜鸟必会)