public int max_value(State state, int alfa, int beta) { if (cut(state) || state.gameIsOver()) { return(eval(state)); } int v = Int32.MinValue; int temp; LinkedList <int[]> moves = RuleMachine.possible_moves(state); foreach (var move in moves) { //MAX(v,min_value(result(s,a),alfa,beta)) temp = min_value(State.result(state, move), alfa, beta); if (v < temp) { v = temp; } if (v >= beta) { return(v); } //MAX(alfa,v) if (alfa < v) { alfa = v; } } return(v); }
public int[] alpha_beta_search(State state) { int v = Int32.MinValue; int alfa = Int32.MinValue; int beta = Int32.MaxValue; LinkedList <int[]> moves = RuleMachine.possible_moves(state); int i = 0, temp, moveIndex = 0; foreach (var move in moves) { //MAX(v,min_value(result(s,a),alfa,beta)) temp = min_value(State.result(state, move), alfa, beta); if (v < temp) { v = temp; moveIndex = i; } if (v >= beta) { return(move); } //MAX(alfa,v) if (alfa < v) { alfa = v; } i++; } LinkedList <int[]> .Enumerator e = moves.GetEnumerator(); for (i = 0; i < moveIndex + 1; i++) { e.MoveNext(); } return(e.Current); }
//função de avaliação sobre a quantidade de movimentos possiveis //retorna a qtd de movimentos possiveis public static int evalMobility(State state) { LinkedList <int[]> moves = RuleMachine.possible_moves(state); return(moves.Count); }