工具链接
Octave online,Web版的matlab,运行速度很快,操作基本与matlab一致
Octave Online
Doc for Octave
线性规划问题求解
线性规划求解流程图如下所示
线性规划问题的标准形式
{ min z = C X A X ≤ b X ≥ 0 \left\{ \begin{aligned} &\min z=\mathbf{CX}\\ &\mathbf{A}\mathbf{X}\leq\mathbf{b}\\ &\mathbf{X}\geq 0 \end{aligned} \right. ⎩⎪⎨⎪⎧minz=CXAX≤bX≥0
求解函数
matlab中线性规划求解函数为linprog
x=linprog(f, A, b, Aeq, beq, lb, ub, x0, options)
[x, fval, exitflag, output, lambda]=linprog(...)
参数说明
f, A, b
:表示求解问题为
min
f
T
x
\min f^Tx
minfTx,约束条件为
A
x
≤
b
Ax\leq b
Ax≤b
Aeq, beq
:等式约束
A
e
q
x
=
b
e
q
Aeqx=beq
Aeqx=beq
lb, ub
:变量
x
x
x的上界和下界
x0
:x
搜索的起始点
options
:表示optimset
函数中定义的参数值
fval
:目标函数在解x
处的值
lambda
:表示在解x
处的Lagrange乘子
lambda.lower
:lambda
的下界lambda.upper
:lambda
的上界lambda.ineqlin
:lambda
的线性不等式lamdba.eqlin
:lambda
的线性等式
在web版的Octave中linprog
只能返回x
和fval
的信息
案例
demo 1
求解模型
min
Z
=
−
4
a
+
b
+
7
c
s
.
t
{
a
+
b
−
c
=
5
3
a
−
b
+
c
≤
4
a
+
b
−
4
c
≤
−
7
a
,
b
≥
0
\min Z=-4a+b+7c\\ s.t \begin{cases} a+b-c=5\\ 3a-b+c\leq 4 \\ a+b-4c\leq -7\\ a, b\geq 0 \end{cases}
minZ=−4a+b+7cs.t⎩⎪⎪⎪⎨⎪⎪⎪⎧a+b−c=53a−b+c≤4a+b−4c≤−7a,b≥0
代码
pkg load optim % 加载求解器
clear all
clc
f=[-4 1 7]'; % 需要写成列向量
A=[3 -1 1; 1 1 -4];
b=[4; -7];
Aeq=[1 1 -1];
beq=[5];
vlb=[0, 0, inf]';
vub=[];
[x, fval]=linprog(f, A, b, Aeq, beq, vlb, vub);
demo 2
求解模型
min
−
x
(
1
)
−
1
3
x
(
2
)
s
.
t
.
{
x
(
1
)
+
x
(
2
)
≤
2
x
(
1
)
+
x
(
2
)
/
4
≤
1
x
(
1
)
−
x
(
2
)
≤
2
−
x
(
1
)
/
4
−
x
(
2
)
≤
1
−
x
(
1
)
−
x
(
2
)
≤
−
1
−
x
(
1
)
+
x
(
2
)
≤
2
x
(
1
)
+
1
4
x
(
2
)
=
1
2
1.5
≥
x
(
1
)
≥
−
1
1.25
≥
x
(
2
)
≥
−
0.5
\min -x(1)-\frac{1}{3}x(2)\\ s.t. \begin{cases} x(1)+x(2)\leq 2\\ x(1)+x(2)/4\leq 1\\ x(1)-x(2)\leq 2\\ -x(1)/4-x(2) \leq 1\\ -x(1)-x(2) \leq -1 \\ -x(1)+x(2)\leq 2 \\ x(1)+\frac{1}{4}x(2)=\frac{1}{2}\\ 1.5\geq x(1) \geq -1\\ 1.25\geq x(2) \geq -0.5 \end{cases}
min−x(1)−31x(2)s.t.⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧x(1)+x(2)≤2x(1)+x(2)/4≤1x(1)−x(2)≤2−x(1)/4−x(2)≤1−x(1)−x(2)≤−1−x(1)+x(2)≤2x(1)+41x(2)=211.5≥x(1)≥−11.25≥x(2)≥−0.5
代码
pkg load optim
clear all
clc
f=[-1 -1/3]';
A=[
1 1;
1 1/4;
1 -1;
-1/4 -1;
-1 -1;
-1 1
];
b=[2 1 2 1 -1 2]';
Aeq = [1 1/4];
beq = 1/2;
lb=[-1 -0.5]';
ub=[1.5 1.25]';
[x, fval]=linprog(f, A, b, Aeq, beq, lb, ub);
结果如图所示
demo 3
求解模型
min
f
(
x
)
=
−
5
x
1
−
4
x
2
−
6
x
3
s
.
t
.
{
x
1
−
x
2
+
x
3
≤
20
3
x
1
+
2
x
2
+
4
x
3
≤
42
x
1
≥
0
x
2
≥
0
x
3
≥
0
\min f(x)=-5x_1-4x_2-6x_3 \\ s.t. \begin{cases} x_1-x_2+x_3\leq 20\\ 3x_1+2x2+4x_3\leq 42 \\ x1\geq 0\\ x2\geq 0\\ x3\geq 0\\ \end{cases}
minf(x)=−5x1−4x2−6x3s.t.⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧x1−x2+x3≤203x1+2x2+4x3≤42x1≥0x2≥0x3≥0
代码
pkg load optim
clear all
clc
f=[-5 -4 -6]';
A=[
1 -1 1;
3 2 4;
3 2 0;
];
b=[20 42 30]';
lb=[0 0 0]';
[x, fval]=linprog(f, A, b, [], [], lb, []);
单纯性线性规划(simplex)
simplex从所有基本可行解的一个较小部分中通过迭代过程找出最优解,其迭代过程如下
- 将线性规划方程转为标准形式,可以得到一个初始基本可行解 x 0 x_0 x0,将它作为迭代的出发点,当前目标值为 z 0 z_0 z0.
- 通过高斯消元寻找其他基本可行解 x i x_i xi,当满足 z i ≤ z i − 1 z_i\leq z_{i-1} zi≤zi−1时则保留当前解.
- 迭代到某个 z z z不可被替换为止.