組合せ最適化を体系的に知ってpythonで実行してみよう pycon 2015

31
組組組組組組組 組組組組組組 Python 組組組組組組組組 斉斉斉 PyCon 2015 10/10

Upload: saitotsutomu

Post on 06-Jan-2017

12.823 views

Category:

Education


9 download

TRANSCRIPT

Page 1: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

組合せ最適化を体系的に知って Pythonで実行してみよう斉藤努

PyCon 2015 10/10

Page 2: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

Agenda

• はじめに• 定式化• 体系

• 実行例• 事例• まとめ

2

Page 3: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

はじめに ( 自己紹介 )

• 名前:斉藤努• 仕事:組合せ最適化を使った開発など• 言語: Python 、 C#• 書籍:「組合せ最適化」

10/22 出版記念セミナーをします「最適化出版セミナー」で検索 !

3

Page 4: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

はじめに ( 今日の目的 )

• 組合せ最適化を使えるようになること– 体系を知ること– 実装を知ること– 事例を知ること

4

Page 5: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

はじめに ( 身近にある組合せ最適化 )

• 最適なやり方はどうすればよい?– 全パターンを調べると組合せ数が爆発!

5

先日、あなたが実家に帰ると、お土産に野菜を持って帰るよう言われました。東京の野菜は高いので、「儲かった」と喜びましたが、量が多すぎます。せいぜい 5kg しか持って帰れないとします。 ( 宅配便は使えないことにしてください ) また、野菜は切ったりすると傷むので、そのまま持って帰ることにします。100 円

150g

Page 6: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

はじめに ( 数理最適化 )

• 数理最適化によるアプローチ– 数理モデル ( 数式による表現 )

6

最大化 : 販売価格 : 重さ

: 持って帰るかどうか

Page 7: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

はじめに(数理最適化)• 数理最適化

– 連続最適化– 組合せ最適化 ← 今日のテーマ

7

Page 8: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

定式化• 組合せ最適化では、数理モデルを定式化します• 定式化に必要なのは 3 つの要素

↓1. 何を決めたいのか?「持って帰る野菜を決めたい」2. どうなるとうれしいのか?「持って帰る野菜の販売価格の合計が高くなるとうれしい」3. 守らないといけないことは?

「持って帰る野菜を 5kg 以下にします」8

Page 9: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

定式化• 3 つの要素を、変数、目的関数、制約条件といいます

9

1. 変数2. 目的関数 → 最大化3. 制約条件

Page 10: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

定式化• 定式化には、数学的な考え方と慣れが必要

– 体系を知ることにより• 全体的な理解がしやすくなります

– 実装を知ることにより• 理解を深めることができます

– 数理モデルは、 Python で記述できます– 事例を知ることにより

• 考え方に慣れます10

Page 11: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

定式化(ソルバー)• 定式化された数理モデルは、ソルバー ( 外部実行モジュール ) を利用して解くことができます。

• ソルバーは、無料や有料でいろいろあります。• ソルバーの性能が飛躍的に向上! 11

問題 数理モデル ソルバー 解定式化 実行 出力入力

Page 12: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

体系• 上手に使うには、体系的にとらえることが重要• 体系的にとらえるために、問題を分類します• 「標準問題」による分類• 「数理問題」による分類

12

1 つの問題を2 面的にとらえる

Page 13: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

体系 ( 標準問題 )

• 標準問題とは、よくある問題に名前を付けたもの• 例えば、先ほどの例は、ナップサック問題とよばれます

13

容量 C のナップサックが一つと、 n 種類の品物(各々、価値 pi, 容積 ci )が与えられたとき、ナップサックの容量 C を超えない範囲でいくつかの品物をナップサックに詰め、ナップサックに入れた品物の価値の和を最大化するにはどの品物を選べばよいか … wikipedia より

ナップサック問題

Page 14: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

体系 ( 標準問題 )

1. 最小全域木問題2. 最大安定集合問題3. 最大カット問題4. 最小頂点被覆問題5. 最短路問題6. 最大流問題7. 最小費用流問題8. 運搬経路問題9. 巡回セールスマン問題10. 集合被覆問題11. 集合分割問題

