JuMP — Julia for Mathematical Optimization は、Julia で数理最適化を行うためのドメイン特化モデリング言語です。
特徴は、以下の通り。
- 線形計画法以外に、色々なソルバーが用意されています。 ソルバーのリスト → https://jump.readthedocs.io/en/latest/installation.html#getting-solvers
- JuMP の記述はソルバーに依存しません。
- JuMP 本体は Julia のみで書かれています。各ソルバーは下位のバイナリを呼ぶ場合があります。
- JuMP は Mozilla Public License です。(ソルバーのライセンスは種々)
- 速い (そうです)
インストール
Pkg.add("JuMP")
Pkg.add("Clp")
Clp
は線形計画法のソルバーです。
事始め
Python の PuLP は、線形計画法パッケージです。
Qiita記事 『最適化におけるPython』 の 「pulpの使い方」にある例題を JuMP に移植して見ました。問題はリンク先を参照ください。
Python - PuLP
from pulp import *
m = LpProblem(sense=LpMaximize)
x = LpVariable('x', lowBound=0)
y = LpVariable('y', lowBound=0)
m += 100 * x + 100 * y
m += x + 2 * y <= 16
m += 3 * x + y <= 18
m.solve() # ソルバーの実行
print(value(x), value(y)) # 4, 6
Julia - JuMP
using JuMP
using Clp
m=Model( solver=ClpSolver() ) # 数理モデル
@variable(m, x >= 0) # 変数
@variable(m, y >= 0) # 変数
@objective(m, Max, 100 * x + 100 * y ) # 目的関数
@constraint(m, x + 2 * y <= 16) # 制約条件
@constraint(m, 3 * x + y <= 18) # 制約条件
status = solve(m) # ソルバーの実行
getvalue(x) # => 4.0
getvalue(y) # => 6.0
PuLP と JuMP は、そっくりですね。
変数、目的関数、制約条件は、マクロで記述します。
■ 2017/05/23 修正---
本記事を執筆した 2017年1月当時は、using Clp
しておくと
m=Model()
とするだけで solver=ClpSolver()
が既定となっていました。現時点は solverを明示する必要があります。
■ 修正終わり ----
終わりに
リンク先には、Python のデータ分析パッケージ pandas のデータフレームと、PuLPとの連携が紹介されています。 pandas のデータフレームに相当する Julia パッケージは Dataframes です。Dataframes の変数を使って、問題を記述すれば、見通しがよいでしょうね。