電算倶楽部 富山県のコンピュータ社会人サークル

富山県、特に滑川市、富山市、魚津市周辺で活動している社会人サークルです。

Juliaで数理計画入門

前置き

数理計画の講義を受けてきました。 学生時代に授業を受けたことがありますが、なかなか仕事で扱うことが少ないものです。

使う機会がないので忘れ去られがちですが、Excelにはソルバープラグインという数理計画問題を解くための機能が存在します。

先代から伝わる遺物「Microsoft Office 2007 Professional」の出番です。

オプションからアドインを有効化。配色が古めかしい趣がありますね。

f:id:s-densan:20191205214459p:plain

ソルバーアドインを有効にします。

f:id:s-densan:20191205214524p:plain

…………………………………………

f:id:s-densan:20191205214557p:plain

あー、だめでした。 インストールが悪かったのかもしれませんが…

ということで方針転換。自分でプログラムを作ることにします。

今をときめく言語「Python」、ではなく、新進気鋭の言語「Julia」を使ってみました。

環境設定

Juliaのインストール

公式サイトからダウンロード、インストールします。 Windowsだとインストーラが用意されています。 https://julialang.org/

線形計画法パッケージの準備

Juliaは計算や分析に優れたプログラミング言語で、その目的のライブラリが多く公開されています。 今回は線形計画法パッケージ「JuMP」のインストールをします。 コマンドラインでjuliaとタイプし、REPL(対話式インタプリタモード)に入ります。 その中で以下のコマンドを実行するとJuMPとJuMPが依存するパッケージがインストールされます。

using Pkg
Pkg.add("JuMP")

同様にSolverアルゴリズムの「Clp」パッケージもインストールします。

Pkg.add("Clp")

インストールされたか確認してみます。

Pkg.installed()
Dict{String,Union{Nothing, VersionNumber}} with 2 entries:
  "Clp"  => v"0.7.0"
  "JuMP" => v"0.20.1"

大丈夫そうです。

最適化問題の定義

線形計画モデルです。前提のストーリーを書こうと思いましたが面倒なので数式のみです。

f:id:s-densan:20191205214637p:plain

最適化プログラム作成

こんな感じにしてみました。

using JuMP
using Clp

m = Model(with_optimizer(Clp.Optimizer))

# 決定変数
@variable(m, x1)
@variable(m, x2)

# 目的関数
@objective(m, Min, -2x1 - 3x2)

# 制約条件1
@constraint(m, 1x1 + 3x2 <= 24)
# 制約条件2
@constraint(m, 4x1 + 4x2 <= 48)
# 制約条件3
@constraint(m, 2x1 + 1x2 <= 22)

# 最適化計算の開始
JuMP.optimize!(m)

println("目的関数: ", JuMP.objective_value(m))
println("x1 = ", JuMP.value(x1))
println("x2 = ", JuMP.value(x2))

出力結果

Coin0506I Presolve 3 (0) rows, 2 (0) columns and 6 (0) elements
Clp0006I 0  Obj 0 Dual inf 0.0499998 (2) w.o. free dual inf (0)
Clp0006I 0  Obj 0 Dual inf 0.0499998 (2) w.o. free dual inf (0)
Clp0006I 2  Obj -30
Clp0000I Optimal - objective value -30
Clp0032I Optimal objective -30 - 2 iterations time 0.062
目的関数: -30.0
x1 = 5.999999999999999
x2 = 6.0

多分、あってる、はずです。

まとめ

Juliaで計算をしてみましたが、優れたライブラリが公開されているので簡単、かつソルバーの入れ替えも可能で自由度が高いなという印象を受けました。 今回は単純な計算だったので実感はできませんでしたが、高速に動作するとのことです。 まだまだメジャーとは言い難いですが、プログラミング言語の選択肢の一つに加えてみてはいかがでしょうか。