SlideShare a Scribd company logo
1 of 36
ぷよぷよ AI の新しい探索方法
@takapt0226
自己紹介
● Twitter: @takapt0226
– たかぷとと読むらしい
● ぷよぷよ
– ぷよぷよフィーバーWinで1万試合ぐらい?
– 最近はpuyovsをたまに
● レート900台
● 競技プログラミング
– TopCoder (Algo: yellow, Marathon: red)
– CODE VS4.0 (予選4位, 本戦4位)
– HAL研プロコン(2012学生6位, 2013学生1位, 2014学生5位)
puyoai の制約
● AI には 2 手しか見えない ( 操作ツモとネクス
ト )
● 思考に使える時間は 300ms
既存の探索方法
● 見えてる 2 手の置き方を全探索
– 1 手の置き方は 22 パターン
一番いい評価値
この操作をする
既存の探索方法
● 評価関数をとにかく超頑張るしかない
– 定形パターンマッチング
● GTR なら評価値をプラスするなど
アイデア
● ツモが完全に見えている場合は評価関数をたい
して頑張らなくても大連鎖を探索できそう
● 最大 50 手ぐらいまでを探索したい
● 実際は 2 手しか見えないのでランダムに生成し
たツモを足す
– 30 手先探索したい場合、見えてる 2 手 + ランダム
な 28 手
ツモが完全に見えている場合
● 全探索で n 手探索する場合、計算量は O(22n
)
– 高速化を頑張っても 5 手ぐらいまでしか全探索はで
きない
● どうやって 50 手の探索をするか?
– ビームサーチしよう!
● BFS + 枝刈り
BFS
● BFS( 幅優先探索 )
– 深さが小さい順で探索する
BFS
初期状態
BFS
BFS
BFS
BFS の実装例
void bfs()
{
vector<State> states[MAX_DEPTH + 1];
states[0].push_back(initial_state); // 初期状態
for (int depth = 0; depth < MAX_DEPTH; ++depth)
{
// 深さ depth の状態を列挙
for (State state : states[depth])
{
// 各状態から次の状態を生成
for (State next_state : generate_next_states(state))
states[depth + 1].push_back(next_state);
}
}
}
ビームサーチ
● BFS + 枝刈り
– 探索の各深さで評価値が良い上位 k 個の状態の探索
を継続
● k のことをビーム幅と呼ぶ
ビームサーチ ( ビーム幅 4)
0 n n は評価値
ビームサーチ ( ビーム幅 4)
0
4 2 1
評価値が良い順に sort
ここでは大きいほど良いとする
ビームサーチ ( ビーム幅 4)
0
4 2 1
7 6 4 3 2 2 1
ビームサーチ ( ビーム幅 4)
0
4 2 1
7 6 4 3 2 2 1
11 10 9 8 7 5 5
上位 4 つの状態は探索を継続
ビームサーチ ( ビーム幅 4)
0
4 2 1
7 6 4 3 2 2 1
11 10 9 8 7 5 5
上位 4 つの状態は探索を継続
ビームサーチの実装例
void beam_search()
{
vector<State> states[MAX_DEPTH + 1];
states[0].push_back(initial_state); // 初期状態
for (int depth = 0; depth < MAX_DEPTH; ++depth)
{
const int BEAM_WIDTH = 810;
// 評価値が良い順で sort
sort(states[depth].begin(), states[depth].end(), GoodEvalOrder);
// 上位 BEAM_WIDTH に入らないものを削除
if (states[depth].size() > BEAM_WIDTH)
states[depth].erase(states[depth].begin() + BEAM_WIDTH, states[depth].end());
// 深さ depth の状態を列挙
for (State state : states[depth])
{
// 各状態から次の状態を生成
for (State next_state : generate_next_states(state))
states[depth + 1].push_back(next_state);
}
}
}
BFS に枝刈りを追加
ぷよぷよ AI の評価関数
● フィールドを評価する
● 評価項目
– 連鎖数 ( 重要 )
– より良くするために takapt(AI) の現状で評価に入れ
ているもの
● フィールドの形 (U 字になっていると良い )
● 発火点の高さ
● test さんの資料を見て、どうぞ
– http://www.geocities.co.jp/lockitjapan/puyoai/
連鎖数の評価
● フィールドの各列にある 1 色を 1,2 個落として
連鎖をシミュレーション
– 1 列目に赤 1 つ : 1 連鎖
– 2 列目に赤 1 つ : 1 連鎖
– 5 列目に黄 2 つ : 3 連鎖
● このフィールドは 3 連鎖と評価
ビームサーチをぷよぷよに適用
● 操作ツモごとにビームサーチする
● 探索中に発火した連鎖の中で最大の連鎖数の状
態を探し、その状態に遷移する 1 手目の操作を
実際にする
● takapt(AI) の現状ではビーム幅は 400
ビームサーチをぷよぷよに適用
1
15
16
14
〜〜〜〜〜〜〜〜〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜〜〜
depth
0
1
2
18
20
n は n 連鎖を発火
最大の連鎖数
このツモ操作をする
本線連鎖数の実験結果について
● 100 回独立したとこぷよ ( 対戦相手がいない )
を行い、本線連鎖数の頻度をカウント
● 50 手までに本線が発火出来なかった場合は -1
としている
● 横軸は本線連鎖数、縦軸は頻度
ツモが完全に見えている場合の結果
評価関数 : 連鎖数のみと takapt(AI) の現状 ( 連鎖
数 ,U 字 , 発火点の高さ )
-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
0
10
20
30
40
50
60
連鎖数のみ
takapt(AI)
ツモが見えていない場合
● 見えている 2 つのツモ + ランダムに生成したツモを
使ってビームサーチ
● 何手先まで探索するか?
– takapt(AI) の現状ではフィールドが埋まるツモ数 + α を基
準にしている
● (6 * 13 - フィールド上のぷよ数 ) / 2 + 4 手先まで探索している
見えてるツモ ランダムに生成したツモ
見えてるツモ 2 つ + ランダムツモを用いた場合の結果
-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0
5
10
15
20
25
ランダムなツモによる問題
● ランダムなツモで探索を行うと、たまたま神ツ
モで大連鎖が出来た場合やクソツモで発火でき
ず死亡する場合などがある
● モンテカルロしよう!
モンテカルロ法
● ランダムさを用いてシミュレーションを行う
– 最近は囲碁でモンテカルロ法を使う方法が流行って
るらしい
● ランダムさ : 終局までプレイヤーが打つ手をランダムに
選択する
● まとめる : 何度もランダムなシミュレーションを行い、
最も勝率が高かった手を実際に打つ
モンテカルロ法をぷよぷよに適用
● 異なる複数のランダムなツモを生成し、それぞれのツモご
とにビームサーチする
– takapt(AI) の現状では 5 回ビームサーチをしている
● それぞれのビームサーチの結果を考慮して、実際に操作す
る手を選択
実際に操作する手の選択
● 22 パターンのそれぞれの操作に番号を付ける
– 例 : 回転せずに 1 列目に置く操作を番号 0 に対応
● この探索結果が得られたときにどうする?
各ビームサーチの探索結果
操作番号
(0~21)
最大連鎖数
1 14
1 13
4 16
5 14
1 14
実際に操作する手の選択 (NG)
● 平均値 (or 中央値 ) を使い、最大のものを選択
– 操作 1: (14 + 13 + 14) / 3 = 13.66
– 操作 4: 16
– 操作 5: 14
● 操作 4 を選択
– 神ツモでは ???
各ビームサーチの探索結果
操作番号
(0~21)
最大連鎖数
1 14
1 13
4 16
5 14
1 14
実際に操作する手の選択 (takapt(AI) の現状 )
● 異なるツモに対して、同じ操作が最大連鎖に繋
がっているからには何かしら良さがあるはず
● 和が最大のものを選択
– 操作 1: 14 + 13 + 14 = 41
– 操作 4: 16
– 操作 5: 14
● 操作 1 を選択
各ビームサーチの探索結果
操作番号
(0~21)
最大連鎖数
1 14
1 13
4 16
5 14
1 14
1, 5, 50 回ビームサーチをした場合の結果
-1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
0
5
10
15
20
25
30
35
40
1
5
50
今後の課題
● いつ、どこを発火するか?
– 現状ではとにかく連鎖数を最大化することしか考えてい
ない
● 降ってくるおじゃまは考慮している
– 潰し、対応、催促などの判断
● ルールベースなアルゴリズムではなく、勝率を最大化しようと
した結果、潰し、対応、催促を自然にするようなアルゴリズム
にしたいと妄想中
● 評価関数を良くする
– mayah(AI), niina の評価関数を参考にしたり

