多种优化模型的MATLAB求解(一)
线性规划
linear programming,LP问题
对于满足表达式的一个或多个等式与不等式约束条件的去决定一个线性目标函数的最大值或最小值的优化问题。
目
标
函
数
:
m
a
x
(
或
m
i
n
)
z
=
c
T
x
目标函数:max(或min)z=c^Tx
目标函数:max(或min)z=cTx
{
A
⋅
x
≤
b
A
e
q
⋅
x
=
b
e
q
l
b
≤
x
≤
u
b
\begin{cases} A \cdot x {\leq b }\\ Aeq \cdot x=beq\\ lb \leq x \leq ub \end{cases}
⎩⎪⎨⎪⎧A⋅x≤bAeq⋅x=beqlb≤x≤ub
c和x都是 n维列向量,
A,Aeq为适当维数的矩阵,
b,beq,为适当维数的列向量。
MATLAB优化工具箱实现线性规划
由上述公式可得
利用MATLAB优化工具箱函数linprog实现
(1)[x,z]=linprog(c,A,b,Aeq,beq,lb,ub)
输入相对应的是上述的变量
x:最优解
z:最优值
(2)[x,z,exitflag]=linprog(c,A,b,Aeq,beq,lb,ub)
输出的第三项返回一个整数,描述该函数linprog结束的原因
1:目标函数在x处收敛
0:迭代次数超过option.MaxIter
-2:问题没有可行解
-3:问题的可行域无界
-4:在算法执行过程中遭遇特殊值NaN
-5:原问题和对偶问题都是不可行的(至于对偶问题百度吧这里涉及了运筹学的知识)
-6:搜索方向太小不能计算下去
(3)[x,z,exitflag,output]=linprog(c,A,b,Aeq,beq,lb,ub)
第四项输出一个包含优化信息的结构数组。
(4)[x,z,exitflag,output,lambda]=linprog(c,A,b,Aeq,beq,lb,ub)
lambda是一个结构数组,包含在最优解c处不同优化类型的拉格朗日乘子信息。
lower 决策变量的下界限制lb对应的拉格朗日乘子列向量;
upper决策变量的上界限制ub对应的拉格朗日乘子列向量;
ineqlin不等式约束对应的拉格朗日乘子列向量;
eqlin等式约束对应的拉格朗日乘子列向量;
例:
m
a
x
:
13
x
1
+
9
x
2
+
10
x
3
+
11
x
4
+
12
x
5
+
8
x
6
max: 13x_1+9x_2+10x_3+11x_4+12x_5+8x_6
max:13x1+9x2+10x3+11x4+12x5+8x6
{
0.6
x
1
+
1.2
x
2
+
1.1
x
3
≤
600
0.4
x
4
+
1.2
x
5
+
x
6
≤
900
x
1
+
x
4
=
400
x
2
+
x
5
=
600
x
3
+
x
6
=
500
\begin{cases} 0.6x_1+1.2x_2+1.1x_3 \leq600 \\ 0.4x_4+1.2x_5+x_6 \leq 900 \\ x_1+x_4 = 400\\ x_2+x_5 = 600\\ x_3+x_6 = 500 \end{cases}
⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧0.6x1+1.2x2+1.1x3≤6000.4x4+1.2x5+x6≤900x1+x4=400x2+x5=600x3+x6=500
部分数据未知时,用[]代替。
MATLAB代码为:
c = [13;9;10;11;12;8];
A = [0.6 1.2 1.1 0 0 0 ;0 0 0 0.4 1.2 1.0];
b = [600;900];
Aeq = [1 0 0 1 0 0;0 1 0 0 1 0;0 0 1 0 0 1];
beq = [400 600 500];
lb = zeros(6,1);
[x,z,exitflag,output,lambda] = linprog(c,A,b,Aeq,beq,lb);
输出
x =
0
500.0000
0
400.0000
100.0000
500.0000
z =
14100
exitflag =
1
output =
包含以下字段的 struct:
iterations: 4
constrviolation: 5.6843e-14
message: 'Optimal solution found.'
algorithm: 'dual-simplex'
firstorderopt: 2.8422e-13
lambda =
包含以下字段的 struct:
lower: [6×1 double]
upper: [6×1 double]
eqlin: [3×1 double]
ineqlin: [2×1 double]