SlideShare a Scribd company logo
Google Developer Day 2011DevQuiz : SlidePuzzleTakeshi.Yaeda
概要
課題幅が 3 マスから 6 マスで、高さが 3 マスから 6 マスのボードが与えられます。各マスは、パネルが置かれているか、壁があるか、空白であるかのいずれかです。パズルは5000問あります5000問通じて使える L, R, U, D の総数には上限があります
総LRUD数72187 81749 72303 8177850005,6,12=E4D9HIF8=GN576LOABMTPKQSR0J6,5,238=I67E9MBC1AF05HJKRLNGPDQSTO4,6,94827601A3BCD5JGMEFNHLKI6,5,82935=174ABCD=RHTNJKFLI0PQSOGM5,5,13O7D69E0ABC524LGJIFMN8HK6,5,2395OI1AHB4C07KT6SJR8F=M=QEDGL3,3,168452=305,5,1245A9I7JN03HDO6GCKF8BLEM6,4,7154N=D23GMIJ=8L09KFAHBC5,6,B61D5H=42C0398A=IPRJESKMNLQOTF5,6,C35AF184=D=627JGN0SEQLI=HMRTPK5,5,7143506F9NC28JABIMDKGLOEH6,3,1E3BC620F5A987D=H45,5,806E91245K=3=AJ=7HIF=CMNO3,6,17=42=580HFEABD9GC4,5,5G3486F7092C1ADJEHBI6,6,1A3B458J26EZKF09LUD7GCIOP==MNTVWXYSH<つづく>問題数
空白(0)の動きを        で出力UpDownLeftRightULDRUULDDRUULDDRこれ(空白)を動かす壁は動けない・最終的に0は右下・壁を動かしたらダメ・マスの外にでたらダメ・UDとかLRとか無駄な動きがあってもダメ・解けない問題は無い(無かった)
解いてみる
0. 全然分からんとりあえずiPhoneで15パズルのアプリ落として遊ぶ人間みたいに左上から合わせていくか解けないのも出てきそうだけどあれ?特定のコマを特定の場所に持っていくのってどうやるの??
0. 全然分からん壁を避けながら,一筆書きの経路を探せれば,任意の場所から任意の場所に移せそうA -> Bは赤い経路をぐるっと回すコードに落としこむのがめんどくさくて断念
1. だめだ,全探索しようLUUULLDLDLUR
1. だめだ,全探索しようL解がある限り,最短経路が探索可能これを幅優先探索というらしいUUULLDLD戻らない,同じ盤面を生成しないなどの工夫をしないと探索数が爆発するLUR
1. 工夫しても爆発する5000問解くのに数年かかる計算になる参考までに,右に単純な実装でCore i7上で計測した処理時間(Python)・ノード数が爆発する.・ノードが増えるほどリストの走査に時間がかかってさらに遅くなる実装である程度改善しそうだけど,,,【9! / 2の解説】9!は3x3のマス目に0~8の数を入れるときの組み合わせSlide Puzzleでは絶対に生成されない配置があるので2で割る
2. ゴールからも探索しよう
2. ゴールからも探索しようどこかでぶつかるので,それを辿ればいい.これを双方向探索というらしい最短は保証されないが,探索空間はかなり狭くなる.3方向 N stepだと 3^N が 2 * 3^(N/2) に改善
2. サイズ毎にチューニング3x3, 3x4		幅優先(最適解)その他双方向 + 枝切り + 時間制限3^8 ~ 3^10 ほどノードを探索したら,ゴールから遠い盤面をqueueから削除時間とメモリを使って,なるべく最適解に近いものを算出4スレッドを24時間回して4000問くらいCPU : Corei78coreMEM : 8GBずばり力技
3. 分割して解く残り約1000問問題点まだまだ探索空間が広いゴールまでの距離の計算が賢くないので解への枝を切ってしまっている.問題を分割して解くことにする人間っぽく解く
3. 分割して解くここまできて,やっと人間っぽく解けるように関心の無いものは *,固定したいものは = に変換して今まで通りに解くpatternanswerULDRUULDDRUULDDRpatternanswerLURULDDR関心の無いパネルを同一文字(*)に置くことで探索空間が劇的に減ることに気づいた
3. 分割して解く解けた!ダメ~残った1000問に対して,一行ずつ解く次の行へ一行目だけ解く一行目を固定して残りを解く一行目を固定せず全体を解く答え答え次の行へ二行分だけ解く二行を固定して残りを解く二行を固定せず全体を解く答え答え
3. 分割して解く一行ずつ解く一列ずつ解くこれで4996問まで
4. 超分割して解く1タイルずつ解く右方向に解く(これで2問)下方向に解く(これで2問)5000問達成
おまけGDD2011 DevQuizのスライドパズル晒し祭りをまとめてみた - Fire and Motion http://d.hatena.ne.jp/harapon1012/20110912/1315805381GDD2011 Japan DevQuizスライドパズル採点サービス https://gdd2011slidepuzzle.appspot.com/

More Related Content

幅優先探索すら知らない素人がDevQuizで満点を取るまでの話