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

More Related Content

What's hot

ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けモノビット エンジン
 
Sliced Wasserstein距離と生成モデル
Sliced Wasserstein距離と生成モデルSliced Wasserstein距離と生成モデル
Sliced Wasserstein距離と生成モデルohken
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないことNorishige Fukushima
 
TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門tak9029
 
[DL輪読会]Wasserstein GAN/Towards Principled Methods for Training Generative Adv...
[DL輪読会]Wasserstein GAN/Towards Principled Methods for Training Generative Adv...[DL輪読会]Wasserstein GAN/Towards Principled Methods for Training Generative Adv...
[DL輪読会]Wasserstein GAN/Towards Principled Methods for Training Generative Adv...Deep Learning JP
 
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 Ken'ichi Matsui
 
劣モジュラ最適化と機械学習1章
劣モジュラ最適化と機械学習1章劣モジュラ最適化と機械学習1章
劣モジュラ最適化と機械学習1章Hakky St
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編Fixstars Corporation
 
機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)Satoshi Hara
 
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)Yutaka KATAYAMA
 
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習Hori Tasuku
 
Kaggleのテクニック
KaggleのテクニックKaggleのテクニック
KaggleのテクニックYasunori Ozaki
 
言語と画像の表現学習
言語と画像の表現学習言語と画像の表現学習
言語と画像の表現学習Yuki Noguchi
 
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~SSII
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選Takuya Ueda
 
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまでtechgamecollege
 
RustによるGPUプログラミング環境
RustによるGPUプログラミング環境RustによるGPUプログラミング環境
RustによるGPUプログラミング環境KiyotomoHiroyasu
 
実社会・実環境におけるロボットの機械学習 ver. 2
実社会・実環境におけるロボットの機械学習 ver. 2実社会・実環境におけるロボットの機械学習 ver. 2
実社会・実環境におけるロボットの機械学習 ver. 2Kuniyuki Takahashi
 

What's hot (20)

ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
Sliced Wasserstein距離と生成モデル
Sliced Wasserstein距離と生成モデルSliced Wasserstein距離と生成モデル
Sliced Wasserstein距離と生成モデル
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門TensorFlowをもう少し詳しく入門
TensorFlowをもう少し詳しく入門
 
[DL輪読会]Wasserstein GAN/Towards Principled Methods for Training Generative Adv...
[DL輪読会]Wasserstein GAN/Towards Principled Methods for Training Generative Adv...[DL輪読会]Wasserstein GAN/Towards Principled Methods for Training Generative Adv...
[DL輪読会]Wasserstein GAN/Towards Principled Methods for Training Generative Adv...
 
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
 
劣モジュラ最適化と機械学習1章
劣モジュラ最適化と機械学習1章劣モジュラ最適化と機械学習1章
劣モジュラ最適化と機械学習1章
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
CPU / GPU高速化セミナー!性能モデルの理論と実践:実践編
 
機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)
 
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)
人工知能技術を用いた各医学画像処理の基礎 (2022/09/09)
 
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
カスタムSIで使ってみよう ~ OpenAI Gym を使った強化学習
 
Kaggleのテクニック
KaggleのテクニックKaggleのテクニック
Kaggleのテクニック
 
言語と画像の表現学習
言語と画像の表現学習言語と画像の表現学習
言語と画像の表現学習
 
画像処理の高性能計算
画像処理の高性能計算画像処理の高性能計算
画像処理の高性能計算
 
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
SSII2021 [TS1] Visual SLAM ~カメラ幾何の基礎から最近の技術動向まで~
 
実機で動かす深層強化学習(画像なし)
実機で動かす深層強化学習(画像なし)実機で動かす深層強化学習(画像なし)
実機で動かす深層強化学習(画像なし)
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
【TECH×GAME COLLEGE#32】ゼロからリアルタイムサーバーを作るまで
 
RustによるGPUプログラミング環境
RustによるGPUプログラミング環境RustによるGPUプログラミング環境
RustによるGPUプログラミング環境
 
実社会・実環境におけるロボットの機械学習 ver. 2
実社会・実環境におけるロボットの機械学習 ver. 2実社会・実環境におけるロボットの機械学習 ver. 2
実社会・実環境におけるロボットの機械学習 ver. 2
 

Viewers also liked

