LINGO 线性规划
以例1.2为例
max z = 2 x 1 + 3 x 2 − 5 x 3 , s . t . x 1 + x 2 + x 3 = 7 , 2 x 1 − 5 x 2 + x 3 ≥ 10 , x 1 + 3 x 2 + x 3 ≤ 12. x 1 , x 2 , x 3 ≥ 0. \max z = 2x_1+3x_2-5x_3, \\ s.t.\\ x_1+x_2+x_3=7,\\ 2x_1-5x_2+x_3\ge10,\\ x_1+3x_2+x_3\le12.\\ x_1,x_2,x_3\ge0. maxz=2x1+3x2−5x3,s.t.x1+x2+x3=7,2x1−5x2+x3≥10,x1+3x2+x3≤12.x1,x2,x3≥0.
不使用集合的方法
直接把上面的式子输进去,需要注意LINGO中不需要写变量 z
,并且LINGO 中变量默认是非负的,如果要求变量的取值范围为实数,可以加上 @free(x)
。
max = 2 * x1 + 3 * x2 - 5 * x3;
x1 + x2 + x3 = 7;
2 * x1 - 5 * x2 + x3 >= 10;
x1 + 3 * x2 + x3 <= 12;
使用集合的方法
要使用集合的方法,我们首先要确定LINGO模型有哪些集合。LINGO模型的集合会对应于数学模型中的矩阵或向量,因此我们首先要把上式化为标准型的矩阵形式。
max z = c T x s . t . A x ≤ b A e q x = b e q b l ≤ x ≤ b u \max z = \bold c^T \bold x\\ s.t. \\ \bold A \bold x \le \bold b\\ \bold A_{eq} \bold x = \bold b_{eq}\\ \bold b_l \le \bold x \le \bold b_u maxz=cTxs.t.Ax≤bAeqx=beqbl≤x≤bu
c
=
[
2
3
5
]
,
x
=
[
x
1
x
2
x
3
]
,
\bold c = \begin{bmatrix} 2 \\ 3 \\ 5 \\ \end{bmatrix}, \bold x = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ \end{bmatrix},\\
c=⎣⎡235⎦⎤,x=⎣⎡x1x2x3⎦⎤,
A
=
[
−
2
5
−
1
1
3
1
]
,
b
=
[
−
10
12
]
,
\bold A = \begin{bmatrix} -2&5&-1 \\ 1&3&1 \\ \end{bmatrix}, \bold b = \begin{bmatrix} -10 \\ 12 \\ \end{bmatrix},
A=[−2153−11],b=[−1012],
A
e
q
=
[
1
1
1
]
,
b
e
q
=
[
7
]
,
\bold A_{eq} = \begin{bmatrix} 1&1&1 \\ \end{bmatrix}, \bold b_{eq} = \begin{bmatrix} 7 \\ \end{bmatrix},
Aeq=[111],beq=[7],
b
l
=
[
0
0
0
]
,
b
u
=
[
+
∞
+
∞
+
∞
]
,
\bold b_{l} = \begin{bmatrix} 0 \\ 0\\ 0\\ \end{bmatrix}, \bold b_{u} = \begin{bmatrix} +\infty \\ +\infty\\ +\infty\\ \end{bmatrix},
bl=⎣⎡000⎦⎤,bu=⎣⎡+∞+∞+∞⎦⎤,
SETS:
col /1..3/ : c , x; !column number of matrix, number of variables ;
row /1..2/ : b ; !row number of A , number of <= equations;
row_eq /1..1/ : b_eq ; !row number of A_eq , number of = equations;
le(row , col): A ; !to define A ;
eq(row_eq, col): A_eq ; !to define A_eq;
ENDSETS
DATA:
c = 2 3 -5 ;
b = -10 12 ;
b_eq = 7 ;
A = -2 5 -1
1 3 1 ;
A_eq = 1 1 1 ;
ENDDATA
MAX = @SUM(col: c * x);
@FOR(row (i): @SUM(col(j): A (i,j) * x(j)) <= b (i));
@FOR(row_eq(i): @SUM(col(j): A_eq(i,j) * x(j)) = b_eq(i));
读取文件的方法
要读取文件,只需要将数据段改为
DATA:
c = @FILE(Ldata.txt);
b = @FILE(Ldata.txt);
b_eq = @FILE(Ldata.txt);
A = @FILE(Ldata.txt);
A_eq = @FILE(Ldata.txt);
ENDDATA
Ldata.txt
的内容为
2 3 -5 ~
-10 12 ~
7 ~
-2 5 -1
1 3 1~
1 1 1~