线性规划问题求解
目前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.⎩⎪⎨⎪⎧A⋅x≤bAeq⋅x=beqlb≤x≤ub
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=−x1−x2−x3s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧7x1+3x2+9x3≤18x1+5x2+4x3≤16x1+9x2+5x3≤1x1,x2,x3≥0
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)
求解信息如下
使用内点法求解
%%
% 目标函数系数
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=−a1x1−a2x2−a3x3s.t.⎩⎪⎪⎪⎨⎪⎪⎪⎧7x1+3x2+9x3≤18x1+5x2+4x3≤16x1+9x2+5x3≤1x1,x2,x3≥0
求解代码如下,在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)
参考资料
金融数量分析 北京航天航空大学出版社 郑志勇