四种规划-数学建模
1.线性规划 -->Liner Programming(LP)
1)目标函数+约束条件(均为线性函数)
a.目标函数
b.约束条件:等式约束和不等式约束
2)化为标准Matlab形式(min,<=)
[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
clear all; c=[2;3;-5]; A=[-2,5,-1;1,3,1]; b=[-10;12]; Aeq=[1,1,1]; beq=7; x=linprog(-c,A,b,Aeq,beq,zeros(1,3)); value=c'*x;
3)可以转化为线性规划的问题
a. min |x1|+|x2|+...+|xn| s.t. Ax<=b 目标函数不是线性函数,但可以通过u,v转换化为线性规划问题
b.运输问题(产销平衡)
c.指派问题(指派n个人做n项工作) -->若第i个人去做第j件工作,xij=1,否则xij=0;(0-1规划问题)
匈牙利算法:将系数矩阵进行变换
4)对偶理论
a.将等式约束转化为不等式约束
b.根据对偶理论已知对偶问题的最优解来求解原问题的最优解
5)灵敏度分析和参数线性规划
6)投资的收益和风险问题
a.模型假设:总体风险用投资项目中风险最大的一个来度量;n中资产投资项目相互独立
b.模型建立:建立风险目标函数和收益目标函数,收益目标函数中忽略交易定额的影响
c.将多目标规划模型转化为单目标规划模型(1.将其中一个目标函数界定为约束条件;2.通过权重将多目标函数化为单目标函数)
d.Matlab编程进行模型求解
e.以界定最大风险值为a将风险目标函数化为约束条件为例:从a=0开始,以步长为0.001进行循环搜索最佳风险度
clc,clear a=0; hold on while a<0.05 %界定最大风险度为0.05 c=[-0.05,-0.27,-0.19,-0.185,-0.185]; %收益目标函数系数矩阵 A=[zeros(4,1),diag([0.025,0.015,0.055,0.026])]; %风险系数矩阵,zeros(4,1)为银行存款无风险,diag将向量转化为对角矩阵 b=a*ones(4,1); Aeq=[1,1.01,1.02,1.045,1.065]; beq=1; LB=zeros(5,1); [x,Q]=linprog(c,A,b,Aeq,beq,LB); Q=-Q; plot(a,Q,'*r'); a=a+0.001; end xlabel('a'),ylabel('Q')
f.结果分析
2.整数规划
1)分支定界法 -->先求解线性规划问题得到最优解,分支,定界,剪枝
2)割平面法
3)隐枚举法 -->试探出一个可行解,增加一个新的约束条件,穷举法求解(不满足新建约束的无需计算)
4)匈牙利法 -->对系数矩阵进行变换得到一个每行每列都含0元素的矩阵
5)蒙特卡洛法 -->随机取样
6)0-1变量问题
a.相互排斥的计划(投资场所的选定)
b.相互排斥的约束
3.非线性规划
1)x=fmincon(fun,x0,A,b,Aeq,beq,LB,UB,NONLCON,options)
clc,clear options=optimset('largescale','off'); [x,y]=fmincon('ques02_fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'ques02_fun2',options); function f=ques02_fun1(x); f=sum(x.^2)+8; function [g,h]=ques02_fun2(x); g=[-x(1)^2+x(2)-x(3)^2 x(1)+x(2)^2+x(3)^3-20]; h=[-x(1)-x(2)^2+2 x(2)+2*x(3)^2-3];
2)迭代求解非线性规划 -->步长t和方向p
3)凸规划 -->目标函数与约束条件为凸函数,则其可行域为凸集,且局部最优解即为全剧最优解
4)无约束问题
a.一维搜索法 -->沿着某一已知方向求目标函数的极小点
b.斐波那契法 -->根据斐波那契数列确定探索点(对称)
c.0.618法 -->探索点区间缩短率固定为0.618
d.二次插值法 -->区间连续时,考虑用多项式插值进行一维搜索,不断用低次多项式来近似目标函数
e.梯度法 -->下降的方向沿负梯度方向(下降速度最快),终止条件为梯度为0或小于某一阈值
minf(x)=x1^2+25*x2^2
clc,clear x=[2;2]; %初始值 [f0,g]=ques04_fun(x); while norm(g)>0.000001 %norm求向量g的2范数 p=-g/norm(g); %p为下降的方向 t=1.0; %初始t为1 f=ques04_fun(x+t*p); %找到是目标函数最小的t while f>f0 t=t/2; f=ques04_fun(x+t*p); end x=x+t*p; [f0,g]=ques04_fun(x); end x,f0 function [f,df]=ques04_fun(x); f=x(1)^2+25*x(2)^2; %目标函数 df=[2*x(1) %梯度函数 50*x(2)];
f.牛顿法 -->下降的方向为p^k=-[▽^2f(x^k)]^(-1)▽f(x^k),收敛速度快,但维数较高时计算量大(需要求解二阶导数矩阵及其逆)
clc,clear x=[2;2]; [f0,g1,g2]=ques05_fun(x); while norm(g1)>0.00001 p=-inv(g2)*g1; p=p/norm(p); t=1.0; f=ques05_fun(x+p*t); while f>f0 t=t/2; f=ques05_fun(x+p*t); end x=x+t*p; [f0,g1,g2]=ques05_fun(x); end x,f0 function [f,df,d2f]=ques05_fun(x); f=x(1)^4+25*x(2)^4+x(1)^2*x(2)^2; df=[4*x(1)^3+2*x(1)*x(2)^2 100*x(2)^3+x(1)^2*2*x(2)]; d2f=[12*x(1)^2+2*x(2)^2,4*x(1)*x(2) 4*x(1)*x(2),300*x(2)^2+2*x(1)^2];
g.变尺度法 -->构造一个矩阵H来逼近二阶导矩阵的逆矩阵,H0为单位矩阵,之后按式18得到
h.直接法 -->目标函数不可导或难以解析
i.Matlab解无约束极值问题 -->fminunc fminsearch
[x,fval]=fminunc(fun,x0,options,p1,p2,...) ->fun为一个m文件,返回值为(目标函数,一阶导数阵,二阶导数阵),p1,p2为传递给fun的参数
clc,clear options=optimset('GradObj','on'); [x,fvl]=fminunc('ques06_fun',rand(1,2),options) function [f,g]=ques06_fun(x); f=100*(x(2)-x(1)^2)^2+(1-x(1))^2; g=[-200*(x(2)-x(1)^2)*2*x(1)-2*(1-x(1)) 200*(x(2)-x(1)^2)];
5)约束极值问题
a.二次规划 -->目标函数为二次函数,约束条件线性
Matlab解法:[x,fval]=quadprog(h,f,A,b,Aeq,beq,LB,UB,x0,options) -->min1/2x'Hx+f'x ,H为二次项系数矩阵,f为一次项系数
clc,clear H=[4,-4;-4,8]; f=[-6;-3]; A=[1,1;4,1]; b=[3,9]; [x,value]=quadprog(H,f,A,b,[],[],zeros(2,1))
b.罚函数法 -->将约束条件转化为适当的罚函数构造增广目标函数,转化为无约束非线性规划问题 SUMT
6)Matlab优化工具箱: fminbnd(单变量非线性函数在区间上) fseminf(半无穷约束) fminimax(目标函数为最大最小值型) fmincon-->可以使用梯度下降法,见例13
4.动态规划 -->求解以时间划分阶段的动态过程的优化问题
1)基本概念:阶段、状态X、决策U、策略P(决策集合)、状态转移方程T、指标函数V(衡量过程优劣的数量指标,和、积、最大、最小)、最优策略(使指标函数达到最优值的策略)、最优轨线