最適化
Julia
組合せ最適化
JuMP

最適化におけるJulia - JuMP事始め

More than 1 year has passed since last update.

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 の変数を使って、問題を記述すれば、見通しがよいでしょうね。