AI 三目並べ

Similar documents
PowerPoint Presentation

Microsoft PowerPoint - ゲーム理論2018.pptx

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

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

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

本文27/A(CD-ROM

tnbp59-20_Web:P1/ky108679509610002943

PowerPoint Presentation


人工知能入門

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

メソッドのまとめ

Ł\”ƒ-2005

dプログラム_1

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

問題1 以下に示すプログラムは、次の処理をするプログラムである

放射線専門医認定試験(2009・20回)/HOHS‐01(基礎一次)

第86回日本感染症学会総会学術集会後抄録(I)

研修コーナー

tnbp59-21_Web:P2/ky132379509610002944

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

日本内科学会雑誌第97巻第7号

問題 01 以下は コンソールより年齢を入力させ その年齢にあった料金を表示するプログラムである 年齢ごとの金額は以下の通りである 年齢の範囲金額 0 歳以上 6 歳以下 120 円 7 歳以上 65 歳未満 200 円 65 歳以上無料 package j1.exam02; import java


日本内科学会雑誌第98巻第4号

_0212_68<5A66><4EBA><79D1>_<6821><4E86><FF08><30C8><30F3><30DC><306A><3057><FF09>.pdf

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

プログラミングA

メソッドのまとめ

JAVA入門

PowerPoint プレゼンテーション

一般演題(ポスター)

snkp-14-2/ky347084220200019175

情報処理Ⅰ

プログラミングA

Microsoft Word - CompA-Ex doc

スポーツ科学 20年度/01 目次



A B C D E F G H J K L M 1A : 45 1A : 00 1A : 15 1A : 30 1A : 45 1A : 00 1B1030 1B1045 1C1030

CW3_A1083D05.indd

本文/年次報告  67‐107

32号 701062/きじ1

10西宮市立中央病院/本文

北九州高専 志遠 第63号/表紙・表4

特別プログラム

Ł\”ƒ

報告書(第2回NGO‐JICA)/はじめに・目次

P-12 P P-14 P-15 P P-17 P-18 P-19 P-20 P-21 P-22

ニューガラス100/100目次

untitled

program08.pdf


始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

Microsoft PowerPoint - 05.pptx

memo

< F2D92DE82E8914B82CC977088D32E6A7464>

プログラミング教育のための発展的な教材作成の実践と考察

Microsoft PowerPoint - DA2_2017.pptx

Microsoft PowerPoint - DA2_2018.pptx

日本内科学会雑誌第98巻第3号

第52回日本生殖医学会総会・学術講演会

> > <., vs. > x 2 x y = ax 2 + bx + c y = 0 2 ax 2 + bx + c = 0 y = 0 x ( x ) y = ax 2 + bx + c D = b 2 4ac (1) D > 0 x (2) D = 0 x (3

JSP58-program


< F2D A838B838D96402E6A7464>


日本外傷歯学会認定医(平成24年11月30日付) H

yakuri06023‡Ì…R…s†[

Microsoft Word - NonGenList.doc

Microsoft PowerPoint - diip ppt

平成20年5月 協会創立50年の歩み 海の安全と環境保全を目指して 友國八郎 海上保安庁 長官 岩崎貞二 日本船主協会 会長 前川弘幸 JF全国漁業協同組合連合会 代表理事会長 服部郁弘 日本船長協会 会長 森本靖之 日本船舶機関士協会 会長 大内博文 航海訓練所 練習船船長 竹本孝弘 第二管区海上保安本部長 梅田宜弘

aphp37-11_プロ1/ky869543540410005590

日本内科学会雑誌第96巻第11号

本文/扉1

プログラム


Program


Œ{Ł¶/1ŒÊ −ªfiª„¾ [ 1…y†[…W ]

日本内科学会雑誌第102巻第4号

class IntCell { private int value ; int getvalue() {return value; private IntCell next; IntCell next() {return next; IntCell(int value) {this.value =

Ł\”ƒ-2005

第90回日本感染症学会学術講演会抄録(I)

Taro-最大値探索法の開発(公開版

PowerPoint Presentation

Java講座

Microsoft Word - no206.docx

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

Microsoft PowerPoint ppt


株式会社日清製粉グループ本社 第158期中間事業報告書


メンバ変数とインスタンス

Microsoft Word - NonGenTree.doc

診療ガイドライン外来編2014(A4)/FUJGG2014‐01(大扉)

H:\Projects2013\MatrixLibrary\MatrixLibrary\MatrixLibrary.cs /* ************************ * * * 行列関係のライブラリ * * * ************************ * * 行列の要素 A.V

2

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

ワンダー ライヴズとは? 世界の様々な特徴 能 を持つ生物たちが 自然界での生き残りをかけて戦うカードゲームです

Transcription:

ame Algorithms AI programming 三目並べ 2011 11 17

ゲーム木 お互いがどのような手を打ったかによって次にどのような局面になるかを場合分けしていくゲーム展開を木で表すことができる 相手の手 ゲームを思考することは このゲーム木を先読みしていく必要がある

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

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

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

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

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の負けが確実 OptionPane.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;

αβ 法 ミニマックス法は木を全て探索 + 評価値の計算を行うので計算量が多くなる 木を全てではなく 見なくて良い枝をカットしていく方法が αβ 法 R A B C D (7) E F (8) H I (7) K L M M (8)

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

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

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

どのように実装するか (αβ カット ) 1. 自分 (CP) の手であれば 子ノードの中で最大の評価値を選ぶ 1. この時 α 値を更新する 2. この見ているノードの評価値が β 値より大きかったら for ループを抜ける 2. プレイヤーなら子ノードの中で最小の評価値を選ぶ 1. この時 β 値を更新する 2. 見ているノードの評価値が α 値よりも小さかったら for ループを抜ける

擬似コード flag : AI の手のとき true プレイヤーの手のとき false level : 先読みのレベル alpha : α 値 beta : β 値 public int alphabeta(boolean flag, int level, int alpha, int beta) { 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 = alphabeta(!flag, level - 1, alpha, beta); 1 2 if (flag) { if (childvalue > value) { 1.1を書く else { if (childvalue < value) { 1.2 を書く 2.1 を書く 2.2 を書く

課題 TicTacToe_MinMax.java に書かれているコメントを参考にして以下のことに取り組みましょう 1. 4 4 マスでも動くプログラム TicTacToe4.java を作成する 2. 資料を参考に αβ 法のメソッドを実装し TicTacToe_AlphaBeta.java を作成する 1. 4 4 マスで動くようにしてください