Matlab建模——线性规划

(1)MATLAB中线性规划的标准型为:
m i n c T x min \quad c^Tx mincTx
s . t . { A x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b s.t. \begin{cases} Ax\leq b &\\ Aeq\cdot x=beq& \\ lb\leq x \leq ub \end{cases} s.t.AxbAeqx=beqlbxub
基本函数形式为linprog(c,A,b),它的返回值是向量x的值。(可以help linprog)
[x,fval]=linprog(c,A,b,Aeq,beq,LB,UB,X0,OPTIONS)
fval返回目标函数的值,LB,UB分别是变量x的下界和上界,x0是x的初始值,OPTIONS是控制参数。
栗子:
求解下列线性规划问题:
m a x z = 2 x ( 1 ) + 3 x ( 2 ) − 5 x ( 3 ) max \quad z=2x(1)+3x(2)-5x(3) maxz=2x(1)+3x(2)5x(3)
s . t . { x ( 1 ) + x ( 2 ) + x ( 3 ) = 7 2 x ( 1 ) − 5 x ( 2 ) + x ( 3 ) ≥ 10 x ( 1 ) + 3 x ( 2 ) + x ( 3 ) ≤ 12 x ( 1 ) , x ( 2 ) , x ( 3 ) ≥ 0 s.t. \begin{cases} x(1)+x(2)+x(3)=7 &\\ 2x(1)-5x(2)+x(3) \geq 10& \\ x(1)+3x(2)+x(3)\leq 12 &\\ x(1),x(2),x(3)\geq 0 \end{cases} s.t.x(1)+x(2)+x(3)=72x(1)5x(2)+x(3)10x(1)+3x(2)+x(3)12x(1),x(2),x(3)0

\\记住:代码要按照标准型写,要将原来给出的式子进行变换,转换成标准型
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(3,1))
value=c'*x

(2)指派问题
栗子:分配n人去干n项工作,每人干且只干一项工作,若分配第i人去干第j项工作,需花费cij单位时间,问应如何分配工作才能使工人花费的总时间最少?
求解指派问题用匈牙利算法:如果系数矩阵C=(cij)一行(或一列)中每一元素都加上或减去同一个数,得到一个新矩阵B=(bij),则以C或B为系数矩阵的指派问题具有相同的最优解。
(3)对偶问题
考虑以下线性规划:
m a x c T x s . t . A x ≤ b , x ≥ 0 ( 原 始 问 题 ) max \quad c^Tx \quad s.t.\quad Ax\leq b,x\geq 0 \quad (原始问题) maxcTxs.t.Axb,x0

m i n b T y s . t . A T y ≥ c , y ≥ 0 ( 对 偶 问 题 ) min \quad b^Ty \quad s.t.\quad A^Ty\geq c,y \geq 0 \quad (对偶问题) minbTys.t.ATyc,y0()
对偶问题可以看作是原始问题的“行列转置”:
(1)原始问题中的第j列系数与其对偶问题中的第j行的系数相同
(2)原始目标函数的各个系数行与其对偶问题中右侧的各常数列相同
(3)原始问题右侧的各常数列与其对偶目标函数的各个系数行相同
(4)在这一对话题中,不等式方向和优化方向相反
对偶问题的基本性质:
(1)对称性:对偶问题的对偶是原始问题
(2)弱对偶性:若 x ‾ \overline{x} x是原始问题的可行解, y ‾ \overline{y} y是对偶问题的可行解。
(3)无界性:若原问题为无界解,则对偶问题无可行解。
(4)可行解是最优解的性质:若 x ^ \hat{x} x^是原问题的可行解,那么 y ^ \hat{y} y^是对偶问题的可行解,当c^T x ^ \hat{x} x^=b^T y ^ \hat{y} y^时, x ^ \hat{x} x^ y ^ \hat{y} y^是最优解。
(5)对偶定理:若原问题有最优解,那么对偶问题也有最优解,且目标函数值相同。
(6)互补松弛性:若 x ^ \hat{x} x^ y ^ \hat{y} y^分别是原问题和对偶问题的最优解,则
y ^ T ( A x ^ − b ) = 0 , x ^ T ( A T y ^ − c ) = 0 \hat{y}^T(A\hat{x}-b)=0,\hat{x}^T(A^T\hat{y}-c)=0 y^T(Ax^b)=0,x^T(ATy^c)=0
(4)灵敏度分析
因此可以提出两个问题:
第一:当这些系数有一个或几个发生变化时,已求得的线性规划问题的最优解会有什么变化。
第二:这些系数在什么范围内变化时,线性规划问题的最优解或最优基不变。
栗子:投资组合,使得利润最大化,风险尽可能小。
可以建立三个模型:
(1)固定风险水平,优化收益
(2)固定盈利水平,减小风险
(3)对风险和收益分别赋予权重s(0 ≤ \leq s ≤ \leq 1 ),s称为投资偏好系数。
这里对模型一进行求解:
m i n f = ( − 0.05 , − 0.27 , − 0.19 , − 0.185 , − 0.185 ) ( x ( 0 ) , x ( 1 ) , x ( 2 ) , x ( 3 ) , x ( 4 ) ) minf=(-0.05,-0.27,-0.19,-0.185,-0.185)(x(0),x(1),x(2),x(3),x(4)) minf=(0.05,0.27,0.19,0.185,0.185)(x(0),x(1),x(2),x(3),x(4))
s . t . { x ( 0 ) + 1.01 x ( 1 ) + 1.02 x ( 2 ) + 1.045 x ( 3 ) + 1.065 x ( 4 ) = 1 0.025 x ( 1 ) ≤ a 0.015 x ( 2 ) ≤ a 0.055 x ( 3 ) ≤ a 0.026 x ( 4 ) ≤ a x ( i ) ≥ 0 ( i = 0 , 1 , 2 , . . . , 4 ) s.t. \begin{cases} x(0)+1.01x(1)+1.02x(2)+1.045x(3)+1.065x(4)=1 &\\ 0.025x(1) \leq a& \\ 0.015x(2)\leq a &\\ 0.055x(3)\leq a &\\ 0.026x(4)\leq a &\\ x(i)\geq 0(i=0,1,2,...,4) \end{cases} s.t.x(0)+1.01x(1)+1.02x(2)+1.045x(3)+1.065x(4)=10.025x(1)a0.015x(2)a0.055x(3)a0.026x(4)ax(i)0(i=0,1,2,...,4)
\a是任意给定的风险,根据情况而定。这里以a=0开始,以步长为 Δ \Delta Δa=0.001进行循环搜索。具体代码如下:

a=0;
hold on 
while  a<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])];
    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')

Matlab建模——线性规划_第1张图片
结果分析:
(1)风险越大,收益越大
(2)当投资越分散时,投资者承担的风险就越小,这与题意一致。即 冒险的投资者会出现集中投资的情况,而保守的投资者会偏向于分散的投资。
(3)在a=0.006附近有一个转折点,靠左边,风险增加很少时,利润增长的很快,但是右边,风险增加很大时,利润增长的缓慢,所以对于风险和收益没有持有特殊偏好的投资者来说,应该选择曲线的拐点作为最优投资组合,大约是a=0.6%,Q=20%,所对应的投资方案为:
a=0.006,Q=0.2019,x(0)=0,x(1)=0.24,x(2)=0.4,x(3)=0.1091,x(4)=0.2212

你可能感兴趣的:(MATLAB)