アルファベータ法; AlphaBeta Pruning
概要
アルファベータ法とはミニマックス法において評価を行わずとも決定される棋譜に影響がないノードを、アルファカット・ベータカットを用い無視して計算効率の向上をはかったものである。
ソースコード
namespace GameTreeSearch {
/// <summary>アルファベータ法</summary>
/// <typeparam name="StateType">盤面状態クラス</typeparam>
/// <typeparam name="DecisionType">棋譜クラス</typeparam>
public static class AlphaBetaMethod<StateType, DecisionType> where StateType : IState<DecisionType> where DecisionType : new() {
/// <summary>探索</summary>
/// <param name="root_state">ルートとなる状態</param>
/// <param name="max_depth">ゲーム木の深さ</param>
/// <param name="pass_decision">パス決定オブジェクト(有効な棋譜が存在しない場合に採用される)</param>
/// <returns>ゲーム木探索によって決定された棋譜</returns>
public static DecisionType Search(StateType root_state, int max_depth, DecisionType pass_decision) {
if(max_depth <= 0 || root_state.IsEndGame) {
return pass_decision;
}
Func<GameNode<StateType, DecisionType>, int, bool, double, double, double> alphabeta_method = null;
alphabeta_method = (node, depth, is_player, alpha, beta) => {
if(depth >= max_depth || node.IsEndNode) {
return node.Evaluation;
}
if(is_player) {
GameNode<StateType, DecisionType> max_node = null;
double max_ev = double.NegativeInfinity;
foreach(var child_node in node.ChildNodes()) {
double ev = alphabeta_method(child_node, depth + 1, !is_player, alpha, beta);
if(max_ev < ev) {
max_node = child_node;
max_ev = ev;
}
if(alpha < ev) {
alpha = ev;
}
if(alpha >= beta) {
node.ChildNodeList.Clear();
if(max_node != null) {
node.ChildNodeList.Add(max_node);
}
return beta;
}
}
node.ChildNodeList.Clear();
if(max_node != null) {
node.ChildNodeList.Add(max_node);
}
return alpha;
}
else {
GameNode<StateType, DecisionType> min_node = null;
double min_ev = double.PositiveInfinity;
foreach(var child_node in node.ChildNodes()) {
double ev = alphabeta_method(child_node, depth + 1, !is_player, alpha, beta);
if(min_ev > ev) {
min_node = child_node;
min_ev = ev;
}
if(beta > ev) {
beta = ev;
}
if(alpha >= beta) {
node.ChildNodeList.Clear();
if(min_node != null) {
node.ChildNodeList.Add(min_node);
}
return alpha;
}
}
node.ChildNodeList.Clear();
if(min_node != null) {
node.ChildNodeList.Add(min_node);
}
return beta;
}
};
var root_node = new GameNode<StateType, DecisionType>(root_state, new DecisionType(), null);
alphabeta_method(root_node, 0, true, double.NegativeInfinity, double.PositiveInfinity);
if(root_node.ChildNodeList.Count > 0) {
return root_node.ChildNodeList[0].Decision;
}
else {
return pass_decision;
}
}
}
}
関連項目
ゲーム木
完全探索法
ミニマックス法
反復深化探索法
探索打ち切り可能な反復深化探索法
オセロAIの開発(実装例)