线性规划问题
最基本的线性规划问题
难点:将条件整理为按照MATLAB所规定的固定格式–只求最小值、只用小于等于号,线性规划中的max要取负变成MATLAB里的min。需要多练习。
- 实例:利用有限资源分配生产以取得最大效益等等。
例一
max z = 2x1 + 3x2 - 5x3,
s.t. x1 + x2 + x3 = 7,
2x1 - 5x2 + x3 >= 10,
x1 + 3x2 + x3 <= 12,
x1,x2,x3 >=0
转换为MATLAB识别的形式:
min w = - 2x1 - 3x2 + 5x3,
s.t. [ -2 5 -1; 1 3 1]·[x1 ; x2 ; x3] <= [-10 ; 12],
[1 1 1]·[x1 ; x2 ; x3] = 7,
[x1 ; x2 ; x3]>=[0 ; 0 ; 0]
MATLAB代码:
f = [-2; -3; 5]; %价值向量,即待求值的系数矩阵
a = [-2 5 -1; 1 3 1]; %线性不等式约束的系数矩阵
b = [-10 ; 12] %线性不等式约束的结果矩阵
aeq = [1,1,1]; %线性等式约束的系数矩阵
beq = 7; %线性等式约束的结果矩阵
[x,y]=linprog(f,a,b,aeq,beq,zeros(3,1));%调用线性规划函数
%x返回决策向量的取值
%y有时写作fval,返回目标函数的最优值,即此例中的max
%因为这里处理的时候把最大值取负了,所以要把y再变回来
x,y=-y;
结果:
所以x1=6.4286,x2=0.5714,x3=0时有最大值y=14.5714,如果有规定精度,再调整或取临近点代入计算比较即可。
例二
min z = 2x1 + 3x2 + x3,
s.t. x1 + 4x2 + 2x3 >= 8,
3x1 + 2x2 >= 6,
x1,x2,x3 >= 0
分析,
- 这里待求值为最小值,不用取负;
- 没有等式约束条件;
- 不等式约束条件均为大于等于关系,需要取负。
转换为MATLAB识别的形式:
min w = [2 ; 3 ; 1]·[x1 x2 x3]
s.t. -[1 4 2 ; 3 2 0]·[x1 ; x2 ; x3] <= -[8 ; 6]
[x1; x2; x3] >= zeros(3,1)
MATLAB代码:
clc;clear;
f = [2;3;1];
a = -[1 4 2;3 2 0]; %要取负 易错
b = -[8;6]; %取负
aeq = []; %没有等式约束,但是不可省略,因为后面还有个zeros(3,1),只能用第三种调用方法
beq = [];
[x,y]=linprog(f,a,b,aeq,beq,zeros(3,1))
x,y
可以转化为线性规划的问题
引入绝对值的数学规划问题
min |x1| + |x2| + |x3| + …… + |xn|,
s.t. Ax <= b,
需要借助
x=u-v, |x|=u+v
u=(x+|x|)/2, v=(x-|x|)/2
进行代换,结果为:
min Σ(ui+vi)
s.t. [A , -A]·[u ; v] <= b
s.t. u,v>=0
例三
min z = |x1| + 2|x2| +3|x3| + 4|x4|
s.t. x1 - x2 - x3 + x4 <= -2,
x1 - x2 + x3 -3x4 <= -1,
x1 - x2 -2x3 +3x4 <= -1/2
转换格式,用u、v表示,这一步叫做 “线性化”
MATLAB代码:
clc;clear;
f = [1; 2; 3; 4];
c = [f;f]; %转换后 [u,v]的系数矩阵
a = [1 -1 -1 1; 1 -1 1 -3;1 -1 -2 3];
a = [a,-a]; %[u;v]的新的系数矩阵
b = [-2 ; -1; -1/2];
aeq = [];
beq = [];
[z,y]= linprog(c,a,b,aeq,beq,zeros(8,1))%边界条件也变成了一列的八个零
x=z(1:4)-z(5:8) %变换到原问题的解 x=u-v
例四
min(xi){max(yi)|εi|}
其中εi=xi-yi
这里需要利用换元思想简化问题。
令v=max(yi)|εi| 有待求值 min v
xi-yi <= v
yi-xi <= v
实例 投资的收益和风险
问题引入:
- n种资产si可选
- M:资金总量
- ri:n种资产在这一时期内购买si的平均收益率
- qi:n种资产在这一时期内购买si的风险损失率
- pi:购买时的交易费费率
- ui:购买量不超过ui时按ui购买
- r0:同期银行存款利率,无交易费、无风险,视为定值。
- xi:投资项目si的资金
- a:投资风险度
- Q:总体收益
符号规定与基本假设
为了解决实际问题,需要抽象出一些变量和理想条件。
- 投资数额相当大,可以假设M=1
- 投资越分散,总风险越小
- 总体风险用投资项目si中最大的一个风险来度量
- n+1种资产si之间相互独立
- 在投资时期,ri、qi、pi为定值,不受意外因素干扰
- 净收益和总体风险只受ri、qi、pi影响,不受其他因素干扰
总体风险
max{qi·xi} i=1,2,……
交易费
交易费 = pi·xi(xi>ui) ; pi·ui(xi<=ui)
但是实际ui非常小,而M非常大,可不考虑xi<=ui的情况。
则净收益=(ri-qi)·xi
多目标规划模型
要使净收益尽量大,总体风险尽量小。所以是多目标规划模型。
- 目标函数:
maxΣ(ri-qi)·xi
min{max{qi·xi}}
- 约束条件:
Σ(1+pi)xi = M
xi >= 0
模型简化
固定风险水平,优化收益
给风险定一个界限a
qi·xi/M <= a
即要加入约束条件:qi·xi/M <= a
,同时只考虑收益目标函数
- 目标函数:
maxΣ(ri-qi)·xi
- 约束条件:
Σ(1+pi)xi = M
xi >= 0
qi·xi/M <= a
MATLAB代码:
clc;clear;
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])];%diag是对角线矩阵
b = a*ones(4,1);
aeq = [1 1.01 1.02 1.045 1.065];
beq = 1;%M
LB = zeros(5,1);%下限
[x,Q]=linprog(c,A,b,aeq,beq,LB);
Q=-Q;%因为这里是max,取负了
plot(a,Q,'*k');
a = a+0.001;
end
- 一般都会选择转折点为最佳投资点,即图中的a=0.006,Q=0.2019
- 此时x0=0,x1=0.24,x2=0.4,x3=0.1091,x4=0.2212
固定盈利水平,极小化风险
只考虑风险目标函数,同时为盈利定一个界限k
- 目标函数:
min{max{qi·xi}}
- 约束条件:
Σ(1+pi)xi = M
xi >= 0
Σ(ri-qi)·xi >= k
投资者对风险和收益的比例有自己的投资偏好
要对风险、收益分别赋予权重s和(1-s),s称为投资偏好系数。0<s<=1
也可以将目标函数简化为一个,因为两个有了联系。
- 目标函数:
min s{max{qi·xi}} - (1-s)Σ(ri-qi)·xi
- 约束条件:
Σ(1+pi)xi = M
xi >= 0