PowerPoint Presentation

Similar documents
AI 三目並べ

メソッドのまとめ

人工知能入門

PowerPoint Presentation

発展プログラミング (5) 例題 5-03( 応用プログラム 3 目並べ その 2) 勝敗判定機能をそなえた 3 目並べ のゲーム盤を作りましょう 必要な変数を考えましょう 1 マス目の状態を保持する配列 整数型 :mas[] 2 何手目かを数える変数 整数型 :nante 3 ゲームが終了したかど

連載講座 : 高生産並列言語を使いこなす (3) ゲーム木探索問題 田浦健次朗 東京大学大学院情報理工学系研究科, 情報基盤センター 目次 1 概要 17 2 ゲーム木探索 必勝 必敗 引き分け 盤面の評価値 αβ 法 指し手の順序付け (mo

Microsoft PowerPoint - mp11-06.pptx

情報 システム工学概論 コンピュータゲームプレイヤ 鶴岡慶雅 工学部電子情報工学科 情報理工学系研究科電子情報学専攻

しています. これには探索木のすべてのノードを探索する必要がありますが,αβカットなどの枝刈りの処理により探索にかかる計算時間を短縮しています. これに対して, 探索するノードを限定したり, 優先順位をつけて選択的に探索する 選択探索 という探索方式があります. 本チームはノードの選択方式としてノー

次に示す数値の並びを昇順にソートするものとする このソートでは配列の末尾側から操作を行っていく まず 末尾の数値 9 と 8 に着目する 昇順にソートするので この値を交換すると以下の数値の並びになる 次に末尾側から 2 番目と 3 番目の 1

Microsoft PowerPoint - ad11-09.pptx

Java講座

Processingをはじめよう

EBNと疫学


今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

第101回 日本美容外科学会誌/nbgkp‐01(大扉)

27巻3号/FUJSYU03‐107(プログラム)

パーキンソン病治療ガイドライン2002

alg2015-6r3.ppt

tnbp59-20_Web:P1/ky108679509610002943

Microsoft PowerPoint - comprog11.pptx

<4D F736F F D2094F795AA95FB92F68EAE82CC89F082AB95FB E646F63>


Microsoft PowerPoint - ゲーム理論2016.pptx

Microsoft PowerPoint - DA2_2017.pptx

Microsoft PowerPoint - DA2_2018.pptx

Microsoft Word - 11 進化ゲーム

情報システム設計論II ユーザインタフェース(1)

プログラミング入門1

ボルツマンマシンの高速化

Microsoft PowerPoint P演習 第10回 関数.ppt [互換モード]

データ構造

Microsoft Word - VBA基礎(3).docx

戦略的行動と経済取引 (ゲーム理論入門)

Taro-再帰関数Ⅲ(公開版).jtd

Functional Programming

離散数学

C#の基本2 ~プログラムの制御構造~

プレポスト【問題】

cp-7. 配列

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

4-4 while 文 for 文と同様 ある処理を繰り返し実行するためのものだが for 文と違うのは while 文で指定するのは 継続条件のみであるということ for 文で書かれた左のプログラムを while 文で書き換えると右のようになる /* 読込んだ正の整数値までカウントアップ (for

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

切片 ( 定数項 ) ダミー 以下の単回帰モデルを考えよう これは賃金と就業年数の関係を分析している : ( 賃金関数 ) ここで Y i = α + β X i + u i, i =1,, n, u i ~ i.i.d. N(0, σ 2 ) Y i : 賃金の対数値, X i : 就業年数. (

Javaによるアルゴリズムとデータ構造

Microsoft PowerPoint - mp13-07.pptx

Excelによる統計分析検定_知識編_小塚明_5_9章.indd

JavaプログラミングⅠ

Using VectorCAST/C++ with Test Driven Development

dlshogiアピール文章

Transcription:

ゲーム木の探索について ミニマックス法のアルゴリズム アルファベータ法のアルゴリズ 三目並べゲームの例 1

ゲーム TicTacToe Othello Chess Let us find game and play! 三目並べ http://perfecttictactoe.herokuapp.com/ オセロ http://atohi.com/osg/default.aspx 将棋 2

ゲーム木の探索問題 ゲームは AI における 最も古くから力を入れられている分野の 1 つです 限られた時間の中で答えを見つけることはとても難しい ゲーム木は人工知能で重要であり 最良の手はゲーム木を探索することで得られ ミニマックス法などのアルゴリズムを使用する 三目並べのゲーム木は小さいので探索も容易だが チェスなどの完全ゲーム木は大きすぎて全体を探索することができない その場合は代わりに部分ゲーム木を使う. チェスゲームでは 35 通りの置き方があり レイヤーは 50 回移動することができる つまり 探索木には合わせると 35 100 もの葉が存在することになります このような複雑なゲームにはある程度の場所で妥協する必要があります これは情報がないのではなく いかなる動きに対する正確な結果を計算する時間がないからです この点で ゲームは標準的な検索問題よりも現実の世界に似ています まずはじめに三目並べを例に 理論上最高の手を見つける方法を分析することから始めましょう 3

2 人のゲームの探索 ゲーム木は人工知能で重要であり 最良の手はゲーム木を探索することで得られ ミニマックス法などのアルゴリズムを使用する 問題は以下の要素から構成されます : 初期状態 定められた動き 終了状態 評価関数 : +1(+10, +99), -1 (-10, -99), または 0 のように数値 ( 評価値 ) を与えます. コンピュータは相手が取りうる動き ( 手 ) の中で正しい動き ( 手 ) を含む戦略を見つけなければなりません そして 最終状態の勝者を導き出し その流れの最初の一手を選びます 重要 : 評価関数はどの動きが最高の動きであるかを決定するじゅうような構成要素です 4

ミニマックス法 考え方 自分の手では局面が最良になる手を選びたい 相手は ( 自分にとって ) 局面が最悪となる手を選ぶだろう 相手が自分にとってまずい手を打ってきても そのまずさ (Min) があまり悪くない手 (Max) を打とう

ミニマックス法 もう少し詳しく 今 自分が打てる複数の候補手を考えた時 それぞれの手に関して 相手の対抗手 ( これもまた複数 ) を探索する この時 対抗手の評価値を全て計算する その中で最小の評価値 ( 相手にとっては最高の評価値 )hを求める 自分の候補手の中で 最も高い評価値である手を最適なものとする 自分の手では評価値が max, 相手の手では評価値が min となる手を選択

5 つのステップから構成されます : ゲーム木の全体を生成する. 木の末端ノードに評価値を得るために効用関数を適用する. この評価値を探索木の1つ上のレベルのノードの評価値を得るために使う ( どちらの手番かによってどのノードの評価値を選ぶかは変わる ). これを末端から根まで繰り返す. コンピュータは最も評価値の高いものを選ぶ. 3 L1 (return maximum in L2) A 1 A 2 A 3 3 2 2 L2 (return minimum in L3) A 11 A 12 A 13 A 22 A 23 A 21 A 31 A 32 A 33 3 12 8 2 4 6 14 5 2 L3(return 評価値 ) 7

ゲーム木の全体を生成する 完全木例 : 三目並べゲーム木 9 9*8 9*8*7 9*8*7*6 9*8*7*6*5 8

MinMax - Searching tree - Ex: Tic-Tac-Toe (symmetrical positions removed) - 対称性

- Min-Max 探索における評価値の動きの例

演習 1 Fill in the return value at each blank node 11

どのように実装するか 1. 自分が打てる複数の候補手を考えた時 それぞれの手に関して 相手の対抗手を探索する 1. これを深読みレベルまで繰り返す 2. 木の末端まで来た時 評価値を計算する 2. 子ノードから返された評価値比較する 1. AI( 自分 ) のターンなら最大を選択する 2. プレイヤー ( 相手 ) のターンなら最小を選択する 3. 評価値を親ノードへと返す 1. 自分自身が子ノードの場合 選ばれた評価値を親ノードへ返す 2. 根の場合 最適な場所を返す

三目並べの例 評価値 h = h0 h1 h0: 自分の石だけが置かれている縦 横 斜めの列数 h1: 相手の石だけが置かれている縦 横 斜めの列数 -99 比較 -99 比較 0 Select 現在の状態 自分 ( 黒石 ) の手 Max 白勝利評価最悪 -99 m i n h=-1 (1-2) m i n h=-1 (0-1) m i n h=0 (0-0) 比較 白勝利評価最悪 比較 比較 -99 h=1 (1-0) 相手の手 Min

X: Win +99 O: Win -99 O: Win -99 X: Win +99 X: Win +99 http://postd.cc/tic-tac-toe-understanding-the-minimax-algorithm/

1 1.2 コード部分 public int minmax(boolean flag, int level) { String my; // 現在の手 int value; // 評価値 int child; // 子ノードからくる評価値 // うつ場所 int bestposition = -99; // 仮 if (level == 0) { return evaluation(flag); if (flag) { // AI ターンでの初期化 value = -999; my = "O"; else { // プレイヤーターンでの初期化 value = 999; my = "X"; // 評価値を計算する for (int i = 0; i < size * size; i++) { if (buttons[i].getlabel().equals("")) { buttons[i].setlabel(my); if (check(flag)) { buttons[i].setlabel(""); if (!flag) return -1000; else return i; // 次の手に移動 ここで子ノードの評価値が帰ってくる child = minmax(!flag, level - 1); 1.1 flag : AI の手のとき true プレイヤーの手のとき false level : 先読みのレベル 2 3 if (flag) { // AIならノードの中で最大の評価値を選ぶ if (child >= value) { value = child; bestposition = i; else { // プレイヤーならノードの中で最小の評価値を選ぶ if (child <= value) { value = child; bestposition = i; buttons[i].setlabel(""); 2.1 2.2 3.2 3.1 if (level == SEARCH_LEVEL) { // 根 if (bestposition == -99) { // CPの負けが確実 JOptionPane.showMessageDialog(null, " まいりました "); System.exit(0); return bestposition; else { // 子ノード return value; // 評価値を返す

イメージ 1 minmax(true, SEARCH_LEVEL); level 3 自分の手 level 2 相手の手 level 1 自分の手 minmax(true, 3) 打てる部分を全て試す for (int i = 0; i < size * size; i++) { if (buttons[i].getlabel().equals("")) { buttons[i].setlabel(my); 次の手を考える minmax(false, level-1); minmax(false, 2) 打てる部分を全て試す for (int i = 0; i < size * size; i++) { if (buttons[i].getlabel().equals("")) { buttons[i].setlabel(my); 次の手を考える minmax(true, level-1);

イメージ 2 level 3 自分の手 minmax(ture, 1) 打てる部分を全て試す for (int i = 0; i < size * size; i++) { if (buttons[i].getlabel().equals("")) { buttons[i].setlabel(my); level 2 相手の手 次の手を考える minmax(false, level-1); level 1 自分の手 level 0 評価値 4 2 5 3 6 1 2 1 minmax(false, 0) レベルが 0 なので親ノード if (level == 0) { return evaluation(flag); // 評価値を計算する evaluation(false) 評価値を計算して返す

イメージ 3 level 3 自分の手 Max level 2 相手の手 Min level 1 自分の手 Max 4 5 6 2 4 2 5 3 6 1 2 1 4 2 5 3 6 1 2 1 minmax(false, 2) else { if (child <= value) { value = child; bestposition = i; Levelは2なので親ノードに返す return value; minmax(ture, 1) if (flag) { if (child >= value) { value = child; bestposition = i; Levelは1なので親ノードに返す return value;

イメージ 4 Select このノードを選択する level 3 自分の手 Max level 2 相手の手 Min level 1 自分の手 Max 4 4 5 6 2 4 2 5 3 6 1 2 1 4 2 5 3 6 1 2 1 2 minmax(ture, 3) if (flag) { if (child >= value) { value = child; bestposition = i; Levelは3なので親ノードに返す if (level == SEARCH_LEVEL) { return bestposition;

まとめると : コンピュータは最後に一番高い評価値を選ぶ. しかし相手プレイヤーもまた自分にとって良い手を選びます したがって相手プレイヤーはコンピュータの評価値の最小を選びます ( コンピュータにとって評価値が低いということは自分にとって有利であるから ) 20

α-β pruning (Alpha-Beta 法 ) 3 L1 (maximum in L2) A 1 A 2 A 3 α=3 2 L2 (minimum in L3) α=-999 β=3 β=999 初期値 A 11 A 12 A 13 A 22 A 23 2 3 1 α= 12 8 A 21 A 31 A 32 A 33 β =2 A 121 A 122 A 123 5 9 α=12 β=3 α > β 4 6 14 5 2 α=3 β=2 α >= β L3 (maximum in L4) 探索のスピードを早めるためにこの分岐をカットする A 121 の評価値が 12 と決定したとき A 12 の評価値は 12 以上だと確定する (A 121,A 122,A 123 の最大値が A 12 の評価値になる ) よって A 12 の評価値が A 1 に選ばれることはなくなった ( A 1 の評価値は A 11,A 12,A 13 の最小値が選ばれる ) ので A 122,A 123 の評価値を計算する必要がないのでカットする 21

α カット 最大の評価値を取ろうとするときの下限 (α) 以下になる場合は 残りの部分は探索しない O >=5(α 値 ) A の評価値が 5 と確定後 E の評価値が 4 だとわかる この時 B の評価値は 4 以下だとわかる よって B 選ばれないので F は見ない 自分 A (5) B <=4(β 値 ) α カット 相手 C (5) D (7) E (4) F (8) G (3) H (5) I (4) J (7) K (4) L (3) M (3) J (4) G (4) M (3) J (8) G (5)

β カット 最小の評価値を取ろうとするときの上限 (β) 以上になる場合は 残りの部分は探索しない A <=5(β 値 ) O Cの評価値が5と確定した時 Aの評価値は5 以下であることが確定する 次にJを見て 評価値が7となり Dの評価値は7 以上であることが確定 よってDが選択されることはないのでK,Lはカットされる B C (5) D >=7(α 値 ) β カット E (4) F (8) G (3) H (5) I (4) J (7) K (4) L (3) M (3) J (4) G (4) M (3) J (8) G (5)

計算回数 ミニマックス法 12 回 αβ 法 7 回 R B E F D H C A G J I L K J M G J M G R B E F D H C A G J I L K J M G J M G

演習 2 Draw the branches which can be cut 25

擬似コード public int alphabeta(boolean flag, int level, int alpha, int beta) { String my; // 現在の手 int value; // 評価値 int child; // 子ノードからくる評価値 // うつ場所 int bestposition = -99; // 仮 flag : AIの手のときtrue プレイヤーの手のときfalse level : 先読みのレベル alpha : α 値 beta : β 値 演習 3: complete the codes 1 if (flag) { if (childvalue > value) { 1.1を書く if (level == 0) { return evaluation(flag); if (flag) { // AI ターンでの初期化 value = -999; my = "O"; else { // プレイヤーターンでの初期化 value = 999; my = "X"; for (int i = 0; i < size * size; i++) { if (buttons[i].getlabel().equals("")) { buttons[i].setlabel(my); if (check(flag)) { buttons[i].setlabel(""); if (!flag) return -1000; else return i; child = alphabeta(!flag, level - 1, alpha, beta); 2 else { if (childvalue < value) { 1.2 を書く 2.1 を書く 2.2 を書く

まとめ ゲームは 自分にとっては最も有利な手を自分が打ち (max) 次に相手が自分にとって最も不利な手を打ち (min) それらが交互に繰り返されることによって成り立ちます <α-β 法 ( 刈 )> Minimax を改良したもの 枝刈りを行うことで Minimax より評価するノードを抑えている <Minimax algorithm と α-β algorithm の違い > Minimax 法ではすべてを探索し最良の手を選択するのに対して α-β 法は minimax 法で採用されないと判断された手については そこから先を探索しないことで無駄な探索に費やす時間をカットしている また α-β 法による結果は minimax 法での結果と同じになる 枝刈りを行うことにより探索が minimax 法より早く終わるので α-β 法のほうが効率的である 27

オセロゲームの評価方法について http://uguisu.skr.jp/othello/5-1.html この図では隅に重みを上げ 隅の周りのマスの重みを下げていることが分かります この評価値の付け方だと 隅を取ると有利になる ことしか満たしていません 例えば 左の局面を上記の評価値を用いて計算すると 白 :+33 黒 :+13 となります したがって この局面では白が評価値 20 ほど有利だと言えます しかしながらこれは誤りです この場面では黒が有利と判定されなければなりません 石の位置による評価を重視しての方法 各マスの評価点は 中央の方が点数が高くなるように また基本的に負の値に設定する方法です こうすると 自分の石が多いほど合計点が小さくなることは分かります 負にすることで何のメリットがあるのでしょうか? 実はこの方法だと 相手に囲ませる 石を多くとらない といった リバーシ の必勝通りの戦法になります 例えば 左のような重み付けをしたとすると 先ほどの局面は白 :-23 黒 :-18 となり 黒が優勢となります ヒント : 序盤は隅が非常に重要だが 終盤はそれほど重要でない など 石の位置の重みも変化してくるので この評価値を 序盤 中盤 終盤 などに分けて数パターン作成しておきます 28

(Optional) 課題をするにあたってやってほしいこと : (1) TicTacToe_MinMax Java TicTacToe_alphabeta.java プログラムをダウンロードする (2) 実行する (3) ソースコードを読み理解する (4) ゲーム AI" をキーワードにして検索し 出てきた記事を読む 課題 : 自分の言葉で以下のアルゴリズムを説明しなさい (1) MinMax (2) α-β 29

参考サイト : Java http://fuktommy.com/java/ In python http://www.geocities.jp/m_hiroi/func/abcscm43.html Othello Game (Min-Max): http://uguisu.skr.jp/othello/minimax.html http://www.net.c.dendai.ac.jp/~ksuzuki/ α-β http://hp.vector.co.jp/authors/va015468/platina/algo/2_3.html 30