数理最適化とPython

17,427 views

Published on

Published in: Technology
0 Comments
49 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
17,427
On SlideShare
0
From Embeds
0
Number of Embeds
745
Actions
Shares
0
Downloads
144
Comments
0
Likes
49
Embeds 0
No embeds

No notes for slide

数理最適化とPython

  1. 1. 数理最適化とPython<br />モデリングライブラリPyomoと最適化入門<br />質問など-> @_likr<br />
  2. 2. お前、誰よ<br />尾上 洋介(おのうえ ようすけ)<br />Twitter @_likr(りけると読んでください)<br />関西大学大学院総合情報学研究科 M1<br />数理最適化のアルゴリズムと応用の研究<br />ナップサック問題<br />株式会社スプーキーズエンジニア<br />Web,Android …<br />Python歴 2年<br />GAE,Django,Numpy,Python/C API,PyCUDA,SL4A …<br />質問など-> @_likr<br />
  3. 3. アジェンダ<br />科学技術計算とPython<br />最適化とPython<br />数理モデリング<br />モデリングライブラリPyomo<br />ケーススタディ<br />質問など-> @_likr<br />
  4. 4. 科学技術計算とPython<br />質問など-> @_likr<br />
  5. 5. 計算科学 (Computational Science)<br />コンピュータによる計算で問題解決を行う科学<br />物理シミュレーション<br />流体力学<br />化学<br />構造計算<br />バイオインフォマティクス<br />応用数学<br />四色問題の証明<br />≠計算機科学(Computer Science)<br />質問など-> @_likr<br />
  6. 6. Why Python?<br />豊富なライブラリ<br />batteries included<br />Numpy, Scipyをはじめとして,ネイティブ言語実装のライブラリが豊富<br />GUIでビジュアライズ<br />シンプルな構文<br />科学者は科学に集中したい<br />移植性<br />オープンソース<br />数十万〜百万円クラスのソフトがよく用いられる<br />質問など-> @_likr<br />
  7. 7. 科学技術計算分野でのPython<br />組織<br />NASA<br />今はそうでもないとかなんとか…<br />高エネルギー加速器研究機構<br />書籍<br />入門自然言語処理<br />Bioinformatics Programming Using Python<br />Python Scripting for Computational Science<br />質問など-> @_likr<br />
  8. 8. Pythonの数理最適化ライブラリ<br />質問など-> @_likr<br />
  9. 9. 数理最適化<br />Mathematical ProgrammingMathematical Optimization<br />実行可能領域内で目的関数を最大(最小化)する<br />解法から応用まで幅広い研究<br />経済学<br />マネジメント<br />回路設計<br />etc …<br />質問など-> @_likr<br />
  10. 10. 問題の種類での分類<br />線形計画問題<br />非線形計画問題<br />混合整数計画問題<br />ナップサック問題<br />巡回セールスマン問題<br />質問など-> @_likr<br />
  11. 11. 解法での分類<br />厳密解法<br />動的計画法<br />分枝限定法<br />近似解法<br />性能保証あり<br />近似アルゴリズム<br />性能保証なし<br />遺伝的アルゴリズム<br />ニューラルネットワーク<br />質問など-> @_likr<br />
  12. 12. Coopr<br />COmmon Optimization Python Repository<br />COIN-ORのサブプロジェクト<br />Pythonの最適化ライブラリ群<br />coopr.pyomo – モデリング<br />coopr.pysp – 確率計画アルゴリズム<br />COIN-OR<br />最適化関連ソフトウェアをオープンソースで提供することで学術研究の発展をはかるプロジェクト<br />質問など-> @_likr<br />
  13. 13. or-tools<br />Operations Research Toolsdeveloped at Google<br />Googleの中の人が開発<br />C++によるアルゴリズム実装とPythonによるアプリケーションレイヤ<br />質問など-> @_likr<br />
  14. 14. 最適化ソルバのAPI<br />最適化ソルバ<br />線形計画問題ソルバ,混合整数計画問題ソルバ…<br />ソルバの機能の一部を外部プログラムから利用したりソルバをアプリケーションに組み込むためのAPI<br />主要なソルバはAPIをC, C++だけでなくPythonでも提供<br />CPLEX<br />Gurobi<br />質問など-> @_likr<br />
  15. 15. その他<br />モデリング系<br />PuLP<br />POAMS<br />PyMathProg - PyGLPK<br />OpenOpt - scipy<br />アルゴリズム系<br />pyipopt - 非線形計画問題ソルバ<br />ecspy - 遺伝的アルゴリズム等の進化的計算パッケージ<br />質問など-> @_likr<br />
  16. 16. モデリング<br />質問など-> @_likr<br />
  17. 17. モデリング<br />最適化したい現象の数学的関係を表現<br />利益<br />コスト<br />生産能力<br />線形計画問題など具体的な問題クラスに落とし込むことでソルバで扱える<br />質問など-> @_likr<br />
  18. 18. 最適化問題の例<br />製品P1とP2を生産し利潤を最大化する<br />製品P1を1トン生産するには原料M1が2トン,M2が8トン,M3が3トン必要<br />製品P2を1トン生産するには原料M1が6トン,M2が6トン,M3が1トン必要<br />M1は27トンまで,M2は45トンまで,M3は15トンまでしか利用できない<br />P1とP2の1トンあたりの利潤はそれぞれ2百万円と5百万円<br />P1とP2を何トンずつ生産すればいいか?<br />質問など-> @_likr<br />
  19. 19. モデルのデザイン<br />何を決定するのか<br />P1とP2の生産量<br />x1, x2<br />何を目的にするのか<br />利潤<br />P1 1トンあたりの利潤 × x1+ P2 1トンあたりの利潤 × x2<br />質問など-> @_likr<br />
  20. 20. モデルのデザイン<br />制約は何か<br />原料の量<br />P11トンあたりのM1消費量×x1+p21トンあたりのM1消費量×x2≦ M1の消費可能量<br /> …<br />非負性<br />-1トン生産とかは不可能<br />質問など-> @_likr<br />
  21. 21. モデリングライブラリPyomo<br />Python Optimization Modeling Object<br />質問など-> @_likr<br />
  22. 22. 目的<br />オープンソース<br />柔軟性<br />移植性<br />ソルバ統合<br />モデルの抽象化(パラメータ分離)<br />cf. AMPL<br />質問など-> @_likr<br />
  23. 23. インストール<br />easy_installやpip<br />coopr_install<br />Windows用インストーラ<br />ソースコード<br />質問など-> @_likr<br />
  24. 24. 使い方<br />from coopr import pyomomodel = pyomo.AbstractModel()# TODO model の肉付けinstance = model.create()instance.pprint()<br />質問など-> @_likr<br />
  25. 25. 何を決定するのか<br />model.p = pyomo.Set(initialize=[1, 2])model.x = pyomo.Var(model.p, within=pyomo.NonNegativeReals)<br />Var<br />決定変数の定義に使用<br />within(=domain)<br />Reals(default), Binary, Integer, NonPositiveInteger…<br />Set<br />集合の定義に使用<br />モデルの抽象化<br />質問など-> @_likr<br />
  26. 26. 何を目的にするのか<br />rule = lambda model: 2*model.x[1] + 5*model.x[2]model.profit = pyomo.Objective(rule=rule, sense=pyomo.maximize)<br />Objective<br />目的関数の定義に使用<br />sense<br />minimize(default) or maximize<br />質問など-> @_likr<br />
  27. 27. 制約は何か<br />rule = lambda model: (2*model.x[1] + 6*model.x[2]) <= 27model.m1 = pyomo.Constraint(rule=rule)<br />Constraint<br />制約関数の定義に使用<br />ruleは真偽値を返す関数<br />質問など-> @_likr<br />
  28. 28. ソルバを使う<br />コンソール実行$ pyomomodel.py<br />model.py中に変数名modelでモデル定義<br />results.ymlが保存される<br />スクリプト内実行from coopr import optsolver = opt.SolverFactory('glpk')result = solver.solve(instance)print result<br />質問など-> @_likr<br />
  29. 29. 質問など-> @_likr<br />
  30. 30. 質問など-> @_likr<br />
  31. 31. 質問など-> @_likr<br />
  32. 32. ナップサック問題<br />ケーススタディ1<br />質問など-> @_likr<br />
  33. 33. 問題<br />価値が最大になるようにカバンに荷物を詰める<br />カバンには入れられる重さの制限がある<br />荷物にはそれぞれ価値と重さが決まっている<br />質問など-> @_likr<br />
  34. 34. モデルの抽象化<br />モデル(プログラム)とデータの分離<br />データを変えれば他の問題が解ける<br />質問など-> @_likr<br />
  35. 35. モデルのデザイン<br />何を決定するか<br />荷物iをカバンに入れるとき<br />xi = 1<br />そうでないとき<br />xi = 0<br />目的と制約<br />荷物iの価値 × xiの和<br />荷物iの重さ × xiの和がカバンの容量以内<br />xiは0または1<br />質問など-> @_likr<br />
  36. 36. ソースコード<br />質問など-> @_likr<br />
  37. 37. 事務所の分散<br />ケーススタディ2<br />質問など-> @_likr<br />
  38. 38. 問題<br />ある会社には部門が5つあり(A, B, C, D, E),現在全てがロンドンにある<br />部門の一部をブリストルとブライトンに再配置する<br />1つの都市における部門は3つまでとする<br />再配置をすればコストダウンによる利益(/年)が生じる<br />部門間は一定量の通信を行う<br />通信費(/年)は都市間ごとに決まっている<br />年間総費用を最小にするには各部門をどう配置する?<br />質問など-> @_likr<br />
  39. 39. パラメータ<br />再配置による利益<br />部門間の通信量<br />都市間の通信費<br />質問など-> @_likr<br />
  40. 40. 何を決定するか<br />各部門をどこに配置するか<br />部門iを都市jに配置するとき<br />xij = 1<br />そうでないとき<br />xij = 0<br />補助変数(通信費の計算に使う)<br />xij = 1 かつxkl = 1 のとき<br />yijkl = 1<br />そうでないとき<br />yijkl = 0<br />質問など-> @_likr<br />
  41. 41. 枠に収める<br />xi = 0 のとき部門iをブリストルに,xi = 1 のとき部門iをブライトンに,xi = 2 のとき部門iをロンドンにではダメ?<br />非線形性を持ち,MIPの枠外になる<br />yijklではなくxij × xklではダメ?<br />二次計画問題となり,MIPの枠外になる<br />質問など-> @_likr<br />
  42. 42. 目的を何にするか<br />利益の和 – 費用の和の最大化<br />部門iを都市jに置く利益<br />Pij × xij<br />部門iを都市jに置き,部門kを都市lに置く費用<br />Cjl × Qik × yijkl<br />質問など-> @_likr<br />
  43. 43. 制約は何か<br />1都市に3部門まで<br />1部門は1つの都市にしか置けない<br />yijkl = 1 の必要十分条件<br />yijkl = 1 ⇔ xij = 1 かつxkl = 1<br />yijkl – xij ≦ 0<br />yijkl – xkl ≦ 0<br />xij + xkl – yijkl ≦ 0<br />質問など-> @_likr<br />
  44. 44. 3次元3目並べ<br />ケーススタディ3<br />質問など-> @_likr<br />
  45. 45. 問題<br />27マス(3 × 3 × 3)の立方体のマスに○か×を置いていく<br />○の数は14個,×の数は13個<br />線(3マスが一直線に並んでいる状態)は49本ある<br />27マス全てを埋めて,同じ記号が並んでいる線の数を最小にする組み合わせを求めよ<br />興味を持った人は考えてみてください<br />質問など-> @_likr<br />
  46. 46. おわりに<br />質問など-> @_likr<br />
  47. 47. おわりに<br />最適化研究は着実に進歩しているが,世間では広く認知されていない?<br />ex. 被災地への義援金配分<br />Pythonは科学的なアプリを作る時にも有効<br />Pythonで最適化にチャレンジ!<br />質問など-> @_likr<br />
  48. 48. 参考図書<br />坂和正敏著「数理計画法の基礎」<br />前田英二郎監訳,小林英三訳「数理計画モデルの作成法」<br />絶版<br />原著H. Paul Williams「Model Building in Mathematical Programming」<br />質問など-> @_likr<br />
  49. 49. ご清聴ありがとうございました<br />質問など-> @_likr<br />

×