contentPython+PuLPによるタダで仕事に使える数理最適化Python最適化pulp追記(2019/05/01)「MIPCL」という別のフリーのソルバーのほうが、PuLP(に同こんされているCOIN-CBC)よりも速く問題を解いてくれるようです。MIPCLただし、MIPCLはインストールや文法に少しクセがあるようなので、現在のところは、速さを求めるならMIPCL、手軽さを求めるならPuLP、という使い分けができるのではないかと思います。PuLPで書いて解くのに時間がかかったときにMIPCLに書き直すのも一つの手だし、その手間を考えると最初からMIPCLを導入してそっちに慣れてしまうのも一つの手だと思います。J\end{alignat}を解いてくれる、PythonのPuLPパッケージを紹介します。対象ですが、目的関数と制約式が線形式(1次式)、変数が連続値または離散値またはそれらが混在したもので記述できるようなものとします。(整数線形計画問題)と呼ばれることもあります。PuLPとはPuLP自体は、Python上で数理最適化問題を簡単にコーディングできるモデリングAPI、モデリング言語だと思ったほうがよいです。実際に数式を解いてくれるソルバーとは別物なのですが、COINというソルバーが同こんされているので、PuLPをインストールするだけで問題を解けるようになります。PuLP自体はCOIN以外にもいくつかのソルバーに対応しているので、それらのソルバーが別途インストールされていれば、PuLPから呼び出すソルバーを(簡単に)切り替えることができます。Optimizerとかにもある独自のモデリング言語、あれって数式みたいにモデルを記述できるからわかりやすいよね。Suiteについてくる統合開発環境、いろいろ情報が表示できるしマウスでポチポチできて便利だよね。Studio(タダであるCommunityエディションやExpressエディションでも)上で使える!いろんなマシーンや環境で動く!!誰でもどこでも共同開発やテストができる!!!研究者さんや学生さんへ研究者さんや学生さんは、研究や学習を用途として、商用ソルバーが安価にあるいは無償で手に入るかもしれません。研究者さんは、研究内容が将来的に商用実用化に向かうもののようでしたら、その際にかかるコストも考慮して、今のうちからPython+PuLPの使用を検討ください。何回も書いてますが、PuLPからコールするソルバーは簡単に切り替えられるので、商用ソルバーの深いところ(整数最適化のパラメーターのチューニングなど)まで触る必要がないなら、モデリングAPIとしてPuLPは十分だと思います。Python用APIを持つ商用ソルバーからの移植や両立についても、必要となるコーディング量はそれほど多くはなりません。学生さんは、現在のバイト先あるいは将来の就職先やその客先などで数理最適化を活用することを考えて、今のうちからPython+PuLP(COIN)の使用を検討ください。案件の規模にもよりますが、商用ソルバーの購入や保守の費用を捻出させるだけの費用対効果を説明するのはけっこうハードル高いです。企業からの委託研究や共同研究などをしている場合でも同じです。企業の人が使える選択肢を考えてください。以上、個人的な見解でした。最近でてきたフリーのソルバーMIPCLのことはよくわからないので、触れていません。3の場合を想定して書きます。MacやLinuxなどでは適宜置き換えてください。2と3ではprint文の書き方などが異なっているので注意してください。Optimizerやシミュレーションソフトなどをインストールしていたならば、Pythonの処理系がひっついてきている可能性があります。\python.exeなどとフルパスで書いてもよいですが)。-Vと打って出力されるバージョンの数値を確認すると、どの処理系が呼ばれているかのヒントになります。実作業(場合によっては環境変数の並び替えをした後で)新規にコマンドプロンプトを起動します。Pythonが管理者権限での書き込みが必要なフォルダーにインストールされている場合は、「管理者として実行」で起動します。企業なんかでプロキシーに邪魔される場合は、以下のようにして一時的にコマンドプロンプトにプロキシーを設定すればいけそうです。pulpでインストールします。例(1)冒頭の問題(1)を解きます。0.66666667********余談(1)演算子のオーバーロードが使える言語は、数理最適化の式をラクに記述できますね。ない言語は...Javaさんは......例(2)冒頭の問題(2)を解きます。J.\end{alignat}余談(2)数理最適化の式って、$\sum$を頻繁に使いますよね。数理最適化のモデリング言語は、$\sum$をどう記述できるかが使いやすさの基本になってきます。その点、PuLPは安心です。mなどと記述しているものがありますが、$I$や$J$の要素が何を表しているのか、数字の$2$は$I$と$J$のどっちの要素なのか、混乱してくるので、集合を正の整数の列に置き換えず、集合の要素の名前も元の名前のまま使うことをお勧めします。PuLPでは、Pythonの辞書やタプルといった言語仕様を使うことで、自然にモデリングできます。あと、この問題の$\LaTeX$コマンドで書いた数式のように、各式の縦をそろえると、見やすくなっていいですよね。unimodularity)のおかげで、整数の最適解が得られるのはよく知られていますが、実際に仕事でモデル化すると、どんどん制約条件が増えていって、全ユニモジュラ性が崩れちゃうのがほとんどなんですよね。********おわりにボブの絵画教室よりも簡単だと思うので、ぜひPython+PuLPに触れてみてください。upLoginユーザーは見つかりませんでした。