本当にあった怖い話 ~大学生はプログラミングをしてはいけない~
本当にあった怖い話 ~大学生はプログラミングをしてはいけない~本当にあった怖い話 ~大学生はプログラミングをしてはいけない~
本当にあった怖い話 ~大学生はプログラミングをしてはいけない~happo31
 
アルゴリズムのイメージを擬人化する
アルゴリズムのイメージを擬人化するアルゴリズムのイメージを擬人化する
アルゴリズムのイメージを擬人化するAtCoder Inc.
 
C#でこなすexcel課題
C#でこなすexcel課題C#でこなすexcel課題
C#でこなすexcel課題tosaka 2
 
ぷよぷよAIの新しい探索法
ぷよぷよAIの新しい探索法ぷよぷよAIの新しい探索法
ぷよぷよAIの新しい探索法Takaya Doki
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
競技プログラミング入門
競技プログラミング入門競技プログラミング入門
競技プログラミング入門Naohiro Kurihara
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoder Inc.
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
とあるアプリの設計進化
とあるアプリの設計進化とあるアプリの設計進化
とあるアプリの設計進化yone64
 
超Linq入門 実践編
超Linq入門 実践編超Linq入門 実践編
超Linq入門 実践編yone64
 
超LINQ入門
超LINQ入門超LINQ入門
超LINQ入門yone64
 
ぷよぷよ AI: mayah(AI) の実装
ぷよぷよ AI: mayah(AI) の実装ぷよぷよ AI: mayah(AI) の実装
ぷよぷよ AI: mayah(AI) の実装mayahjp
 
いろいろな問題の解説
いろいろな問題の解説いろいろな問題の解説
いろいろな問題の解説Masaki Hara
 
ご静聴ありがとうございました
ご静聴ありがとうございましたご静聴ありがとうございました
ご静聴ありがとうございましたMasaki Hara
 
opencocon を使って RaspberryPi で艦これ
opencocon を使って RaspberryPi で艦これopencocon を使って RaspberryPi で艦これ
opencocon を使って RaspberryPi で艦これKenichiro MATOHARA
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説AtCoder Inc.
 

Viewers also liked (20)

本当にあった怖い話 ~大学生はプログラミングをしてはいけない~
本当にあった怖い話 ~大学生はプログラミングをしてはいけない~本当にあった怖い話 ~大学生はプログラミングをしてはいけない~
本当にあった怖い話 ~大学生はプログラミングをしてはいけない~
 
アルゴリズムのイメージを擬人化する
アルゴリズムのイメージを擬人化するアルゴリズムのイメージを擬人化する
アルゴリズムのイメージを擬人化する
 
C#でこなすexcel課題
C#でこなすexcel課題C#でこなすexcel課題
C#でこなすexcel課題
 
ぷよぷよAIの新しい探索法
ぷよぷよAIの新しい探索法ぷよぷよAIの新しい探索法
ぷよぷよAIの新しい探索法
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
競技プログラミング入門
競技プログラミング入門競技プログラミング入門
競技プログラミング入門
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
AtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組みAtCoderに毎回参加したくなる仕組み
AtCoderに毎回参加したくなる仕組み
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
とあるアプリの設計進化
とあるアプリの設計進化とあるアプリの設計進化
とあるアプリの設計進化
 
超Linq入門 実践編
超Linq入門 実践編超Linq入門 実践編
超Linq入門 実践編
 
超LINQ入門
超LINQ入門超LINQ入門
超LINQ入門
 
ぷよぷよ AI: mayah(AI) の実装
ぷよぷよ AI: mayah(AI) の実装ぷよぷよ AI: mayah(AI) の実装
ぷよぷよ AI: mayah(AI) の実装
 
いろいろな問題の解説
いろいろな問題の解説いろいろな問題の解説
いろいろな問題の解説
 
ご静聴ありがとうございました
ご静聴ありがとうございましたご静聴ありがとうございました
ご静聴ありがとうございました
 
Coqでsprintf
CoqでsprintfCoqでsprintf
Coqでsprintf
 
opencocon を使って RaspberryPi で艦これ
opencocon を使って RaspberryPi で艦これopencocon を使って RaspberryPi で艦これ
opencocon を使って RaspberryPi で艦これ
 
MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説MUJINプログラミングチャレンジ2016 解説
MUJINプログラミングチャレンジ2016 解説
 
Coqの公理
Coqの公理Coqの公理
Coqの公理
 
Chokudai search
Chokudai searchChokudai search
Chokudai search
 

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