优化求解器如 cplex 或 gurobi,都支持直接读取线性规划建模文件 MPS 格式或 LP 格式,因此,有必要研究一下,这样就可以编写一个 mps 或 lp 文件,用不同的求解器直接算了。对于下面的线性规划模型:
max x 1 + 2 x 2 + 3 x 3 + x 4 s.t. { − x 1 + x 2 + x 3 + 10 x 4 ≤ 20 x 1 − 3 x 2 + x 3 ≤ 30 x 2 − 3.5 x 4 = 0 0 ≤ x 1 ≤ 40 , x 2 ≥ 0 , x 3 ≥ 0 , 2 ≤ x 4 ≤ 3 \begin{aligned} &\max\quad &&x_1 + 2x_2 + 3x_3 + x_4\\ &\text{s.t.}&& \begin{cases} -x_1 + x_2 + x_3 + 10x_4 \leq 20\\ x_1 - 3x_2 + x_3 \leq 30\\ x_2 - 3.5x_4 = 0\\ 0 \leq x_1\leq 40, x_2\geq 0, x_3\geq 0, 2\leq x_4 \leq 3 \end{cases} \end{aligned} maxs.t.x1+2x2+3x3+x4⎩ ⎨ ⎧−x1+x2+x3+10x4≤20x1−3x2+x3≤30x2−3.5x4=00≤x1≤40,x2≥0,x3≥0,2≤x4≤3
1. MPS 文件的理解
IBM 的官方网站对 MPS 文件有一些详细的解释,参见:https://www.ibm.com/support/knowledgecenter/SSSA5P_12.6.0/ilog.odms.cplex.help/CPLEX/FileFormats/topics/MPS_records.html, (复制在浏览器内打开)
对应的例子是:https://www.ibm.com/support/knowledgecenter/SSSA5P_12.6.1/ilog.odms.cplex.help/CPLEX/UsrMan/topics/discr_optim/mip/02_prob_statement.html
这里我就谈谈自己的理解了。
上面问题的 MPS 文件内容为:
NAME chen
ROWS
N obj
L c1
L c2
E c3
COLUMNS
x1 obj -1 c1 -1
x1 c2 1
x2 obj -2 c1 1
x2 c2 -3 c3 1
x3 obj -3 c1 1
x3 c2 1
MARK0000 'MARKER' 'INTORG'
x4 obj -1 c1 10
x4 c3 -3.5
MARK0001 'MARKER' 'INTEND'
RHS
rhs c1 20 c2 30
BOUNDS
UP bnd x1 40
LO bnd x4 2
UP bnd x4 3
ENDATA
下面详细解释这个 MPS 文件:
-
NAME: 表示这个优化模型的名字,后面可以不写内容
-
ROWS: 每一行,包括目标函数与约束条件
(1) N 表示自由行, obj是对目标函数的命名,可以任意取
(2) L 表示该行小于等于, c1是对改行的命名,可以任意取名
(3) G 表示该行大于等于
(4) E 表示该行等于 -
COLUMNS: 每一列,及对应的系数
(1) 下面的第一列要空
(2) 下面的第二列表示列的名字,其实就是求解变量
(3) 下面的第三列表示所在行的名字
(4) 下面的第四列表示所在行与列对应的系数
(5) 其中 MARK0000 ‘MARKER’ ‘INTORG’
MARK0001 ‘MARKER’ ‘INTEND’ 分别表示整数变量的起止
(6) 第五列、第六列分别与第三列、第四列的含义相同。 -
RHS: 约束条件最右端的数字
(1) 下面的第一列要空
(2) 下面的第二列表示 rhs 名字,可以任取
(3) 下面的第三列表示所在行的名字
(4) 下面的第四列表示所在行对应的 RHS 值
(5) 第五列、第六列分别与第三列、第四列的含义相同。 -
Bounds: 表示各变量的上界或下界
(1) LO 表示下界
(2) UP 表示上界
(3) FX 表示该变量固定值
(4) FR 表示改变量的范围为 ( − ∞ , ∞ ) (-\infty,\infty) (−∞,∞)
(5) MI 表示下界为负无穷
(6) PL 表示上界为正无穷
MPS 变量默认的范围为 [ 0 , ∞ ) [0,\infty) [0,∞) -
ENDDATA: 表示 MPS 文件结束
2. LP 文件的理解
上面问题的 LP 文件为:
Maximize
obj: x1 + 2 x2 + 3 x3 + x4
Subject To
c1: - x1 + x2 + x3 + 10 x4 <= 20
c2: x1 - 3 x2 + x3 <= 30
c3: x2 - 3.5 x4 = 0
Bounds
0 <= x1 <= 40
2 <= x4 <= 3
General
x4
End
LP文件非常清晰明了,但貌似规划软件对 mps 文件支持的更好。其中需要注意的是
- Bounds 里面若有 free 表示该变量无上下界
- General 表示整数变量
- Binary 表示二进制变量
- \ 表示注释
cplex 有自己的字段 pwl 表示分段线性约束。