More Related Content

What's hot

機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)Kota Matsui
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
強化学習その1
強化学習その1強化学習その1
強化学習その1nishio
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画までShunji Umetani
 
大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端Takuya Akiba
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験克海 納谷
 
研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイするTakayuki Itoh
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~Takuya Akiba
 
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)Shota Imai
 
Hyperoptとその周辺について
Hyperoptとその周辺についてHyperoptとその周辺について
Hyperoptとその周辺についてKeisuke Hosaka
 
多腕バンディット問題: 定式化と応用 (第13回ステアラボ人工知能セミナー)
多腕バンディット問題: 定式化と応用 (第13回ステアラボ人工知能セミナー)多腕バンディット問題: 定式化と応用 (第13回ステアラボ人工知能セミナー)
多腕バンディット問題: 定式化と応用 (第13回ステアラボ人工知能セミナー)STAIR Lab, Chiba Institute of Technology
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズムTakuya Akiba
 
[DL輪読会]Control as Inferenceと発展
[DL輪読会]Control as Inferenceと発展[DL輪読会]Control as Inferenceと発展
[DL輪読会]Control as Inferenceと発展Deep Learning JP
 
Pydata_リクルートにおけるbanditアルゴリズム_実装前までのプロセス
Pydata_リクルートにおけるbanditアルゴリズム_実装前までのプロセスPydata_リクルートにおけるbanditアルゴリズム_実装前までのプロセス
Pydata_リクルートにおけるbanditアルゴリズム_実装前までのプロセスShoichi Taguchi
 

