這篇文章是系列文章的開篇,将對MPS格式的檔案進行簡要的介紹。顧名思義,MPS檔案是以 .mps 字尾結尾的一種檔案格式,是用于表達線性和整數規劃問題的一種标準格式,現在許多的優化求解器都支援這種格式。MPS檔案是一種舊格式檔案類型,格式是固定的列格式。下列通過一個具體的優化模型來講述MPS檔案的命名規範。
線性規劃模型:
max x1 + 2 x2 + 3 x3 + x4
s.t. − x1 + x2 + x3 + 10 x4 ≤ 20
x1 − 3 x2 + x3 ≤ 30
x2 - 3.5 x4 = 0
0 ≤ x1 ≤ 40,x2 ≥ 0,x3 ≥ 0,2 ≤ x4 ≤3
其對應的MPS檔案内容為(綠色部分是小編加的解釋說明,原檔案中沒有):
NAME MindOptExample #NAME表示這個優化模型的名字,可不寫内容
ROWS #ROWS定義各行名字,包括目标函數與限制條件
N obj #N表示自由行,obj是對目标函數的命名,可任意取名
L c1 #L表示該行小于等于, c1是對該行的命名,可任意取名
L c2
E c3 #E表示該行等于
COLUMNS #COLUMS定義各列名字
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定義限制條件等号右邊的值
rhs c1 20 c2 30
BOUNDS #BOUNDS定義決策變量的上界或下界
UP bnd x1 40 #UP 表示上界
LO bnd x4 2 #LO 表示下界
UP bnd x4 3
ENDATA #ENDATA表示MPS檔案結束
結合上述優化模型來說明MPS檔案的命名規範:
- MPS檔案的内容固定從每行的第 2、5、15、25、40 和 50 列開始寫,并且區分大小寫。
- MPS檔案中每行(包括目标函數和限制)和每列(變量)都有一個名字。
- 第一行為NAME區域,表示這個優化模型的名字,後面可以不寫内容,寫在第15列。
- ROWS用來定義每個行的名字,包括目标函數與限制條件。在 ROWS 部分,限制矩陣的每一行必須有一個行類型和指定的行名稱。第2列或第3列為限制,其中
- E 表示該行等于
- L 表示該行小于等于, c1是對改行的命名,可以任意取名
- G 表示該行大于等于
- N 表示自由行, obj是對目标函數的命名,可以任意取名
- COLUMNS用來定義各列(變量)名字。在 COLUMNS 部分,變量名稱與目标系數和所有非零限制矩陣元素一起定義。從第5列開始寫,表示所在行的名字。如果變量系數為0,則不寫入。
- 第一列要空
- 第二清單示列的名字,也就是求解變量
- 第三清單示所在行的名字
- 第四清單示所在行與列對應的系數
- 其中 MARK0000‘MARKER’‘INTORG’與 MARK0001‘MARKER’ ‘INTEND’分别表示整數變量的起止
- 第五列、第六列分别與第三列、第四列的含義相同
- RHS定義限制條件等号右邊的值。從第5列開始寫,第5清單示所在行的名字
- 第二清單示 rhs 名字,可以任取
- 第四清單示所在行對應的 RHS 值
- BOUNDS用來定義決策變量的上界或下界,第2列寫限制條件,其中
- UP表示小于等于
- LO表示大于等于
- FX表示該變量為固定值
- FR表示該變量的範圍為 ( − ∞ , ∞ )
- MI 表示下界為負無窮
- PL 表示上界為正無窮
另外,MPS 變量預設的範圍為 [ 0 , ∞ )
- 以ENDATA表示MPS檔案結束。
FREE MPS
此外,MindOpt 支援 Free MPS 格式。Free MPS 格式與 fixed MPS 格式類似,相對來說限制更少。
例如,Free MPS 格式允許定義更長的名稱,或是支援指定超過12位的值。其中字段沒有 fixed MPS 中嚴格的固定的列位置的限制,它們可以寫在除第一列之外的任何地方,每個字段與下一個字段之間用一個或多個空格隔開,但是它們必須按照相同的固定格式出現。在rows和bounds的代碼部分,可以是小寫或大寫,并且可以從任意位置開始。重複的列名有時會被跳過,并在其中放置系統自定義的名稱。
但是,與MPS格式相比,Free MPS 格式有一個重要的限制:名稱中不能包含空格。需要注意的是,Free MPS 解析器不能讀取所有的 fixed MPS 格式,名稱中的空格或以空格開頭的名稱在讀取時可能會産生問題。
OBJSENSE
和許多其他求解器一樣,MindOpt 也在 free MPS 格式中增加了一個“規則” OBJSENSE,用來指明優化方向。這是一個可選的部分,在 OBJSENSE 下方的一行将通過MAXIMIZE, MAX, MINIMIZE, MIN 關鍵字來指明優化方向。若未指定,則預設使用極小化方向(類似 fixed MPS 格式)。
格式如下:
MAX
此外,這個 OBJSENSE 的部分應寫在 ROWS 之前。
更細節的MPS格式說明見:
http://web.mit.edu/lpsolve_v5520/doc/mps-format.htm聯系我們:
釘釘群:32451444
更多更新通知:
https://solver.damo.alibaba.com