Julia(JuMP,GLPK)で線形計画法の問題を解く方法

どうも、木村(@kimu3_slime)です。

今回は、Julia(JuMP,GLPK)で線形計画法の問題を解く方法を紹介します。

 



準備

JuMPGLPKを使うので、持っていなければインストールしておきましょう。

準備として、以下のコードを実行しておきます。

 

線形計画法の問題を解く方法

例として、飲み物の生産量の最適化問題を考えましょう。

変数は\(x_1,x_2,x_3\geq 0\)

最小化したい目的関数は\(f(x)= x_1 +  2x_2 + 3 x_3\)

制約条件は\(x_1 + x_2 + x_3 =10\)、\(5 x_1 +  x_3 =20\)とします。

 

これをJuliaでモデル化してみましょう。

まず、「Model」によって線形計画法の空のモデルを作ります。これに変数、目的関数、制約条件を足していきましょう。カッコの中身「GLPK.Optimizer」は、GLPKを使って最適化することを意味したものです。

「@variable(model, 変数と仮定)」で変数\(x_1,x_2,x_3\)を追加します。条件「>=0」は、非負の値であるとの仮定です。

「@objective(model, Min,関数)」によって、目的関数が追加できます。Minならば最小化、Maxならば最大化です。

「@constraint(model, 条件名, 制約条件)」で制約条件の追加です。等号の条件は「==」とイコールが2つになることに注意しましょう。

「print(model)」で、これまでモデルに追加してきた内容が確認できます。

 

さて、このモデルを解いてみましょう。

「optimize!(model)」で最適化が実行されます。結果はそのままでは表示されません。

「termination_status(model)」で最適化の結果が表示されます。今回は「OPTIMAL」、つまり最適解に達しました。

「value(変数)」で最適解の値、「objective_value(model)」でそのときの目的関数の値が求められます。

きちんと解けました。

 

もうひとつ、別の線形計画問題を解いてみましょう。目的関数の最大化と、不等式の制約条件を課してみます。

変数は\(x_1,x_2,x_3\geq 0\)

最大化したい目的関数は\(f(x)= 2x_1 +  3x_2 + x_3\)

制約条件は\(x_1 + x_2 + x_3 \leq 4.8\)、\(10 x_1 +  x_3 \leq 9.9\)、\(x_2 -x_3 \leq 0.2\)とします。

 

最適化を実行します。

 

以上、Julia(JuMP,GLPK)で線形計画法の問題を解く方法を紹介してきました。

変数、関数、条件を与えれば、すぐに解いてくれるので便利です。

木村すらいむ(@kimu3_slime)でした。ではでは。

 

1から始める Juliaプログラミング
進藤 裕之(著), 佐藤 建太(著)
コロナ社 (2020-03-26T00:00:01Z)
5つ星のうち4.5
¥7,353 (コレクター商品)

 

こちらもおすすめ

線形代数の応用:線形計画法~輸送コストの最小化を例に

Julia(Optim)で2変数関数の最小値・最大値を求める方法