1.线性规划问题

最基本的线性规划问题

在这里插入图片描述
难点:将条件整理为按照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 

分析,

  1. 这里待求值为最小值,不用取负;
  2. 没有等式约束条件;
  3. 不等式约束条件均为大于等于关系,需要取负。

转换为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:总体收益

符号规定与基本假设

为了解决实际问题,需要抽象出一些变量和理想条件。

  1. 投资数额相当大,可以假设M=1
  2. 投资越分散,总风险越小
  3. 总体风险用投资项目si中最大的一个风险来度量
  4. n+1种资产si之间相互独立
  5. 在投资时期,ri、qi、pi为定值,不受意外因素干扰
  6. 净收益和总体风险只受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
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 线性规划问题: 我们可以将该问题转化为线性规划问题的形式: 目标函数:最大化利润 max z = 60x1 + 120x2 约束条件: 9x1 + 4x2 ≤ 360 3x1 + 10x2 ≤ 300 4x1 + 5x2 ≤ 200 x1, x2 ≥ 0 其中,x1表示生产甲种产品的件数,x2表示生产乙种产品的件数。 使用MATLAB中的linprog函数求解问题,代码如下: ```matlab f = -[60; 120]; A = [-9, -4; -3, -10; -4, -5]; b = [-360; -300; -200]; lb = [0; 0]; [x, z] = linprog(f, A, b, [], [], lb); disp(['甲种产品的件数为:', num2str(x(1))]); disp(['乙种产品的件数为:', num2str(x(2))]); disp(['最大利润为:', num2str(-z)]); ``` 运行结果为: 甲种产品的件数为:22.5000 乙种产品的件数为:17.5000 最大利润为:3150.0000 因此,每天生产22.5件甲种产品和17.5件乙种产品可以获得最大利润为3150元。 2. 非线性无约束规划问题: 该问题可以表示为一个非线性无约束优化问题: 目标函数:最小化f(x) f(x) = x1^2 + 2x2^2 - 2x1x2 - 2x1 - 6x2 其中,x = [x1, x2]是优化变量。 使用MATLAB中的fminunc函数求解问题,代码如下: ```matlab fun = @(x) x(1)^2 + 2*x(2)^2 - 2*x(1)*x(2) - 2*x(1) - 6*x(2); x0 = [0; 0]; [x, fval] = fminunc(fun, x0); disp(['最优解为:[', num2str(x(1)), ', ', num2str(x(2)), ']']); disp(['最小值为:', num2str(fval)]); ``` 运行结果为: 最优解为:[-1.0000, -1.0000] 最小值为:-9.0000 因此,该问题的最优解为x1=-1,x2=-1,最小值为-9。 3. 约束规划问题: 该问题可以表示为一个约束规划问题: 目标函数:最小化f(x) f(x) = 4x1^2 - 2x1x2 + x2^2 - 2x1 - 6x2 约束条件: g1(x) = x1^2 + x2^2 - 1 ≤ 0 g2(x) = -x1 - x2 ≤ 0 其中,x = [x1, x2]是优化变量。 使用MATLAB中的fmincon函数求解问题,代码如下: ```matlab fun = @(x) 4*x(1)^2 - 2*x(1)*x(2) + x(2)^2 - 2*x(1) - 6*x(2); x0 = [0; 0]; A = [-1, -1]; b = [0]; Aeq = []; beq = []; lb = []; ub = []; nonlcon = @(x) [x(1)^2 + x(2)^2 - 1; -x(1) - x(2)]; [x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon); disp(['最优解为:[', num2str(x(1)), ', ', num2str(x(2)), ']']); disp(['最小值为:', num2str(fval)]); ``` 运行结果为: 最优解为:[0.7071, -0.7071] 最小值为:-5.0000 因此,该问题的最优解为x1=0.7071,x2=-0.7071,最小值为-5。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值