集合知プログラミング5章前半
TRANSCRIPT
2
自己紹介
● 所属:電気通信大学システム工学科4年● 氏名:早川 敦士● Twitter: @gepuro● 専攻:信頼性工学● 興味:データ同化, 確率過程, テキストマイニング,などなど
● 言語:python, R, awk, bash
最近、pythonのマイクロフレームワークFlaskで遊んでます。
3
5章の概要
● 確率論的最適化について紹介されている● 多数の変数があり、様々な組み合わせが考えられる問題に対して、最適解を探すときに利用される手法5.1 グループ旅行5.2 解の表現5.3 コスト関数5.4 ランダムサーチ(無作為探索)5.5 ヒルクライム5.6 模擬アニーリング5.7 遺伝アルゴリズム
今日のコードは、https://github.com/gepuro/tokyoci5にあります。
4
グループ旅行
BOS
DAL
CAK
MIA
ORD
OMA
LGA
さまざまな土地から同じ目的地でグループ旅行を行い、レンタカーを借りて、帰宅するまでのスケジュールのコストを最適化する。考慮するコストの例● 運賃● 飛行時間● 待ち時間● 発時間● レンタカーの貸出期間
5
コスト関数コスト= 出立便のチケット代* 6人分 + 帰宅便のチケット代*6 人 + 全員が到着するまでの待ち時間 + 全員が帰宅便に乗るまでの待ち時間+ レンタカーの追加料金
備考:24時間以内にレンタカーを返却しないと、50ドルかかる。
コストが最小化するようなスケジュールを求める。
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 $239cost is 5583
書籍と結果が違うような・・・。このプログラムが正しいものとして、進めていきます。
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 $234cost is 3738
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 $136cost is 3802
問題点
局所最小
局所最小大域最小を求めたい
ヒルクライムでは、局所最小を求めてしまう。
10
擬似アニーニング● ヒルクライムのパワーアップ版● 近傍のコストが現在のコストよりも大きくなる場合でも、ある確率で現在解とする。
● プロセスが進むにつれて、悪い解を受け入れる確率を下げていく
高コストの解が受け入れる確率p = e^(-( – 高コスト 低コスト)/温度)
図:高コストが100,低コスト90の場合のp
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 $171cost is 3456
12
遺伝(的)アルゴリズム 遺伝的アルゴリズムは一般に以下の流れで実装される。なお、下記では個体数を
N, 最大世代数を G と置く。
1. あらかじめ N 個の個体が入る集合を二つ用意する。以下、この二つの集合を「現世代」、「次世代」と呼ぶことにする。
2. 現世代に N 個の個体をランダムに生成する。
3. 評価関数により、現世代の各個体の適応度をそれぞれ計算する。
4. ある確率で次の3つの動作のどれかを行い、その結果を次世代に保存する。
1. 個体を二つ選択(選択方法は後述)して交叉(後述)を行う。
2. 個体を一つ選択して突然変異(後述)を行う。
3. 個体を一つ選択してそのままコピーする。
5. 次世代の個体数が N 個になるまで上記の動作を繰り返す。
6. 次世代の個体数が N 個になったら次世代の内容を全て現世代に移す。
7. 3. 以降の動作を最大世代数 G 回まで繰り返し、最終的に「現世代」の中で最も適応度の高い個体を「解」として出力する。
http://ja.wikipedia.org/wiki/遺伝的アルゴリズム より引用
13
遺伝(的)アルゴリズム遺伝的アルゴリズムは一般に以下の流れで実装される。なお、下記では個
体数を N, 最大世代数を G と置く。
1. あらかじめ N 個の個体が入る集合を二つ用意する。以下、この二つの集合を「現世代」、「次世代」と呼ぶことにする。
現世代:N個
次世代:N個
14
遺伝(的)アルゴリズム
2. 現世代に N 個の個体をランダムに生成する
http://ja.wikipedia.org/wiki/遺伝的アルゴリズム より引用
現世代:N個
[7,5,2,3,1,6,1,6,7,1,0,3]
[7,2,2,2,3,3,2,3,5,2,0,8]
[5,8,0,2,8,8,8,2,1,6,6,8]
[0,4,0,3,8,8,4,4,8,5,6,1]
15
遺伝(的)アルゴリズム
3. 評価関数により、現世代の各個体の適応度をそれぞれ計算する
http://ja.wikipedia.org/wiki/遺伝的アルゴリズム より引用
現世代:N個
[7,5,2,3,1,6,1,6,7,1,0,3]
[7,2,2,2,3,3,2,3,5,2,0,8]
[5,8,0,2,8,8,8,2,1,6,6,8]
[0,4,0,3,8,8,4,4,8,5,6,1]
cost:6270
cost:4905
cost:6396
cost:6375
16
遺伝(的)アルゴリズム
4. ある確率で次の3つの動作のどれかを行い、その結果を次世代に保存する。
1. 個体を二つ選択(選択方法は後述)して交叉(後述)を行う。
2. 個体を一つ選択して突然変異(後述)を行う。3. 個体を一つ選択してそのままコピーする。
http://ja.wikipedia.org/wiki/遺伝的アルゴリズム より引用
17
遺伝(的)アルゴリズム
4. ある確率で次の3つの動作のどれかを行い、その結果を次世代に保存する。
1. 個体を二つ選択選択(選択方法は後述)して交叉(後述)を行う。
現世代:N個
[7,5,2,3,1,6,1,6,7,1,0,3]
[7,2,2,2,3,3,2,3,5,2,0,8]
[5,8,0,2,8,8,8,2,1,6,6,8]
[0,4,0,3,8,8,4,4,8,5,6,1]
cost:6270
cost:4905
cost:6396
cost:6375
18
遺伝(的)アルゴリズム
4. ある確率で次の3つの動作のどれかを行い、その結果を次世代に保存する。
1. 個体を二つ選択選択(選択方法は後述)して交叉(後述)を行う。選択方法
• ルーレット選択• p_i = f_i / Σf の確率で選択する方法
• ランキング選択• 順位毎に選択確率を定めていく方法
• トーナメント選択• 個体群からのランダムサンプリングして、その中での適応度が高いものを選択する方法
• エリート主義• 適応度が高いものを一定数、次世代に残す方法
集合知プログラミングでは、簡易のためなのかエリート主義を用いられている。
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]
一点交叉の場合
他には、• ニ点交叉• 多点交叉• 一様交叉がある。
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]
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]
24
遺伝(的)アルゴリズム
7. 3. 以降の動作を最大世代数 G 回まで繰り返し、最終的に「現世代」の中で最も適応度の高い個体を「解」として出力する。
第一世代:N個
第ニ世代:N個
第三世代:N個 第G世代:N個
最適解の個体
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 $136cost is 2624