What's hot (20)

機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)機械学習による統計的実験計画(ベイズ最適化を中心に)
機械学習による統計的実験計画(ベイズ最適化を中心に)
 
動的計画法を極める!
動的計画法を極める!動的計画法を極める!
動的計画法を極める!
 
最大流 (max flow)
最大流 (max flow)最大流 (max flow)
最大流 (max flow)
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
強化学習その1
強化学習その1強化学習その1
強化学習その1
 
文字列アルゴリズム
文字列アルゴリズム文字列アルゴリズム
文字列アルゴリズム
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで組合せ最適化入門:線形計画から整数計画まで
組合せ最適化入門:線形計画から整数計画まで
 
大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験強化学習アルゴリズムPPOの解説と実験
強化学習アルゴリズムPPOの解説と実験
 
研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイする
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
 
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
強化学習の基礎と深層強化学習(東京大学 松尾研究室 深層強化学習サマースクール講義資料)
 
Hyperoptとその周辺について
Hyperoptとその周辺についてHyperoptとその周辺について
Hyperoptとその周辺について
 
多腕バンディット問題: 定式化と応用 (第13回ステアラボ人工知能セミナー)
多腕バンディット問題: 定式化と応用 (第13回ステアラボ人工知能セミナー)多腕バンディット問題: 定式化と応用 (第13回ステアラボ人工知能セミナー)
多腕バンディット問題: 定式化と応用 (第13回ステアラボ人工知能セミナー)
 
平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム平面グラフと交通ネットワークのアルゴリズム
平面グラフと交通ネットワークのアルゴリズム
 
[DL輪読会]Control as Inferenceと発展
[DL輪読会]Control as Inferenceと発展[DL輪読会]Control as Inferenceと発展
[DL輪読会]Control as Inferenceと発展
 
Pydata_リクルートにおけるbanditアルゴリズム_実装前までのプロセス
Pydata_リクルートにおけるbanditアルゴリズム_実装前までのプロセスPydata_リクルートにおけるbanditアルゴリズム_実装前までのプロセス
Pydata_リクルートにおけるbanditアルゴリズム_実装前までのプロセス
 

ぷよぷよAIの新しい探索法