Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ランク6の俺がパズドラについて語る

comb meet up!でLTしたスライド

  • Login to see the comments

ランク6の俺がパズドラについて語る

  1. 1. ランク6の俺がパズドラ について語る
  2. 2. お詫びと訂正  ランク7になりました
  3. 3. ランク6の俺がパズドラ について語る
  4. 4. ランク7の俺がパズドラ について語る
  5. 5. 自己紹介  これが私  齋藤主裕(さいとうかずひろ)  高校2年!  渋谷教区学園渋谷渋谷中学高等学校  コンピューター部部長 (3年目)  Tiwtter: @tnkt37  主催者の手伝いの手伝いくらい  本当はXamarinの話したかった  セキュキャンでるよ!  SuperCon出るよ
  6. 6. パズドラとは  パズル アンド ドラゴンズ  巷で流行ってるゲーム  今は以前ほどじゃないイメージけど、周り見渡すとやってる人結構居る  どういうゲームなんですか?  ガチャ  モンスター育成  パズル(ダンジョン攻略)  とはいえ・・・  ランク7の初心者なのであまり知りません
  7. 7. ランク7ではパズドラに ついて語れなかった しってた
  8. 8. パズドラのルート解析 アルゴリズム タイトルは釣り!
  9. 9. 概要  渋谷教育学園には自調自考論文とかいう卒業論文みたいなものがある  まともに遊んだこともないくせにテーマが決まらなかったので仕方なく パズドラのルート解析アルゴリズムついての研究を行った  今回はその論文の順序通りに説明を行う  スライドには色々書いてあるけど口頭ではほとんど触れません  時間無い!  どこかにアップロードするので後で読んで
  10. 10. パズドラの「パズル」  盤面に 5 × 6 ドロップが並んでいる  ドロップには6種類(属性)がある
  11. 11. パズドラの「パズル」  盤面に 5 × 6 ドロップが並んでいる  ドロップには6種類(属性)がある  一つのドロップを選んで8方向に動かせる
  12. 12. パズドラの「パズル」  盤面に 5 × 6 ドロップが並んでいる  ドロップには6種類(属性)がある  一つのドロップを選んで8方向に動かせる  ドロップを移動させると移動前のドロップと入れ替わる
  13. 13. パズドラの「パズル」  盤面に 5 × 6 ドロップが並んでいる  ドロップには6種類(属性)がある  一つのドロップを選んで8方向に動かせる  ドロップを移動させると移動前のドロップと入れ替わる  選んだドロップは連続で動かせる
  14. 14. パズドラの「パズル」  盤面に 5 × 6 ドロップが並んでいる  ドロップには6種類(属性)がある  一つのドロップを選んで8方向に動かせる  ドロップを移動させると移動前のドロップと入れ替わる  選んだドロップは連続で動かせる  縦または横連続に3つ以上揃えるとコンボになる  ↓コンボにならない例↓
  15. 15. パズドラの「パズル」  盤面に 5 × 6 ドロップが並んでいる  ドロップには6種類(属性)がある  一つのドロップを選んで8方向に動かせる  ドロップを移動させると移動前のドロップと入れ替わる  選んだドロップは連続で動かせる  縦または横連続に3つ以上揃えるとコンボになる  このコンボをたくさん作りたい!
  16. 16. 研究の目的  パズドラの「パズル」でコンボをたくさん 作る事ができるルートを見つけ出すアルゴ リズム(を実装したプログラム)を作る!  実用性を考え、実行時間は1秒程度
  17. 17. 実装言語  基本C++  たまにC#  並列処理  Parallel.For  計測  超乱雑コード ( Let’s Repeat Yourself! )  グラフ出力  OxyPlot  画像生成ツール  古き良きGDI+ (・ω<)
  18. 18. 先行研究の分析  ちゃんとした「研究」は無い  Google PlayやApp Storeに同じことをやっているアプリはある  当然解説なんて無い!ソースも公開してない!  平均8~8.9コンボ(自称)  多分落ちコンを含んだ数値  実行時間は1秒程度  GPGPUでやってる動画はあったけど今回は参考にならない 結論:参考にならない!  1から考えましょう
  19. 19. パズルの実装  解析するにはまずパズルそのものを実装しなければならない  解析アルゴリズムの中で何度も呼び出される部分になるので速度が重要  と言いつつ富豪的に組みました  論文では字数稼ぎのためにドロップを数値で扱うとか盤面が2次元配列とか押 し下げ処理が動的計画法とか色々言ってるけど特筆することはあまりない  コンボ処理だけは少し特殊なので触れるよ
  20. 20. パズルの実装(コンボ処理)  このパターンが1コンボとして判定される  同じ属性でコンボが隣接している状態  これが組みづらかった
  21. 21. パズルの実装(コンボ処理)  Union-Find使った  グループを扱うデータ構造  以下の操作が行える  グループAがグループBに属しているか  グループAとグループBを一つのグループにまとめる  はやい(小並感)  これで2回の走査でコンボ処理が行える  普通にboolの二次元配列と一回の走査で出来そう(後から気付いた)  書きなおすの面倒なので実装してない
  22. 22. ルートを保持するデータ構造  二つのlong long (64bit整数型)に突っ込んでく  8方向の移動を0~7で表せば3bitで表現可能  追加の際は3つシフトして新しいのと論理和  ルート長42 までいける  大きさ(すでに入っているルート長)をメモリを使わずO(1)で取得可能  初期状態を1にしてMSBをとる  追加、削除がO(1)  コピーもO(1)  大事
  23. 23. 解析アルゴリズム(全探索)  ※今までは8方向で出来るように組んでたけどここから上下左右の4方向に制限 します  実際にプレイしてみると斜めに移動させるの結構大変  4方向に移動させるパターンを繰り返すと4^n  行って帰ってくるのは無駄なので3方向に制限しても3^n  さらに全部のドロップの移動を試すと30倍  ルート長40で30×3^40 = 364729963771707864030通り  地球爆発!  全探索で全て解決するほど世の中甘く無い
  24. 24. 解析アルゴリズム(山登り法もどき) 1. 「今の状態」からちょうどLターン分動かした移動を全パターン見る 2. その中から最も評価値の高い移動を選ぶ  今回の評価はコンボ数とリーチ数(落ちコン狙い) 3. その移動の一番最初の移動方向を「今の状態」に追加する 4. 決まった長さになるまで繰り返す  時間かけてそれなりに色々工夫した  5コンボ~7コンボ  微妙・・・
  25. 25. 解析アルゴリズム(ビームサーチ)  メタヒューリスティクスアルゴリズム!  だいたい幅優先探索 1. 今の状態の近傍を探索する  今回は数回移動したルートのパターン 2. 探索した近傍から評価値が高い順にk個取り次の状態にする 3. 決まった長さになるまで繰り返す  最初のコードは電車の中で1時間弱で実装  7コンボ~9コンボ  ぅゎビームサーチっょぃ
  26. 26. 解析アルゴリズム(ビームサーチ)  色々なパラメータで実行して計測し、最適化  並列処理して計測した結果・・・  平均コンボ数 7.8 コンボ  落ちコン含むと 9.2 コンボ!!!  既存ツール超! ※平均実行時間 0.98秒 ※もちろんスペックによるハンデは 大きいが、実行時間は簡単に調整で き、多少実行時間を短くしてもコン ボ数はそれほど低下しないことが先 の計測でわかっている
  27. 27. 結論と得られた経験  パズドラのルート解析アルゴリズムにはビームサーチが有効  途中色々と工夫をしたが  ほとんど無意味または逆効果で  普通に組んだ方が良い結果が得られることが多く  人生の厳しさを知った
  28. 28. ソースコード  もちろんオープンソース!  https://github.com/tnkt37/PuzzDraSolver  評価関数はカスタマイズ出来るようになってるよ!  研究用コードなので(?)LGPLになってます  そのうち更に最適化したやつをMITで上げたいがいつになることやら…
  29. 29. 最後に  よく分からなくて辛くなることもあるが アルゴリズムは楽しい!
  30. 30. ご清聴 ありがとうございました ランク7の俺がパズドラについて語れなかったので パズドラのルート解析アルゴリズムの話をした

×