/// <inheritdoc /> public double EvaluateState(ulong state) { double score = 0; score += heuristicsTable[(state & 0xFFFF)] + heuristicsTable[(state >> 16) & 0xFFFF] + heuristicsTable[(state >> 32) & 0xFFFF] + heuristicsTable[(state >> 48) & 0xFFFF]; state = BoardStateHelpers.Transpose(state); score += heuristicsTable[(state & 0xFFFF)] + heuristicsTable[(state >> 16) & 0xFFFF] + heuristicsTable[(state >> 32) & 0xFFFF] + heuristicsTable[(state >> 48) & 0xFFFF]; return(score); }
public BenchmarkResult Execute() { var tilesFrequencies = new int[16]; var tilesPercentages = new double[16]; var scores = new List <uint>(); var board = new Board(); OnSetupStarted?.Invoke(name); var timer = new Stopwatch(); timer.Start(); var movesCount = 0L; for (var i = 0; i < count; i++) { var state = board.GetInitialState(); while (!board.IsTerminal(state)) { var move = solver.GetNextMove(state); movesCount++; state = board.PlayAndGenerate(state, move); OnMoveGenerated?.Invoke(state, move); } var maxTile = BoardStateHelpers.GetMaxTile(state); for (var j = (int)maxTile; j >= 0; j--) { tilesFrequencies[j]++; } for (var j = 0; j < 16; j++) { tilesPercentages[j] = tilesFrequencies[j] / (double)(i + 1); } scores.Add(board.GetScore(state)); var result = new BenchmarkResult() { Name = $"Run {i + 2}/{count}", ScoreMax = scores.Max(), ScoreMean = (uint)scores.GetMedian(), MovesPerSecond = (movesCount / (double)timer.ElapsedMilliseconds) * 1000, TilePercentages = tilesPercentages.Select(x => x * 100).ToArray(), }; OnPreview?.Invoke(result); } return(new BenchmarkResult() { Name = name, ScoreMax = scores.Max(), ScoreMean = (uint)scores.GetMedian(), MovesPerSecond = (movesCount / (double)timer.ElapsedMilliseconds) * 1000, TilePercentages = tilesPercentages.Select(x => x * 100).ToArray(), }); }