390 likes | 731 Views
五目並べの実装. B4 グェン トアン ドゥク. 内容. 1. 目的 2. 五目並べのルール 3. Threat と Threat sequence 4. 戦略 5. 探索アルゴリズム 6. 評価関数 - Threat space search(Threat 空間検索) 7. 結果. 1. 目標. 今回の目標. 五目並べプレイヤーを作る 評価関数と alpha-beta 法を使う 特に五目並べのための探索技術である threat space search(threat 空間探索)を実装する
E N D
五目並べの実装 B4 グェン トアン ドゥク
内容 1. 目的 2. 五目並べのルール 3. ThreatとThreat sequence 4. 戦略 5. 探索アルゴリズム 6. 評価関数 - Threat space search(Threat空間検索) 7. 結果
今回の目標 • 五目並べプレイヤーを作る • 評価関数とalpha-beta法を使う • 特に五目並べのための探索技術であるthreat space search(threat空間探索)を実装する • 先に打つなら勝つ、そうでなければ、よく守れるプレイヤーを目指す
五目並べのルール • 15x15ボード上でBLACKとWHITEが升目に自分の色のマークを置く • BLACKは先に行く • 先に5つ連続な目を作れたら勝つ • ボードがいっぱいになっても勝つ人がいなければ、引き分ける
連珠のルール • 五目並べと似ているが、ボードのサイズは19x19 • 先に打つ方(BLACK)にはたくさん制限がある(Overlineしてはならないなど) • ボードのサイズが大きければ大きいほど先に打つ手(BLACK)は利益があるからである。
今回実装している五目 • ルールは五目並べのルールと同じ • しかし、ボードのサイズが19x19
Threat • Threat: -相手がすぐ対応しなければならない列 -例: BLACKのマークが3つ連続した列 (WHITEが対応しないと2手後負ける)
Threat の種類 • Threatはそれぞれに名前がついている • 3つ連続した目: three • 3つ連続しない目: break three • 4つ連続した目: four • 5つ連続した目: five
Threat sequence • Threatを連続的に生成する -第一のthreatに相手が対応しなければならないので、引き続いて自分がその次の手でthreatを生成する -相手はどう対応するかにはまず考えない。自分が勝手に打てると仮定する。
Winning Threat sequence • 勝つまで連続したthreat sequence • 例: G H I J K L M 13 12 11 10 9 8 Xのsequence: J11, J9, J10, M10/J8/J12 O O X X X
Potential Winning Threat Sequence • Winning threat sequenceになる可能なthreat sequenceはPotential Winning threat sequence(PWTS)と呼ぶ • そのsequenceに対応するうちに、相手はWinning threat sequenceを生成する場合があるので、PWTSはいつもWTSになるとは限らない • PWTSには、相手はどう対応するかを考えないからである。
WTSにならないPWTSの例 I12, (I9), H12, (F12), H15 (X: I12, H12, H15) E F G H I 15 14 13 12 11 10 9 O X X O
人間の戦略 1. ボードのある部分を見て、Winning threat sequence(WTS)を探す 2.まず、自分の打った手と次の自分の手だけ見る。相手はどう対応するかはまず考えない 3. もし、WTSが見つけたら、相手がどう対応するかを考える
コンピュータの戦略 • 状態空間探索
状態空間探索 • 手を生成しながら、新しい状態を作る -最後まで(10手先)の状態を全部見えない 調べる状態数が大きい過ぎる - 適当な評価関数で、数手先見る • 同じ状態が違う手の順番であり得る(木ではなく、グラフ)ので、transposition tableを使う • α-β枝刈りで効率を上げる.
Threat空間探索 • 評価値を決めるために、threat空間探索をする。 • それにより、winning threat sequenceが見つかれる。
評価関数の重要性 • 完全にゲームの最後まで先に見えないので、評価関数で手を選択しなければならない。 • 評価関数が良ければ良いほど、強い。 • 評価関数が悪ければ、容易に負ける。
五目並べでの評価関数 • Threat空間探索 • 局面にもとづく評価値 • 評価値は、 - Threat空間探索によって決める - Threat空間探索によって決められない場合は局面の列の形により決める
Threat空間探索 • WTS(winning threat sequence)はthreatsを含んでいる • そこで、全てのthreatsの空間に注目する。Threatspace(threat空間)と呼ぶ • Threat空間での探索をすると、WTSが見つけられる。 • Threatの数はあまり多くないので、調べる状態はあまり多くない。コストが小さい。
Threatの要素の定義 • Gain square: threatの中の攻める人の打つ位置(square) • Cost square: threatの中の守る人の打つ位置 • Rest square: threatを作る可能のある位置(gain squareを除く)
Threatの従属性 • Threat A がthreat Bに従属される(A is dependent on B)とは、Aのあるrest squareがBのgain squareである。 • Threatの従属木(dependency tree): - ノードがthreat - rootノード以外のノードは全て、親ノードにthreat従属される
衝突する従属木 • 従属木PとQが衝突するとは、 Pにあるthreat AとQのあるthreat Bの間で、 - Aのgain squareがBのcost square または、 - Bのgain squareがAのcost square または、 - Aのcost squareがBのcost square である • 例
衝突するThreatの性質 • 2つの衝突するthreatは同時に実現できない。 • つまり、dependency treeには、2つの衝突するthreatは存在しない。 • 探索するときに、これを利用するとノード数を減らすことができる。 • しかし、従属するthreatを見つけるために、コストがかかる。
衝突するThreatの例 • E15とD15が衝突している
Threat空間探索の規則 • Threat Aがthreat Bに独立(従属ではない)であれば、AはBの探索木に現れない。 • Threat空間探索木には、threatをgain squareと方向、種類で表現する。 • その探索木には、攻める人の手だけ現れる(調べるノード数が減る)。PWTSが見つかったら、それがWTSかどうかをチェックする
Threatの発見 • 打つたびにthreatが生成するかどうかを見る • 生成したら、新しいthreatを作り、threat listに保存 • 既に存在するthreatのtypeが打つ手により変わることがあるので。変わったthreatをthreat listに追加 • それ以外(自分の)threatはそのままthreat list に追加 • 相手のthreatはその打った手によって、killされるかどうかをチェック
PWTSの探索 Threat-sequence-list sq = empty; Pwts-search( board, threat, sequence ) { if( wts-found ) return; if( threat.type == FIVE ){sq.add( sequence ); return;} for each Position in threat.gain_squares { do_move(board, Position); sequence.add( Position ); Pwts-search( board, threat.child, sequence ); restore_board(); sequence.remove( Position ); } }
評価関数 Intevaluate(board, man-threat-list, machine-threat-list, turn){ If( turn == machine ){ for each threat in machine-threat-list{ sq = Pwts-search( board, threat ); if( sq is WTS ) { return INFINITY; } } } else { //find WTS for man if( sq is WTS ) return MINUS_INFINITY; } returnevaluate-board-state( board, man-threat-list, machine-threat-list, turn ); }
実験結果 • 五目並べプレイヤーを作った。 • Threat space searchを行ったが、threatを発見するのがあまりよくなくて、全てのthreat-sequenceを見つけなかった。 • 時々、明らかに勝つ手があるのに打ったない(そのthreatが発見できないため)