【OR】Matlab求解最优化问题(1) 线性规划

线性规划问题求解

目前matlab求解线性规划算法主要内点法(interior-point methods)和单纯形法(simplex method)
线性规划的标准数学模型为
min ⁡ f ( x ) s . t . { A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b \min f(x)\\ s.t.\begin{cases} A\cdot x\leq b\\ Aeq \cdot x=beq\\ lb\leq x\leq ub \end{cases} minf(x)s.t.AxbAeqx=beqlbxub

linprog函数

函数语法

[x, fval, exitflag, output, lambda]=linprog(f, A, b, Aeq, beq, lb, ub, x0, options)

输入参数中,x0表示起始迭代点,options为优化参数的设置
输出参数中,fval为找到的最优解,exitflag为迭代停止标识,具体数值含义如下

数值含义
1算法收敛于解 x x x
0达到最大迭代次数算法停止,输出的 x x x未必为最优解
2算法没有找到可行解,问题的可行解集为空集
3原问题为无解,解为无穷
4算法出现异常,出现非数值情况
5线性规划的原问题和对偶问题均不可解
7可行搜索方向向量太小,无法再提高最优解的质量

output为算法计算信息,含义表如下

项目含义
Algorithm计算时使用的优化算法
Cgiterations算法迭代次数
iterations算法迭代次数
Exit message返回结束信息

lambda为返回点的拉格朗日乘子信息,含义表如下

项目含义
Lower求得解越下界
Upper求得解越上界
Neqlin求得解不满足不等式约束
Eqlin求得解不满足等式约束

案例

线性规划的目标函数为
min ⁡ f = − x 1 − x 2 − x 3 s . t . { 7 x 1 + 3 x 2 + 9 x 3 ≤ 1 8 x 1 + 5 x 2 + 4 x 3 ≤ 1 6 x 1 + 9 x 2 + 5 x 3 ≤ 1 x 1 , x 2 , x 3 ≥ 0 \min f=-x_1-x_2-x_3\\ s.t.\begin{cases} 7x_1+3x_2+9x_3\leq 1\\ 8x_1+5x_2+4x_3\leq 1\\ 6x_1+9x_2+5x_3\leq 1\\ x_1, x_2, x_3\geq 0 \end{cases} minf=x1x2x3s.t.7x1+3x2+9x318x1+5x2+4x316x1+9x2+5x31x1,x2,x30
matlab求解代码如下
使用对偶单纯形法

%%
% 目标函数系数
f=[-1, -1, -1];
% 不等式约束的系数矩阵A
A=[7, 3, 9; 8, 5, 4; 6, 9, 5];
% 不等式约束b
b=[1, 1, 1];

% 等式约束矩阵
Aeq=[];
beq=[];
% 变量的上下界
lb=[0, 0, 0];
ub=[];

% 对偶单纯形求解
options=optimset('LargeScale', 'off', 'Algorithm','dual-simplex', 'Display', 'iter');
[x, fval, exitflag, output, lambda]=linprog(f, A, b, Aeq, beq, ub)

求解信息如下
ip

使用内点法求解

%%
% 目标函数系数
f=[-1, -1, -1];
% 不等式约束的系数矩阵A
A=[7, 3, 9; 8, 5, 4; 6, 9, 5];
% 不等式约束b
b=[1, 1, 1];

% 等式约束矩阵
Aeq=[];
beq=[];
% 变量的上下界
lb=[0, 0, 0];
ub=[];

%% 内点法法求解
options=optimset('LargeScale', 'off', 'Algorithm','interior-point', 'Display', 'iter');
[x, fval, exitflag, output, lambda]=linprog(f, A, b, Aeq, beq, lb, ub, [], options)

含参数线性规划

求解如下目标函数含参数的线性规划
min ⁡ f = − a 1 x 1 − a 2 x 2 − a 3 x 3 s . t . { 7 x 1 + 3 x 2 + 9 x 3 ≤ 1 8 x 1 + 5 x 2 + 4 x 3 ≤ 1 6 x 1 + 9 x 2 + 5 x 3 ≤ 1 x 1 , x 2 , x 3 ≥ 0 \min f=-a_1x_1-a_2x_2-a_3x_3\\ s.t. \begin{cases} 7x_1+3x_2+9x_3\leq 1\\ 8x_1+5x_2+4x_3\leq 1\\ 6x_1+9x_2+5x_3\leq 1\\ x_1, x_2,x_3\geq 0 \end{cases} minf=a1x1a2x2a3x3s.t.7x1+3x2+9x318x1+5x2+4x316x1+9x2+5x31x1,x2,x30

求解代码如下,在matlab 2018b中默认使用dual-simplex算法进行求解

%% 含参数线性规划
f0=[-1, -1, -1];
a=[1, 1,  1];
f=a.*f0; % 产生目标函数系数
% 不等式约束的系数矩阵A
A=[7, 3, 9; 8, 5, 4; 6, 9, 5];
% 不等式约束b
b=[1, 1, 1];

% 等式约束矩阵
Aeq=[];
beq=[];
% 变量的上下界
lb=[0, 0, 0];
ub=[];
options=optimset('Display', 'iter'); % 显示迭代过程
[x, fval, exitflag, output, lambda]=linprog(f, A, b, Aeq, beq, lb, ub, [], options)

参考资料

金融数量分析 北京航天航空大学出版社 郑志勇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quant0xff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值