2.2 Mini-Max法 |
前節ではゲーム木について説明しました。
現在の局面から、数手先(図1では3手)の局面をすべて調べ、評価したとします。
この問題を解決する方法として、「Mini-Max法」があります。
図1を見てください。
|
|
図1. Mini-Max法 |
上の規則に従って下から順に各節点の評価値を決めれば、現在の局面の評価値およびどの手を選択すればよいかが決まります。
C言語の関数風に書くと次のようになります。
int mm_max(int t) /* 自局面の節点 tは葉局面までの手数 */ { int max = -N; /* Nは十分大きな値 */ int v; if(t == 0) return (現在の局面の評価値); for(最初の子節点の手; 未評価の子節点がある; 次の子節点に移る){ 局面に子節点の手を打つ; v = mm_min(t-1, alpha, beta); 局面を元に戻す; if(v > max) max = v; } return max; } mm_min(int t) /* 自局面の節点 tは葉局面までの手数 */ { int min = -N; /* Nは十分大きな値 */ int v; if(t == 0) return (現在の局面の評価値); for(最初の子節点の手; 未評価の子節点がある; 次の子節点に移る){ 局面に子節点の手を打つ; v = mm_max(t-1); 局面を元に戻す; if(v < min) min = v; } return min; } |
|
図2. 縦型探索での探索手順 |
図2のように、子節点を優先して探索する手順を「縦型探索」または「深さ優先探索」と呼びます。 |
|
図3. 横型探索での探索手順 |
Mini-Max法では、先読みの手数が増えるごとに、評価しなければならない局面の数が指数関数的に増大します。 |
トップに戻る 2.1 ゲーム木 2.3 Alpha-Beta法 |