跳轉到內容

GLPK/跨平臺 IDEs

來自華夏公益教科書

此頁面列出了跨平臺整合開發環境 - 在大多數情況下,Windows、Mac OS X 和 Linux。並非所有 IDE 都支援 MathProg 程式設計。


jEdit 5 是一個跨平臺程式設計編輯器,支援 GLPK。檢視此 2012 年 11 月的 帖子 瞭解更多資訊。

Coliop 專案

[編輯 | 編輯原始碼]

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

[編輯 | 編輯原始碼]

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(&amp;&amp;|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.

華夏公益教科書