GLPK/跨平臺 IDEs
此頁面列出了跨平臺整合開發環境 - 在大多數情況下,Windows、Mac OS X 和 Linux。並非所有 IDE 都支援 MathProg 程式設計。
jEdit 5 是一個跨平臺程式設計編輯器,支援 GLPK。檢視此 2012 年 11 月的 帖子 瞭解更多資訊。
Coliop3 是一個用於解決線性(LP)和混合整數規劃(MIP)問題的 IDE(整合開發環境)。該專案包含 CMPL(Coliop 語言)並使用 GLPK 作為求解器。
CMPL 是一種數學程式語言,用於對線性規劃 (LP) 問題或混合整數規劃 (MIP) 問題進行建模。CMPL 語法在公式方面與原始數學模型相似,但也包含現代程式語言的語法元素。CMPL 的目的是將數學模型的清晰性與程式語言的靈活性結合起來。
Coliop3 和 CMPL 是德國 Wildau 應用技術大學和馬丁·路德·哈雷-維滕貝格大學運籌學與企業管理研究所的專案。
Coliop3 和 CMPL 是開源專案,根據 GPL 許可,可在 Linux、Mac OS X 和 Microsoft Windows 上使用。
Sublime Text 2 是一個功能強大的商業編輯器,適用於 Windows、Linux 和 OS X。以下指令碼定義了使用在 4.47 GLPK 版本的 MathProg 中找到的所有符號和控制標記的 GNU MathProg 的語法高亮顯示。以下 plist 語法定義檔案可以簡單地新增到主機平臺上的 Sublime Text 2 Packages/User 目錄中,然後重新啟動 Sublime 編輯器。預設情況下,語法高亮顯示為 .mod 和 .dat 檔案定義。
引數、變數和集合的語法高亮顯示對任何編輯器來說都是一項挑戰,為了區分引數、變數和集合,必須使用命名約定。以下程式碼使用以下命名約定,以便可以輕鬆區分引數、變數和集合。
set regexp: [A-Z][A-Z0-9_]+ eg. SWAP_CONTRACTS [c constant convention] params regexp: [A-Z][A-Za-z0-9_]+ eg. DailyGenerationCost [CamelCase]
用於建立 plist 檔案的 JSON 格式程式碼包含在下面,plist 程式碼本身可以進行編輯以實現您自己的命名約定或任何其他更改。
| GMPL.tmLanguage |
|---|
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>fileTypes</key>
<array>
<string>mod</string>
<string>dat</string>
</array>
<key>name</key>
<string>GNU MathProg</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#comments</string>
</dict>
<dict>
<key>match</key>
<string>\b(set|setof|param|var)\b</string>
<key>name</key>
<string>support.class.gmpl</string>
</dict>
<dict>
<key>match</key>
<string>\b(&&|and|by|sum|prod|exists|cross|diff|div|in|Infini|inter|less|mod|not|dimen|or|\|\||symdiff|union|within|OUT|IN)\b</string>
<key>name</key>
<string>keyword.operator.gmpl</string>
</dict>
<dict>
<key>match</key>
<string>\b(data|end|display|for|forall|else|if|then|solve|maximize|minimize|table|check|subj(?:ect)?\s+to)\b</string>
<key>name</key>
<string>keyword.control.gmpl</string>
</dict>
<dict>
<key>comment</key>
<string>separate definition as . matches \b</string>
<key>match</key>
<string>\s*(s\.t\.)\s+</string>
<key>name</key>
<string>keyword.control.gmpl</string>
</dict>
<dict>
<key>match</key>
<string>\b(binary|integer|symbolic)\b</string>
<key>name</key>
<string>support.type.gmpl</string>
</dict>
<dict>
<key>match</key>
<string>\b(printf|abs|ceil|floor|exp|log|log10|max|min|sqrt|sin|cos|atan|atan2|round|trunc|Irand224|Uniform0|Uniform|Normal01|Normal|card|length|substr|str2time|time2str|gmtime)\b</string>
<key>name</key>
<string>support.function.gmpl</string>
</dict>
<dict>
<key>match</key>
<string>\b(true|false|TRUE|FALSE|xBASE|i?ODBC|MySQL|CSV)\b</string>
<key>name</key>
<string>constant.language.gmpl</string>
</dict>
<dict>
<key>match</key>
<string>\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\b</string>
<key>name</key>
<string>constant.numeric.gmpl</string>
</dict>
<dict>
<key>comment</key>
<string>set CONSTANT idiom</string>
<key>match</key>
<string>\b[A-Z][A-Z0-9_]+\b</string>
<key>name</key>
<string>constant.character.gmpl</string>
</dict>
<dict>
<key>comment</key>
<string>variable idiom</string>
<key>match</key>
<string>\b[A-Z][A-Za-z0-9_]+\b</string>
<key>name</key>
<string>variable.other.gmpl</string>
</dict>
<dict>
<key>begin</key>
<string>"</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.gmpl</string>
</dict>
</dict>
<key>end</key>
<string>"</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.gmpl</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.double.gmpl</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string_escaped_char</string>
</dict>
<dict>
<key>include</key>
<string>#string_placeholder</string>
</dict>
</array>
</dict>
<dict>
<key>begin</key>
<string>'</string>
<key>beginCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.begin.gmpl</string>
</dict>
</dict>
<key>end</key>
<string>'</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.end.gmpl</string>
</dict>
</dict>
<key>name</key>
<string>string.quoted.single.gmpl</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#string_escaped_char</string>
</dict>
</array>
</dict>
</array>
<key>repository</key>
<dict>
<key>comments</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>begin</key>
<string>/\*</string>
<key>end</key>
<string>\*/</string>
<key>name</key>
<string>comment.block.gmpl</string>
</dict>
<dict>
<key>match</key>
<string>\*/.*\n</string>
<key>name</key>
<string>invalid.illegal.stray-comment-end.gmpl</string>
</dict>
<dict>
<key>begin</key>
<string>#</string>
<key>end</key>
<string>$\n?</string>
<key>name</key>
<string>comment.line.number-sign.gmpl</string>
</dict>
<dict>
<key>begin</key>
<string>//</string>
<key>end</key>
<string>$\n?</string>
<key>name</key>
<string>comment.line.double-slash.gmpl</string>
</dict>
</array>
</dict>
<key>string_escaped_char</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>\\(\\|[abefnprtv'"?]|[0-3]\d{,2}|[4-7]\d?|x[a-fA-F0-9]{,2}|u[a-fA-F0-9]{,4}|U[a-fA-F0-9]{,8})</string>
<key>name</key>
<string>constant.character.escape.gmpl</string>
</dict>
<dict>
<key>match</key>
<string>\\.</string>
<key>name</key>
<string>invalid.illegal.unknown-escape.gmpl</string>
</dict>
</array>
</dict>
<key>string_placeholder</key>
<dict>
<key>patterns</key>
<array>
<dict>
<key>match</key>
<string>(?x)%
(\d+\$)? # field (argument #)
[#0\- +']* # flags
[,;:_]? # separator character (AltiVec)
((-?\d+)|\*(-?\d+\$)?)? # minimum field width
(\.((-?\d+)|\*(-?\d+\$)?)?)? # precision
(hh|h|ll|l|j|t|z|q|L|vh|vl|v|hv|hl)? # length modifier
[diouxXDOUeEfFgGaACcSspn%] # conversion type
</string>
<key>name</key>
<string>constant.other.placeholder.gmpl</string>
</dict>
<dict>
<key>match</key>
<string>%</string>
<key>name</key>
<string>invalid.illegal.placeholder.gmpl</string>
</dict>
</array>
</dict>
</dict>
<key>scopeName</key>
<string>source.gmpl</string>
<key>uuid</key>
<string>1d90942b-6776-498d-9d0e-311525879872</string>
</dict>
</plist>
|
為了實現更大的更改,以下 JSON 語法檔案比 xml plist 檔案更容易編輯,但您需要在 Sublime 編輯器中載入 AAAPackageDev 包。將 JSON 格式檔案轉換為 xml plist 格式的完整說明可以在 Sublime text 2 語法定義 中找到。
| GMPL.JSON-tmLanguage |
|---|
{
"name": "GNU MathProg",
"scopeName": "source.gmpl",
"fileTypes": [
"mod",
"dat"
],
"patterns": [
{
"include": "#comments"
},
{
"match": "\\b(set|setof|param|var)\\b",
"name": "support.class.gmpl"
},
{
"match": "\\b(&&|and|by|sum|prod|exists|cross|diff|div|in|Infini|inter|less|mod|not|dimen|or|\\|\\||symdiff|union|within|OUT|IN)\\b",
"name": "keyword.operator.gmpl"
},
{
"match": "\\b(data|end|display|for|forall|else|if|then|solve|maximize|minimize|table|check|subj(?:ect)?\\s+to)\\b",
"name": "keyword.control.gmpl"
},
{
"match": "\\s*(s\\.t\\.)\\s+",
"name": "keyword.control.gmpl",
"comment": "separate definition as . matches \\b"
},
{
"match": "\\b(binary|integer|symbolic)\\b",
"name": "support.type.gmpl"
},
{
"match": "\\b(printf|abs|ceil|floor|exp|log|log10|max|min|sqrt|sin|cos|atan|atan2|round|trunc|Irand224|Uniform0|Uniform|Normal01|Normal|card|length|substr|str2time|time2str|gmtime)\\b",
"name": "support.function.gmpl"
},
{
"match": "\\b(true|false|TRUE|FALSE|xBASE|i?ODBC|MySQL|CSV)\\b",
"name": "constant.language.gmpl"
},
{
"match": "\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\.?[0-9]*)|(\\.[0-9]+))((e|E)(\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\b",
"name": "constant.numeric.gmpl"
},
{
"comment": "set CONSTANT idiom",
"match": "\\b[A-Z][A-Z0-9_]+\\b",
"name": "constant.character.gmpl"
},
{
"comment": "variable idiom",
"match": "\\b[A-Z][A-Za-z0-9_]+\\b",
"name": "variable.other.gmpl"
},
{
"begin": "\"",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.gmpl"
}
},
"end": "\"",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.gmpl"
}
},
"name": "string.quoted.double.gmpl",
"patterns": [
{
"include": "#string_escaped_char"
},
{
"include": "#string_placeholder"
}
]
},
{
"begin": "'",
"beginCaptures": {
"0": {
"name": "punctuation.definition.string.begin.gmpl"
}
},
"end": "'",
"endCaptures": {
"0": {
"name": "punctuation.definition.string.end.gmpl"
}
},
"name": "string.quoted.single.gmpl",
"patterns": [
{
"include": "#string_escaped_char"
}
]
}
],
"repository": {
"comments": {
"patterns": [
{
"begin": "/\\*",
"end": "\\*/",
"name": "comment.block.gmpl"
},
{
"match": "\\*/.*\\n",
"name": "invalid.illegal.stray-comment-end.gmpl"
},
{
"begin": "#",
"end": "$\\n?",
"name": "comment.line.number-sign.gmpl"
},
{
"begin": "//",
"end": "$\\n?",
"name": "comment.line.double-slash.gmpl"
}
]
},
"string_escaped_char": {
"patterns": [
{
"match": "\\\\(\\\\|[abefnprtv'\"?]|[0-3]\\d{,2}|[4-7]\\d?|x[a-fA-F0-9]{,2}|u[a-fA-F0-9]{,4}|U[a-fA-F0-9]{,8})",
"name": "constant.character.escape.gmpl"
},
{
"match": "\\\\.",
"name": "invalid.illegal.unknown-escape.gmpl"
}
]
},
"string_placeholder": {
"patterns": [
{
"match": "(?x)%\n \t\t\t\t\t\t(\\d+\\$)? # field (argument #)\n \t\t\t\t\t\t[#0\\- +']* # flags\n \t\t\t\t\t\t[,;:_]? # separator character (AltiVec)\n \t\t\t\t\t\t((-?\\d+)|\\*(-?\\d+\\$)?)? # minimum field width\n \t\t\t\t\t\t(\\.((-?\\d+)|\\*(-?\\d+\\$)?)?)? # precision\n \t\t\t\t\t\t(hh|h|ll|l|j|t|z|q|L|vh|vl|v|hv|hl)? # length modifier\n \t\t\t\t\t\t[diouxXDOUeEfFgGaACcSspn%] # conversion type\n \t\t\t\t\t",
"name": "constant.other.placeholder.gmpl"
},
{
"match": "%",
"name": "invalid.illegal.placeholder.gmpl"
}
]
}
},
"uuid": "1d90942b-6776-498d-9d0e-311525879872"
}
|
可以透過定義構建系統並將構建定義檔案新增到主機平臺上的 Sublime Text 2 Packages/User 目錄中來新增用於檢查或執行 GLPK 的構建系統,在 Sublime Text 2 構建系統 中找到說明。以下示例在 Windows 平臺上實現了對當前編輯檔案的 GLPK 語法檢查執行。
| GLPK_check.sublime-build |
|---|
{
"cmd": ["c:\\glpk\\w64\\glpsol", "-m", "$file", "--check"],
"working_dir": "$project_path"
}
|
QSciTE 可能是未來的一個可能的 IDE,請檢視:http://code.google.com/p/qscite.