12. ジョブショップ問題13. 勤務スケジューリング問題14. ナップサック問題15. ビンパッキング問題16. n次元詰込み問題17. 施設配置問題18. 容量制約なし施設配置問題19. 2次割当問題20. 一般化割当問題21. 最大マッチング問題22. 重みマッチング問題23. 安定マッチング問題

14

実務でよくでてくる問題を 23個厳選

「組合せ最適化 標準問題」で検索!

Page 15: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

体系 ( 標準問題クラス )

1. 最小全域木問題2. 最大安定集合問題3. 最大カット問題4. 最小頂点被覆問題5. 最短路問題6. 最大流問題7. 最小費用流問題8. 運搬経路問題9. 巡回セールスマン問題10. 集合被覆問題11. 集合分割問題

12. ジョブショップ問題13. 勤務スケジューリング問題14. ナップサック問題15. ビンパッキング問題16. n次元詰込み問題17. 施設配置問題18. 容量制約なし施設配置問題19. 2次割当問題20. 一般化割当問題21. 最大マッチング問題22. 重みマッチング問題23. 安定マッチング問題

15

標準問題クラス:標準問題のグループ

グラフ・ネットワーク問題

経路問題集合被覆・分割問題

スケジューリング問題

切出し・詰込み問題

配置問題

割当・マッチング問題

Page 16: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

体系 ( 数理問題 )

• 単目的か多目的か• 連続か離散か• 線形か非線形か• 制約つきか制約なしか• 凸か非凸か• 微分可能かどうか• 確率的かどうか• …

• → 研究者によって多くの分類があります 16

Page 17: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

体系 ( 数理問題 )

• 最初は、ざっくり 3 分類を覚えましょう

17

超難しい難しいやさしい

(NLP)

(MIP)

(LP)

Page 18: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

体系 ( 標準問題と数理問題の関係 )

18

系統樹

Page 19: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

体系 ( 標準問題と数理問題の関係 )

• 1 つの課題をいろいろな問題としてとらえることができます。–混合整数最適化問題( 0-1 変数で割当を表現)– 集合被覆問題(候補を列挙して選ぶ)– 最大マッチング問題(割当をマッチングと見る)

19

Page 20: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

体系 ( 標準問題と数理問題の関係 )

• 標準問題 → 専用ソルバー• 数理問題 → 汎用ソルバー• 一般的には、標準問題の方が効率よく解ける可能性があります。• 標準問題では、とらえきれない場合 → 数理問題としてとらえます。

20

Page 21: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

実行例 ( ソフトウェアのインストール )

• Anaconda– Python および科学技術用各種パッケージを統合したディストリビューション– 利用したいバージョンのインストーラーを実行します。

• pip install pulp– 数理問題用のモデラーおよびソルバー。

• pip install ortoolpy– 標準問題用。最低限の機能のものや効率の悪いものも含まれています。(仕事では未使用)

21

Page 22: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

実行例 ( ナップサック問題 - 標準問題 )

• 選択された荷物の価値の総和 (105) と選択した荷物の順番 ([0, 1, 3, 4, 5]) が得られます。22

ナップサックに、いくつかの荷物を詰込みます。詰込む荷物の容量(size) の和がナップサックの容量 (capacity) を超えないように、荷物の価値 (weight) の和を最大にします。from ortoolpy import knapsacksize = [21, 11, 15, 9, 34, 25, 41, 52]weight = [22, 12, 16, 10, 35, 26, 42, 53]capacity = 100knapsack(size, weight, capacity)>>>(105, [0, 1, 3, 4, 5])

Page 23: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

実行例 ( 最短路問題 - 標準問題 )

• 8 個の点からなるランダムなグラフを作成し、ノード 0 からノード 2 への最短路となるノードのリスト ([0, 1, 6, 3, 5, 2]) が得られます。

23

グラフにおいて、始点から終点までの経路の中で最も短い経路を探します。import networkx as nxg = nx.fast_gnp_random_graph(8, 0.26, 1)nx.dijkstra_path(g, source=0, target=2)>>>[0, 1, 6, 3, 5, 2]

Page 24: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

実行例 ( ナップサック問題 - 数理問題 )

24

