private void AddSingleRow(MonteCarloResult data, int rowIndex) { int rowLength = data.data.GetLength(1); for (int i = 0; i < rowLength; i++) { chartData.Series[rowIndex].Points.AddXY(i, data.data[rowIndex, i]); } }
private MonteCarloResult MonteCarlo(Board position, int depth) { // We've been told to cancel our search if (cancellationToken.Cancelled) { return(new MonteCarloResult()); } // We've reached the depth of our search, so blitz out the rest of the game and see who wins if (depth <= 0) { return(Blitz(position)); } List <int> moves = GetFilteredMoves(position); // If we have no moves, return the evaluation of the position if (moves.Count == 0) { return(Blitz(position)); } MonteCarloResult best = new MonteCarloResult { Result = new SearchResult { Score = int.MinValue } }; foreach (int move in moves) { // Copy the board and make a move Board copy = new Board(position); copy.MakeMove(move, false, true); // Recursively make the opponent's moves MonteCarloResult counterMoveResult = MonteCarlo(copy, depth - 1); best.PlayerOneWins += counterMoveResult.PlayerOneWins; best.PlayerTwoWins += counterMoveResult.PlayerTwoWins; if (position.Player == Player.One && counterMoveResult.PlayerOneScore > best.Result.Score) { best.Result.Score = counterMoveResult.PlayerOneScore; best.Result.BestMove = move; } if (position.Player == Player.Two && counterMoveResult.PlayerTwoScore > best.Result.Score) { best.Result.Score = counterMoveResult.PlayerTwoScore; best.Result.BestMove = move; } } return(best); }
private void CreateSeriesWithPoints(MonteCarloResult data) { int rowsCount = data.data.GetLength(0); for (int i = 0; i < rowsCount; i++) { CreateSeries(i); AddSingleRow(data, i); } }
public void Calculate_AllLosses__CalculatesCorrectly() { MonteCarloResult result = MonteCarloCalculator.Calculate(Count, Length, 0, 0.1f, 0.1f); result.data.GetLength(0).ShouldBe(Count); result.data.GetLength(1).ShouldBe(Length); result.Wins.ShouldBe(0); result.Losses.ShouldBe(Count); result.WinsPcnt.ShouldBe(0f); result.LossesPcnt.ShouldBe(1f); }
public void GetPlotMin() { var monteCarloResult = new MonteCarloResult(); var sim = new OP("op1"); monteCarloResult.Collect(sim, -1); monteCarloResult.Collect(sim, 4); monteCarloResult.Function = "MIN"; var plot = monteCarloResult.GetPlot(10); Assert.Single(plot.Bins.Keys); Assert.Equal(-1, plot.Bins[1].Value); }
public void GetPlotMaxMoreBins() { var monteCarloResult = new MonteCarloResult(); var sim = new OP("op1"); var sim2 = new OP("op2"); monteCarloResult.Collect(sim, -1); monteCarloResult.Collect(sim, 4); monteCarloResult.Collect(sim2, 0); monteCarloResult.Collect(sim2, 1); monteCarloResult.Function = "MAX"; var plot = monteCarloResult.GetPlot(10); Assert.Equal(10, plot.Bins.Keys.Count); }
public void CollectMinMax() { var monteCarloResult = new MonteCarloResult(); var op1 = new OP("op1"); var op2 = new OP("op2"); monteCarloResult.Collect(op1, 1); monteCarloResult.Collect(op1, 2); Assert.Equal(1, monteCarloResult.Min[op1]); Assert.Equal(2, monteCarloResult.Max[op1]); monteCarloResult.Collect(op2, -1); monteCarloResult.Collect(op2, 4); Assert.Equal(-1, monteCarloResult.Min[op2]); Assert.Equal(4, monteCarloResult.Max[op2]); }
public void LoadData(MonteCarloResult data) { chartData.Series.Clear(); CreateSeriesWithPoints(data); }
public HistogramPlotViewModel(MonteCarloResult data) { PlotModel = data.GetPlot(Bins); OxyPlotModel = CreateOxyPlotModel(ShowLabels); Data = data; }
private MonteCarloResult MonteCarlo(Board position, int depth, int extraDepth) { // We've been told to cancel our search if (cancellationToken.Cancelled) { return(new MonteCarloResult()); } // We've reached the depth of our search, so blitz out the rest of the game and see who wins if (depth + extraDepth <= 0) { return(Blitz(position)); } List <MonteCarloMove> moves = GetFilteredMoves(position).Select(x => new MonteCarloMove(x)).ToList(); // If we have no moves, return the evaluation of the position if (moves.Count == 0) { return(Blitz(position)); } MonteCarloResult best = new MonteCarloResult { Result = new SearchResult { Score = int.MinValue } }; bool pruned = true; int pruningIterations = depth > _initialDepth - _pruningLayers ? _pruningIterations : 1; for (int prune = 0; prune < pruningIterations && moves.Count > 0 && pruned; prune++) { foreach (var move in moves) { // Copy the board and make a move Board copy = new Board(position); copy.MakeMove(move.Index, false, true); // Recursively make the opponent's moves MonteCarloResult counterMoveResult = MonteCarlo(copy, depth - 1, prune * _pruningDepthPerIteration); best.PlayerOneWins += counterMoveResult.PlayerOneWins; best.PlayerTwoWins += counterMoveResult.PlayerTwoWins; move.Evaluation = position.Player == Player.One ? counterMoveResult.PlayerOneScore : counterMoveResult.PlayerTwoScore; if (position.Player == Player.One && counterMoveResult.PlayerOneScore > best.Result.Score) { best.Result.Score = counterMoveResult.PlayerOneScore; best.Result.BestMove = move.Index; } if (position.Player == Player.Two && counterMoveResult.PlayerTwoScore > best.Result.Score) { best.Result.Score = counterMoveResult.PlayerTwoScore; best.Result.BestMove = move.Index; } } // Remove the worst moves pruned = false; int newCount = moves.Count / _pruningDivisor; if (newCount >= 2) { moves.Sort((c, n) => n.Evaluation.CompareTo(c.Evaluation)); for (int i = moves.Count - 1; i > newCount; i--) { moves.RemoveAt(i); pruned = true; } } } return(best); }