20
遺遺遺遺遺遺遺遺遺遺遺遺遺遺遺遺 @dekosuke

Ga nonogram

Embed Size (px)

Citation preview

Page 1: Ga nonogram

遺伝的アルゴリズムでピクロスを解く

@dekosuke

Page 2: Ga nonogram

2

ピクロス

Page 3: Ga nonogram

3

ピクロス

縦横に制約がある 黒および白を順次確定

させて解いていく 人間が解くもの・・・です

よね?

Page 4: Ga nonogram

4

ピクロスは NP 完全 – Ueda et al. (96’) →人間離れした難しい問題が作れる

ピクロス

名状しがたい問題のようなもの

Page 5: Ga nonogram

5

コンピュータに解かせよう!!!

というわけで

Page 6: Ga nonogram

6

遺伝的アルゴリズム (GA)

“ 遺伝的アルゴリズムはもっともよく使われている進化的アルゴリズムである” - wikpiedia

Page 7: Ga nonogram

7

より正解に近い解答へ、回答群を進化させる 自然淘汰と突然変異の原理

遺伝的アルゴリズム (GA)

Page 8: Ga nonogram

8

遺伝的アルゴリズムの応用例

戦略ゲーム ガンダムの歩行パズル(ピクロス)←今回

Page 9: Ga nonogram

9

各マスの ( 黒 , 白 ) の状態を (1, 0) にして、遺伝子にコーディング

遺伝子コーディング

Page 10: Ga nonogram

10

“Escape from the ivory tower” – Simon Peyton Jones

Haskell は象牙の塔(研究の世界)からやってきた言語

実装 - Haskell

Page 11: Ga nonogram

11

名状しがたい純粋関数型言語のようなもの

可及的速やかに実装できる強力かつバグを出さない

Haskell の特徴

Page 12: Ga nonogram

12

道具は揃った、あとはコードを書くだけというわけで、結果は・・・・

結果

Page 13: Ga nonogram

13

結果

ハウス (5*5)

ニコニコ (10*10)

テレビちゃん (14*14)

名状し難い問題

Page 14: Ga nonogram

14

ちゃんと問題が解けた!! 問題サイズが大きくなると、計算が終わらない

(局所解(正しくない解)から抜け出せない)

結果

Page 15: Ga nonogram

15

御清聴ありがとうございました

おわり

成果物 https://gist.github.com/2516358

Page 16: Ga nonogram

End

次頁から解説編

Page 17: Ga nonogram

17

アイディアは大体、最初の参考文献(最終頁参照)から来ています。NP 完全について説明します。 NP 完全問題は、問題の大きさ(パズルサイズ)が大きくなると、その問題を確実に解くアルゴリズムが、ものすごい勢いで計算量が増えていく(普通の時間で解けなくなる)問題です (NP の壁 )遺伝的アルゴリズム (GA) は確率的アルゴリズムなので、必ず問題を解けることを保証しないかわりに、多くの問題に対して十分早い時間で解けることが期待できます。ほかにも、モンテカルロと呼ばれる一連の確率的手法もこの NP の壁に挑むことのできる手法です。実際、レプリカ交換法(モンテカルロの一種)とどっちをやろうか悩みました。

※GA でも無限の時間をかければ必ず解に到達します

解説

Page 18: Ga nonogram

18

そういう動機を持ち、遺伝的アルゴリズムで今回の問題にトライしました。

遺伝的アルゴリズムを実装してやってみると、 14*14 のサイズでは、数時間内に正解にたどり着けなくなってしまいました遺伝的アルゴリズムでは突然変異の方法と確率をいじる余地がまだあるので、最適な調整をすればもう少し大きいサイズの問題まで解けるかもしれませんほかのアルゴリズムでは 20*20以上のものが解けるものもあるので、遺伝的アルゴリズムがどうだったかは微妙なところがあります・・・

解説

Page 19: Ga nonogram

19

Haskell を実装に選んだ理由は、主に2点あります。1つは、十分早く実装ができること、そして2つめはバグが出る率が非常に低いことです。 Python や Ruby などの LL 言語も早く実装するのには向いていますが、アルゴリズムの一部にバグが出ても、気づきにくいことがあります。Haskell は強い静的型付けを持つ言語ですので、多くのバグをコンパイル時に検出することができます

解説

Page 20: Ga nonogram

20

“A comparison of a genetic algorithm and a depth first search algorithm applied to Japanese nonograms” http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.62.9443

“Hoogle” http://www.haskell.org/hoogle/

参考文献