MyEnigmaスマートフォン用の表示で見るMyEnigmaとあるエンジニアのブログです。Pythonでの解き方を紹介したいと思います。変数が複数の一次不等式や等式によって制約が与えられている時に、ある一次のコスト関数を最大・最小化させる方法です。等式制約に変換することができます。myenigma.hatenablog.com線形計画法を二次元の図に表すと下記のようになります。点線はコスト関数の等高線を表しています。線形計画法の場合、コスト関数の等高線は直線で表されます。工学だけでなく、経済学や経営学でも広く利用されています。様々な計画に対して最も効率的に行う方法を求める学問では、この線形計画法が非常に広く使われています。オペレーションズ・リサーチ部この線形計画法を解く上で重要な考え方として、それぞれの制約条件によって決定する変数の可能領域を表す多次元凸多面体の頂点にのみ最適解があるということです。極値を多面体内部や辺上で取らないためです。method)が有名です。線形計画法を解いてみたいと思います。際に紹介したPython最適化ソルバーcvxoptに線形計画法を解く機能があるので、こちらを利用したいと思います。下記の書籍のP171の例題を実際にPythonを使って解いてみたいと思います。等式制約は下記の通りとします。各変数はすべて0以上という不等式制約もあるとします。最後に最終的な目的は下記の評価関数を最大化したいと思います。線形計画法を解く場合はsolvers.lpというメソッドを使います。最大値を求めることができます。係数がマイナスになっていることに注意が必要です。下記のコードでは、Gとhが不等号制約、Aとbが等号制約を表しています。objective"])下記が実際に上記のコードを実行した結果になります。解の答えはx1=10,x2=5,x3=0,x4=0で最大値f=515なので、fの符号を反転していることを考えると、ちゃんと正しい値が計算できていることがわかります。上記のコードは下記でも公開しています。解きたい問題をわざわざ上記の線形計画法の標準形に変形する必要があります。線形計画法PythonモデリングライブラリPuLPです。線形計画法を解くことができます。続いて、Juliaという比較的新しいプログラム言語で線形計画法を解いてみたいと思います。myenigma.hatenablog.com今回はJuMPというJuliaの最適化ライブラリを使うことにします。下記のシンプルな線形計画問題を解いてみたいと思います。上記の問題を解く、Juliaのコードは下記の通りです。getvalue(x3))github.com上記を実行すると、下記のように線形計画問題を解くことができます。シンプルな線形計画問題2以前、cvxpyで解いたシンプルな線形計画問題をJumpで解いてみました。println("z2:",getvalue(z2))endmain()github.com上記を実行すると下記のように、cvxpyで同じ問題を解いた時と同じ結果が得られます。一つ注意点として、abs関数をコスト関数の中で利用する場合は、@objectiveではなく、@NLobjectiveを使う必要があるみたいです。stackoverflow.com下記はその他のサンプルです。println("z3:",getvalue(z3))endJuMPによる最小二乗法解法サンプルコード以前、cvxpyで解いた最小二乗法問題をJumpで解いてみました。println("x:",getvalue(x))endmain()github.comすると下記のように最小二乗法の計算結果が得られます。最適化問題が数式みたいに表示されるのはいい感じですね。行と列で綺麗に表示されないのが悲しい。integer)最適化問題をJuMPを使って解いてみます。下記がJuliaのサンプルコードです。integerを解くことができる。MosekとCPLEXをソルバーとして使っています。println("z3:",getvalue(z3))endmain1()main2()github.comJuMPによるナップサック問題の解法サンプルコード以前cvxpyで解いたナップサック問題をJuMPで解いてみました。endendmain()github.com下記のようにちゃんとcvxpyの時と同じ結果が得られています。注意点としては、最適化変数をboolenにしたい時は、Boolを与えるのではなく、JuMP専用のbinを型として与える必要があります。続いて、同じくcvxpyでも実施した一つの商品を複数回選んで良い場合のコードはこちらです。endendmain()github.com今回はなんとなくソルバーとしてCPLEXを使ってみました。ソルバーオブジェクトの名前がCplexSolverであることに注意が必要です。以前の結果と同じ結果が得られています。ナップサック問題におけるcvxpyとJuMPの計算速度比較Juliaは計算が早いことで有名な言語なので、cvxpyとJuMPで計算速度のベンチマークを取ってみました。prob.value)下記がjuliaのコードです。endmain()github.comナップサック問題の商品の数を30000個にした場合の比較です。1.4[s]十倍以上早いですね。Juliaのコンパイル時間をいれても3秒ほどだったのでかなり早くなっています。CPLEXがすごいという噂もありますが。有名な線形計画問題に最大流問題がありますが、こちらの解き方に関しては、下記の記事を参照ください。myenigma.hatenablog.comより詳しく線形計画法を学びたい人は下記の書籍がおすすめです。Supportersもしこの記事が参考になり、ブログをサポートしたいと思われた方は、こちらからよろしくお願いします。はてなブログProとあるエンジニアのブログです。Page月別アーカイブスポンサーリンクスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。