More Related Content
Similar to 集合知プログラミング5章前半
Similar to 集合知プログラミング5章前半 (6)
More from Atsushi Hayakawa
More from Atsushi Hayakawa (20)
集合知プログラミング5章前半
- 2. 自己紹介
● 所属:電気通信大学 システム工学科4年
● 氏名:早川 敦士
● Twitter: @gepuro
● 専攻:信頼性工学
● 興味:データ同化, 確率過程, テキストマイニ
ング,などなど
● 言語:python, R, awk, bash
最近、pythonのマイクロフレームワークFlaskで遊ん
でます。 2
- 3. 5章の概要
● 確率論的最適化について紹介されている
● 多数の変数があり、様々な組み合わせが考え
られる問題に対して、最適解を探すときに利
用される手法
5.1 グループ旅行
5.2 解の表現
5.3 コスト関数
5.4 ランダムサーチ(無作
為探索)
5.5 ヒルクライム
5.6 模擬アニーリング
5.7 遺伝アルゴリズム
今日のコードは、
3
https://github.com/gepuro/tokyoci5
にあります。
- 4. グループ旅行
CAK
ORD
BOS
さまざまな土地から同じ目的地
でグループ旅行を行い、レンタ
LGA カーを借りて、帰宅するまでの
スケジュールのコストを最適化
する。
考慮するコストの例
OMA
● 運賃
● 飛行時間
● 待ち時間
● 発時間
DAL ● レンタカーの貸出期間
MIA
4
- 5. コスト関数
コスト= 出立便のチケット代*6人分 +
帰宅便のチケット代*6人 +
全員が到着するまでの待ち時間 +
全員が帰宅便に乗るまでの待ち時間
+
レンタカーの追加料金
コストが最小化するようなスケジュールを求
める。
備考:
24時間以内にレンタカーを返却しないと、50ドルか
かる。 5
- 6. 出力
gepuro@tokyoci ~/tokyoci5 $ python optimization.py
Seymour BOS 12:34-15:02 $109 12:08-14:05 $142
Franny DAL 12:19-15:25 $342 9:49-13:51 $229
Zooey CAK 9:15-12:14 $247 15:50-18:45 $243
Walt MIA 15:34-18:11 $326 14:08-16:09 $232
Buddy ORD 14:22-16:32 $126 15:04-17:23 $189
Les OMA 15:03-16:42 $135 6:19- 8:13 $239
cost is 5583
書籍と結果が違うような・・・。
このプログラムが正しいものとして、進めていき
ます。
6
- 7. ランダムサーチ(無作為探索)
● スケジュールを乱数で作成し、それぞれのコ
ストを求めて、最良の推測を返す。
● 今回は、1000回繰り返し行い、求めた。
gepuro@tokyoci ~/tokyoci5 $ python randomoptimize.py
Seymour BOS 13:40-15:37 $138 6:39- 8:09 $ 86
Franny DAL 10:30-14:57 $290 9:49-13:51 $229
Zooey CAK 12:08-14:59 $149 8:19-11:16 $122
Walt MIA 12:05-15:30 $330 12:37-15:05 $170
Buddy ORD 12:44-14:17 $134 10:33-13:11 $132
Les OMA 11:08-13:07 $175 12:31-14:02 $234
cost is 3738
7
- 8. ヒルクライム
● 無作為解から出発し、近傍解の中からより優
れたものを探す
低コス 高コス
ト ト
8
- 9. ヒルクライムの結果
gepuro@ivy ~/tokyoci5 $ python hillclimb.py
Seymour BOS 13:40-15:37 $138 8:23-10:28 $149
Franny DAL 6:12-10:22 $230 17:14-20:59 $277
Zooey CAK 13:40-15:38 $137 8:19-11:16 $122
Walt MIA 11:28-14:40 $248 12:37-15:05 $170
Buddy ORD 9:42-11:32 $169 7:50-10:08 $164
Les OMA 9:15-12:03 $ 99 8:04-10:59 $136
cost is 3802
問題点
局所最小 ヒルクライムでは、局所最
小を求めてしまう。
局所最小 9
大域最小を求めた
- 10. 擬似アニーニング
● ヒルクライムのパワーアップ版
● 近傍のコストが現在のコストよりも大きくな
る場合でも、ある確率で現在解とする。
● プロセスが進むにつれて、悪い解を受け入れ
る確率を下げていく 図:高コストが100,低コスト90の場合の
p
高コストの解が受け入れる確率
p = e^(-(高コスト – 低コスト)/温度)
10
- 11. 擬似アニーニングの結果
gepuro@tokyoci ~/tokyoci5 $ python annealing.py
Seymour BOS 13:40-15:37 $138 10:33-12:03 $ 74
Franny DAL 10:30-14:57 $290 10:51-14:16 $256
Zooey CAK 8:27-10:45 $139 13:37-15:33 $142
Walt MIA 9:15-12:29 $225 15:23-18:49 $150
Buddy ORD 9:42-11:32 $169 10:33-13:11 $132
Les OMA 13:37-15:08 $250 11:07-13:24 $171
cost is 3456
11
- 12. 遺伝(的)アルゴリズム
遺伝的アルゴリズムは一般に以下の流れで実装される。なお、下記では個体数を
N, 最大世代数を G と置く。
1. あらかじめ N 個の個体が入る集合を二つ用意する。以下、この二つの集合を「現
世代」、「次世代」と呼ぶことにする。
2. 現世代に N 個の個体をランダムに生成する。
3. 評価関数により、現世代の各個体の適応度をそれぞれ計算する。
4. ある確率で次の3つの動作のどれかを行い、その結果を次世代に保存する。
1. 個体を二つ選択(選択方法は後述)して交叉(後述)を行う。
2. 個体を一つ選択して突然変異(後述)を行う。
3. 個体を一つ選択してそのままコピーする。
5. 次世代の個体数が N 個になるまで上記の動作を繰り返す。
6. 次世代の個体数が N 個になったら次世代の内容を全て現世代に移す。
7. 3. 以降の動作を最大世代数 G 回まで繰り返し、最終的に「現世代」の中で最も
適応度の高い個体を「解」として出力する。
12
http://ja.wikipedia.org/wiki/遺伝的アルゴリズム より引用
- 14. 遺伝(的)アルゴリズム
2. 現世代に N 個の個体をランダムに生成する
現世代:N
個
[7,5,2,3,1,6,1,6,7,1,0,3]
[0,4,0,3,8,8,4,4,8,5,6,1]
[7,2,2,2,3,3,2,3,5,2,0,8]
[5,8,0,2,8,8,8,2,1,6,6,8]
14
http://ja.wikipedia.org/wiki/遺伝的アルゴリズム より引用
- 15. 遺伝(的)アルゴリズム
3. 評価関数により、現世代の各個体の適応度をそれぞれ計算
する 現世代:N
個
cost:6270
[7,5,2,3,1,6,1,6,7,1,0,3]
cost:6396
[0,4,0,3,8,8,4,4,8,5,6,1]
cost:4905
[7,2,2,2,3,3,2,3,5,2,0,8]
cost:6375
[5,8,0,2,8,8,8,2,1,6,6,8]
15
http://ja.wikipedia.org/wiki/遺伝的アルゴリズム より引用
- 17. 遺伝(的)アルゴリズム
4. ある確率で次の3つの動作のどれかを行い、その結果を次
世代に保存する。
1. 個体を二つ選択(選択方法は後述)して交叉(後述)を行
選択
う。
現世代:N
個
cost:6270
[7,5,2,3,1,6,1,6,7,1,0,3]
cost:6396
[0,4,0,3,8,8,4,4,8,5,6,1]
cost:4905
[7,2,2,2,3,3,2,3,5,2,0,8]
cost:6375
[5,8,0,2,8,8,8,2,1,6,6,8]
17
- 18. 遺伝(的)アルゴリズム
4. ある確率で次の3つの動作のどれかを行い、その結果を次
世代に保存する。
1. 個体を二つ選択(選択方法は後述)して交叉(後述)を行
選択
う。
選択方法
• ルーレット選択
• p_i = f_i / Σf の確率で選択する方法
• ランキング選択
• 順位毎に選択確率を定めていく方法
• トーナメント選択
• 個体群からのランダムサンプリングして、その中で
の適応度が高いものを選択する方法
• エリート主義
• 適応度が高いものを一定数、次世代に残す方法
集合知プログラミングでは、簡易のためなのかエリート主
義を用いられている。 18
- 19. 遺伝(的)アルゴリズム
4. ある確率で次の3つの動作のどれかを行い、その結果を次
世代に保存する。
1. 個体を二つ選択(選択方法は後述)して交叉(後述)を行
選択
う。 一点交叉の場合
[7,5,2,3,1,6,1,6,7,1,0,3]
他には、
• ニ点交叉
[7,2,2,2,3,3,2,3,5,2,0,8]
• 多点交叉
• 一様交叉
がある。
[7,5,2,3,1,6,1,6,7,2,0,8]
19
- 20. 遺伝(的)アルゴリズム
4. ある確率で次の3つの動作のどれかを行い、その結果を次
世代に保存する。
2. 個体を一つ選択して突然変異(後述)を行う。
低い確率で、遺伝子の情報を書き換える。(0.1%〜数%程度)
[5,8,0,2,8,8,8,2,1,6,6,8]
[5,8,0,2,8,8,8,2,1,5,6,8]
20
- 21. 遺伝(的)アルゴリズム
4. ある確率で次の3つの動作のどれかを行い、その結果を次
世代に保存する。
3. 個体を一つ選択してそのままコピーする。
[0,4,0,3,8,8,4,4,8,5,6,1]
[0,4,0,3,8,8,4,4,8,5,6,1]
21
- 24. 遺伝(的)アルゴリズム
7. 3. 以降の動作を最大世代数 G 回まで繰り返し、最終的に
「現世代」の中で最も適応度の高い個体を「解」として出力す
る。
第一世代:N 第ニ世代:N
個 個
第三世代:N
第G世代:N個
個
最適解の個体
24
- 25. 遺伝的アルゴリズムの結果
gepuro@tokyoci ~/tokyoci5 $ python ga.py
Seymour BOS 12:34-15:02 $109 10:33-12:03 $ 74
Franny DAL 6:12-10:22 $230 9:49-13:51 $229
Zooey CAK 12:08-14:59 $149 8:19-11:16 $122
Walt MIA 11:28-14:40 $248 8:23-11:07 $143
Buddy ORD 12:44-14:17 $134 7:50-10:08 $164
Les OMA 12:18-14:56 $172 8:04-10:59 $136
cost is 2624
25