public AlphaBeta(GameState state, Action interrupt) { PrincipalVariation = new Move[MAX_DEPTH, MAX_DEPTH]; PvLength[0] = 0; Ply = 0; MyGameState = state; MyBoard = state.GameBoard; TimeLimit = TimeSpan.FromSeconds(5); Metrics = new AlphaBetaMetrics(); Interrupt = interrupt; }
static void PrintMetrics(AlphaBetaMetrics metrics, TimeSpan searchTime) { //prevent index out of bounds. //note, this will not effect the calculation if (metrics.Depth == 0) { metrics.Depth = 1; } float ebf = 0; for (int d = 1; d < metrics.Depth; d++) { var bf = (float)metrics.DepthNodes[d] / (float)(metrics.DepthNodes[d - 1] + 1); if (ebf > 0) { ebf = (ebf + bf) / 2; } else { ebf = bf; } } Console.WriteLine("Nodes={0}, QNodes={1}, Qsearch%={2:0.0}, Knps={3:0}, EBF({4})={5:0.00}", metrics.Nodes, metrics.QNodes, 100 * (double)metrics.QNodes / ((double)metrics.Nodes + 1), (metrics.Nodes / 1000 / searchTime.TotalSeconds), metrics.Depth, ebf); Console.WriteLine("FirstMoveFH%={0:0.0}, Killers%={1:0.0} FutilePrune={2}, EFutilePrune={3}", 100 * (double)metrics.FirstMoveFailHigh / ((double)metrics.FailHigh + 1), 100 * (double)metrics.KillerFailHigh / ((double)metrics.FailHigh + 1), metrics.FPrune, metrics.EFPrune); Console.WriteLine("NullMoveTries={0} NullMove%={1:0.0}, NMResearch={2}, MateThreats={3}, LMRResearch={4}", metrics.NullMoveTries, 100 * (double)metrics.NullMoveFailHigh / ((double)metrics.NullMoveTries + 1), metrics.NullMoveResearch, metrics.MateThreats, metrics.LMRResearch); Console.WriteLine("HashTable: FH%={0:0.0} Hit%={1:0.0}", 100 * (double)metrics.TTFailHigh / (double)metrics.FirstMoveFailHigh + 1, 100 * (double)TranspositionTable.Instance.Hits / (double)TranspositionTable.Instance.Probes); }
public AlphaBeta() { Metrics = new AlphaBetaMetrics(); }