ナップサックに、いくつかの荷物を詰込みます。詰込む荷物の容量(size) の和がナップサックの容量 (capacity) を超えないように、荷物の価値 (weight) の和を最大にします。from pulp import *size = [21, 11, 15, 9, 34, 25, 41, 52]weight = [22, 12, 16, 10, 35, 26, 42, 53]capacity = 100r = range(len(size))m = LpProblem(sense=LpMaximize) # 数理モデルx = [LpVariable('x%d'%i, cat=LpBinary) for i in r] # 変数m += lpDot(weight, x) # 目的関数m += lpDot(size, x) <= capacity # 制約条件m.solve()print((value(m.objective), [i for i in r if value(x[i]) > 0.5]))>>>(105.0, [0, 1, 3, 4, 5])

再掲

定式化とほぼ対応

Page 25: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

事例 1( データベースの最適配置 )• 背景

–コールセンターでは、全国から多くの問い合わせが来ます。問い合わせに答えるため個人データがデータベースに格納されています。個人データは、地方ごとにまとめますが、保存先のストレージは、複数あります。• 問題

–個人データの保存するストレージ先を選択します。そのときに、ストレージごとのアクセスが平準化されるようにします。25

標準問題 数理問題 アルゴリズム一般化割当問題 NLP 局所探索法

Page 26: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

事例 2( 店舗シフトスケジューリング )• 背景

– 全国の店舗では、店長が毎月末に翌月の社員の勤務スケジュールを作成しています。様々な制約があるため、作成には時間がかかっています。• 問題

– 各店舗ごとに、社員の勤務スケジュールを作成します。勤務スケジュールでは、社員ごと日ごとのシフトを決定します。シフトは、日勤、休み、早番、遅番などがあります。制約としては、各社員の休みの希望や各日ごとの最低シフト数やシフトの禁止パターンなどがあります。26

標準問題 数理問題 アルゴリズム勤務スケジューリング問

題MIP 分枝限定法

Page 27: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

事例 3( ビークル間連携配送最適化 )• 背景

– 物資の保管所から避難場所に物資を運びたい。輸送手段は、陸海空全て使うことができます。また、フェリーなどの定期便も利用できます。• 問題

– 品物、輸送元、輸送先、数量、輸送期限からなる配送オーダーを満たす配送計画を求めます。配送計画では、いつ、何を、どうやって運ぶかを決めます。オーダーは 1 回で運んでもよいし、複数の輸送手段で連携して運んでもよいです。27

標準問題 数理問題 アルゴリズム運搬経路問題 MIP 貪欲法

Page 28: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

事例 4( 航空貨物の最適積み付け )• 背景

–航空貨物のほとんどは、パレット上にパッキングして、航空機内の形状に合わせて詰め込んでいます。• 問題

–様々な大きさの貨物をパレット上に効率よく詰め込む方法を求めます。一番下に置かないといけないとか上に積んではいけないとか様々な制約があります。

28

標準問題 数理問題 アルゴリズム3次元詰込み問

題MIP 貪欲法

Page 29: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

事例 5( バスの最適仕業作成 )• 背景

– バスのダイヤを組合わせて仕業 ( 系統や路線 )を作成します。 1 つの仕業は 1人のドライバーが対応します。労働基準法も満足しなければいけません。• 問題

– バスのドライバーの人数を最小になる仕業を 作成します

29

標準問題 数理問題 アルゴリズムマッチング問

題MIP エドモンズ法

Page 30: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

事例 6( 空箱の輸送コスト最適化 )• 背景

– 物を箱に入れて輸送しているときに、需要地と供給地に偏りがあると、空箱が需要地に溜まっていきます。この空箱を供給地に戻さないといけません。コンテナやパレットやレンタカーなど、いろいろな分野で見られます。• 問題

–グラフ上において、複数の需要点と複数の供給点があります。需要点から供給点へ、費用を最小にするフロー ( 流量 ) を求めます。

30

標準問題 数理問題 アルゴリズム最小費用流問題 LP 負閉路除去法

Page 31: 組合せ最適化を体系的に知ってPythonで実行してみよう PyCon 2015

PyCon JP 2015 10/10

まとめ• 標準問題と数理問題による俯瞰で体系を理解• Python により簡潔に実行→ 組合せ最適化が使える!

「組合せ最適化を使おう」で検索!

31