Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
1
• Decisions in games
• Minimax algorithm
• α-β algorithm
• Tic-Tac-Toe game
Games
2
Othello Chess TicTacToe ……
3
Games as search problems
ゲームはAIにおける、最も古くから力を入れられている分野の1つです。限られた時間の中で答えを見つけることはとても難しい
チェスゲームでは
35通りの置き方があり、レイヤーは50回移動することができる。
つまり、探索木には合わせると35100もの葉が存在することになります。
このような複雑なゲームにはある程度の場所で妥協する必要があります。これは情報がないのではなく、いかなる動きに対する正確な結果を計算する時間がないからです。
この点で、ゲームは標準的な検索問題よりも現実の世界に似ています。
まずはじめに三目並べを例に、理論上最高の手を見つける方法を分析することから始めましょう。
4
Perfect two players game
問題は以下の要素から構成されます: • 初期状態: ボードの場所、それぞれの動きの指標 • オペレータ: 定められた動き • 終了状態: ゲームが終了する状態 • 効用関数: +1, -1, または 0のように数値(評価値)を与えます.
コンピュータは相手が取りうる動き(手)の中で正しい動き(手)を含む戦略を見つけなければなりません。そして、最終状態の勝者を導き出し、その流れの最初の一手を選びます。 重要: 効用関数 はどの動きが最高の動きであるかを決定するじゅうような構成要素です。
5
Minimax
5つのステップから構成されます: • ゲーム木の全体を生成する. • 木の末端ノードに評価値を得るために効用関数を適用する. • この評価値を探索木の1つ上のレベルのノードの評価値を得るために使う(どちらの手番かによってどのノードの評価値を選ぶかは変わる). • これを末端から根まで繰り返す. • コンピュータは最も評価値の高いものを選ぶ.
L2 (minimum in L3)
L3
L1 (maximum in L2)
A2
A31
A1 A3
A11 A12 A13 A22 A23 A21 A32 A33
5 2 2 4 6 14 8 12 3
2 3
3
2
ゲームは、自分にとっては最も有利な手を自分が打ち(max)、次に相手が自分にとって最も不利な手を打ち(min)、それらが交互に繰り返されることによって成り立ちます。
MinMax - Searching tree
- Ex: Tic-Tac-Toe (symmetrical positions removed)
8
MinMax (GamePosition game) {
return MaxMove (game);
}
MinMove (GamePosition game) {
best_move <- {};
moves <- GenerateMoves(game);
ForEach moves {
move <- MaxMove(ApplyMove(game));
if (Value(move) < Value(best_move)) {
best_move <- move;
}
}
return best_move;
}
MaxMove (GamePosition game) {
if (GameEnded(game)) {
return EvalGameState(game);
} else {
best_move <- {};
moves <- GenerateMoves(game);
ForEach moves {
move <- MinMove(ApplyMove(game));
if (Value(move) > Value(best_move)) {
best_move <- move;
}
}
return best_move;
}
}
A2
A31
A1 A3
A11 A12 A13 A22 A23 A21 A32 A33
5 2 2 4 6 14 8 12 3
2 3
3
2 CPの動き
相手の動き
9
http://fuktommy.com/java/
10
MinMax (GamePosition game) {
return MaxMove (game);
}
MinMove (GamePosition game) {
best_move <- {};
moves <- GenerateMoves(game);
ForEach moves {
move <- MaxMove(ApplyMove(game));
if (Value(move) < Value(best_move)) {
best_move <- move;
}
}
return best_move;
}
MaxMove (GamePosition game) {
if (GameEnded(game)) {
return EvalGameState(game);
} else {
best_move <- {};
moves <- GenerateMoves(game);
ForEach moves {
move <- MinMove(ApplyMove(game));
if (Value(move) > Value(best_move)) {
best_move <- move;
}
}
return best_move;
}
}
A2
A31
A1 A3
A11 A12 A13 A22 A23 A21 A32 A33
5 2 2 4 6 14 8 12 3
2 3
3
2
11
まとめると:
コンピュータは最後に一番高い評価値を選ぶ. しかし相手プレイヤーもまた自分にとって良い手を選びます。したがって相手プレイヤーはコンピュータの評価値の最小を選びます。(コンピュータにとって評価値が低いということは自分にとって有利であるから)
<Minimax 法>
想定される最大の損害が最小になるように決断を行う戦略。将棋やチェスなどコンピュー
タに思考させるためのアルゴリズムの一つ。
実行例1
12
A2
A31
A1 A3
A11 A12 A13 A22 A23 A21 A32 A33
5 2 4 6 14 8
α= 12
α=-999 β=3
β=999
初期値
β =2
α=3
3
2
L3 (maximum in L4)
L2 (minimum in L3)
L1 (maximum in L2)
探索のスピードを早めるためにこの分岐をカットする。 2 3 1
5 9
A121 A122 A123
α=12 β=3 α > β
α=3 β=2 α >= β
α-β pruning (Alpha-Beta法)
実行例2
A121の評価値が12と決定したとき、A12の評価値は12以上だと確定する。(A121,A122,A123の最大値がA12の評価値になる)よってA12の評価値がA1に選ばれることはなくなった。( A1の評価値はA11,A12,A13の最小値が選ばれる。)ので、A122,A123の評価値を計算する必要がないの
でカットする。
13
MinMove (GamePosition game, Integer alpha, Integer beta) {
if (GameEnded(game) || DepthLimitReached()) {
return EvalGameState(game, MIN);
}
else {
best_move <- {};
moves <- GenerateMoves(game);
ForEach moves {
move <- MaxMove(ApplyMove(game), alpha, beta);
if (Value(move) < Value(best_move)) {
best_move <- move;
beta <- Value(move);
}
// Ignore remaining moves
if (beta < = alpha)
return best_move;
}
return best_move;
}
}
MaxMove (GamePosition game, Integer alpha, Integer beta) {
if (GameEnded(game) || DepthLimitReached()) {
return EvalGameState(game, MAX);
}
else {
best_move <- {};
moves <- GenerateMoves(game);
ForEach moves {
move <- MinMove(ApplyMove(game), alpha, beta);
if (Value(move) > Value(best_move)) {
best_move <- move;
alpha <- Value(move);
}
// Ignore remaining moves
if (alpha >= beta)
return best_move;
}
return best_move;
}
}
α=12 β=3 α >= β
α=3 β=2 α >= β
14 14
まとめ
<α-β 法(刈)>
Minimaxを改良したもの。枝刈りを行うことでMinimaxより評価するノードを抑えている
ゲームは、自分にとっては最も有利な手を自分が打ち(max)、次に相手が自分にとって最も不利な手を打ち(min)、それらが交互に繰り返されることによって成り立ちます。
<Minimax algorithmとα-β algorithmの違い>
Minimax法ではすべてを探索し最良の手を選択するのに対して、α-β法は、minimax法で採用さ
れないと判断された手については、そこから先を探索しないことで無駄な探索に費やす時間を
カットしている。また、α-β法による結果はminimax法での結果と同じになる。
枝刈りを行うことにより探索がminimax法より早く終わるのでα-β法のほうが効率的である。
15
Tic Tac Toe game // 評価する.
public int evaluate(int depth, int level, int refValue) {
int e = evaluateMyself();
if ((depth==0)||(e==99)||(e==-99)||((e==0)&&(Judge.finished(this)))) {
return e;
} else if (level == MAX) {
int maxValue = -999;
Vector v_child = this.children(usingChar);
for (int i=0; i<v_child.size(); i++) {
SymTic st = (SymTic)v_child.elementAt(i); //st is a move
int value = st.evaluate(depth, MIN, maxValue);
if (value > maxValue ) {
maxChild = st;
maxValue = value; //maxValue = α
}
if (value > = refValue) { //refValue = β
return value;
}
}
return maxValue;
}
else {
int minValue = 999;
Vector v_child = this.children('o');
for (int i=0; i<v_child.size(); i++) {
SymTic st = (SymTic)v_child.elementAt(i);
int value = st.evaluate(depth-1, MAX, minValue);
if (value < minValue) {
minValue = value; // minValue = β
}
if (value <= refValue) { // refValue = α
return value;
} }
return minValue;
}}
private int evaluateMyself() {
char c = Judge.winner(this);
if (c == usingChar) { //win the game
return 99;
} else if (c != ' ') { //lose the game
return -99;
} else if (Judge.finished(this)) { //draw the game
return 0;
}
In SymTic.java
16
Work in class:Take a look of two web sites and make your own example search tree.
Othello Game (Min-Max): http://uguisu.skr.jp/othello/minimax.html α-β http://hp.vector.co.jp/authors/VA015468/platina/algo/2_3.html
17
Home work for practice: 課題をするにあたってやってほしいこと: (1) TicTacToe game Java プログラムをダウンロードする (2) 実行する (3) ソースコードを読み理解する (4) “ゲームAI"をキーワードにして検索し、出てきた記事を読む 課題: 自分の言葉で以下のアルゴリズムを説明しなさい (1) MinMax (2) α-β