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]);
            }
        }
Example #2
0
        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);
 }
Example #9
0
 public HistogramPlotViewModel(MonteCarloResult data)
 {
     PlotModel    = data.GetPlot(Bins);
     OxyPlotModel = CreateOxyPlotModel(ShowLabels);
     Data         = data;
 }
Example #10
0
        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);
        }