예제 #1
0
        public void ScoreCacheTest()
        {
            AlphaBetaEngine engine = new AlphaBetaEngine();
            //engine.TraceSource.Listeners.Clear();
            //engine.TraceSource.Listeners.Add(new TextWriterTraceListener(new StreamWriter(@"C:\Users\huww\Documents\engine.log", false)));
            //engine.TraceSource.Switch.Level = SourceLevels.All;

            var board = new Player[20, 20];

            board[10, 10] = board[10, 11] = board[11, 10] = board[9, 11]
                                                                = board[9, 6] = board[12, 9] = board[12, 11] = board[11, 11] = Player.Own;
            board[9, 10] = board[9, 9] = board[9, 8] = board[9, 7]
                                                           = board[10, 8] = board[13, 8] = board[13, 11] = board[8, 11] = Player.Opponent;
            engine.SetBoard(board);
            engine.HasTimeLimit       = false;
            engine.HasForbiddenPlayer = Player.Own;
            for (int i = 1; i <= 5; i++)
            {
                engine.AlphaBetaSearch(i);
            }
            engine.SelfMove((12, 10));
            engine.OpponentMove((12, 8));
            var score = engine.AlphaBetaSearch(3); // this will use score cache from previous search

            engine.TraceSource.Flush();

            Assert.Equal(-Evaluator.MaxScore, score);
        }
예제 #2
0
        public void ScoreCacheTest()
        {
            var board = new Player[20, 20];

            board[10, 10] = board[10, 11] = board[11, 10] = board[9, 11]
                                                                = board[9, 6] = board[12, 9] = board[12, 11] = board[11, 11] = Player.Own;
            board[9, 10] = board[9, 9] = board[9, 8] = board[9, 7]
                                                           = board[10, 8] = board[13, 8] = board[13, 11] = board[8, 11] = Player.Opponent;

            AlphaBetaEngine engine = new AlphaBetaEngine(new Board(board));

            engine.HasNoTimeLimit();
            engine.HasForbiddenPlayer = Player.Own;
            engine.InitializeSearch();
            for (int i = 1; i <= 5; i++)
            {
                engine.AlphaBetaSearch(i);
            }
            engine.SelfMove((12, 10));
            engine.OpponentMove((12, 8));
            engine.InitializeSearch();
            var score = engine.AlphaBetaSearch(3); // this will possibly use score cache from previous search

            Assert.Equal(-Evaluator.MaxScore, score);
        }
예제 #3
0
        static async Task Main(string[] args)
        {
            var engine = new AlphaBetaEngine();

            engine.TraceSource.Listeners.Clear();
            //engine.TraceSource.Listeners.Add(new TextWriterTraceListener(new StreamWriter(@"C:\Users\huww\Documents\engine.log", false))
            //{
            //    TraceOutputOptions = TraceOptions.DateTime
            //});
            engine.TraceSource.Switch.Level = SourceLevels.Information;

            var pbrain = new PbrainAdapter(engine)
            {
                About = new About
                {
                    Name    = "H2",
                    Author  = "Weiwen Hu",
                    Country = "CN",
                    Version = "1.0",
                    Email   = "*****@*****.**"
                }
            };

            engine.TraceSource.Listeners.Add(new PbrainTraceListener(pbrain));

            await pbrain.StartAsync();
        }
예제 #4
0
        public void SearchToLoss()
        {
            AlphaBetaEngine engine = new AlphaBetaEngine();
            var             board  = new Player[10, 10];

            board[2, 2] = board[3, 2] = board[4, 2] = board[5, 2] = Player.Opponent;
            engine.SetBoard(board);
            engine.HasTimeLimit = false;
            var score = engine.AlphaBetaSearch(3);

            Assert.Equal(-Evaluator.MaxScore, score);
        }
예제 #5
0
        public void SearchToLoss()
        {
            var board = new Player[10, 10];

            board[2, 2] = board[3, 2] = board[4, 2] = board[5, 2] = Player.Opponent;
            AlphaBetaEngine engine = new AlphaBetaEngine(new Board(board));

            engine.HasNoTimeLimit();
            engine.InitializeSearch();
            var score = engine.AlphaBetaSearch(3);

            Assert.Equal(-Evaluator.MaxScore, score);
        }
예제 #6
0
        public void SearchToScore()
        {
            PatternTable patternTable = new PatternTable();

            patternTable["_ _ o o o * _ _ _ _".ToPatternPair()] = 100;
            AlphaBetaEngine engine = new AlphaBetaEngine(patternTable);
            var             board  = new Player[10, 10];

            board[2, 2] = board[3, 2] = board[5, 2] = Player.Own;
            engine.SetBoard(board);
            engine.HasTimeLimit = false;
            var score = engine.AlphaBetaSearch(2);

            Assert.Equal(100, score);
        }
예제 #7
0
        public static void SimulateGames()
        {
            List <simulator> simulations = new List <simulator>();

            //simulations.Add(new simulator(50, 2, 100));
            //simulations.Add(new simulator(100, 2, 50));
            //simulations.Add(new simulator(150, 2, 33));
            //simulations.Add(new simulator(200, 2, 25));

            //simulations.Add(new simulator(50, 3, 100));
            //simulations.Add(new simulator(100, 3, 50));
            //simulations.Add(new simulator(150, 3, 33));
            //simulations.Add(new simulator(200, 3, 25));

            //simulations.Add(new simulator(50, 4, 100));
            //simulations.Add(new simulator(100, 4, 50));
            //simulations.Add(new simulator(150, 4, 33));
            //simulations.Add(new simulator(200, 4, 25));

            //simulations.Add(new simulator(150, 5, 10));
            //simulations.Add(new simulator(200, 5, 10));
            //simulations.Add(new simulator(250, 5, 10));
            //simulations.Add(new simulator(300, 5, 10));
            //simulations.Add(new simulator(350, 5, 10));
            //simulations.Add(new simulator(400, 5, 10));
            //simulations.Add(new simulator(450, 5, 10));
            //simulations.Add(new simulator(500, 5, 10));

            //simulations.Add(new simulator(200, 6, 10));
            //simulations.Add(new simulator(300, 6, 10));
            //simulations.Add(new simulator(400, 6, 10));
            //simulations.Add(new simulator(500, 6, 10));
            //simulations.Add(new simulator(600, 6, 10));
            //simulations.Add(new simulator(700, 6, 10));
            //simulations.Add(new simulator(800, 6, 10));
            //simulations.Add(new simulator(900, 6, 8));

            //simulations.Add(new simulator(500, 7, 10));
            //simulations.Add(new simulator(750, 7, 10));
            //simulations.Add(new simulator(1000, 7, 10));
            //simulations.Add(new simulator(2500, 7, 10));
            //simulations.Add(new simulator(5000, 7, 10));
            //simulations.Add(new simulator(7500, 7, 1));
            //simulations.Add(new simulator(10000, 7, 10));

            //simulations.Add(new simulator(500, 8, 10));
            //simulations.Add(new simulator(750, 8, 10));
            //simulations.Add(new simulator(1000, 8, 10));
            //simulations.Add(new simulator(2500, 8, 10));
            //simulations.Add(new simulator(5000, 8, 10));
            //simulations.Add(new simulator(7500, 8, 10));
            //simulations.Add(new simulator(10000, 8, 10));

            //simulations.Add(new simulator(500, 9, 10));
            //simulations.Add(new simulator(1000, 9, 10));
            simulations.Add(new simulator(2500, 9, 10));
            simulations.Add(new simulator(5000, 9, 10));
            simulations.Add(new simulator(10000, 9, 10));
            simulations.Add(new simulator(15000, 9, 10));
            simulations.Add(new simulator(20000, 9, 10));
            simulations.Add(new simulator(25000, 9, 10));

            simulations.Add(new simulator(1000, 10, 10));
            simulations.Add(new simulator(5000, 10, 10));
            simulations.Add(new simulator(10000, 10, 10));
            simulations.Add(new simulator(15000, 10, 10));
            simulations.Add(new simulator(20000, 10, 10));
            simulations.Add(new simulator(25000, 10, 10));

            double mctsIterations   = 0;
            double mctsUctParameter = 1.5;

            double  alphaBetaDeep = 0;
            IEngine white, black;

            foreach (var simulation in simulations)
            {
                mctsIterations = simulation.mctsIterations;
                alphaBetaDeep  = simulation.alphaBetaDeep;
                white          = new AlphaBetaEngine(PieceColor.White, (int)alphaBetaDeep);
                black          = new MctsEngine(PieceColor.Black, null, mctsUctParameter, (int)mctsIterations);
                var mctsParameters      = $" Liczba iteracji: {mctsIterations},\t parametr UCT: {mctsUctParameter}.";
                var alphaBetaParameters = $" Głębokość drzewa {alphaBetaDeep}.";
                System.Console.WriteLine($"Gracz biały: {white.Kind}." + (white.Kind == EngineKind.AlphaBeta ? alphaBetaParameters : mctsParameters));
                System.Console.WriteLine($"Gracz czarny: {black.Kind}." + (black.Kind == EngineKind.AlphaBeta ? alphaBetaParameters : mctsParameters));

                System.Console.WriteLine($"Liczba iteracji: {simulation.numberOfSimulations}");

                for (int i = 0; i < simulation.numberOfSimulations; i++)
                {
                    Stopwatch sw = new Stopwatch();
                    sw.Start();
                    System.Console.Write($"{i}.\t");
                    SimulateGame(white, black);
                    System.Console.WriteLine();
                    System.Console.WriteLine($"\tczas: {sw.Elapsed.Seconds}s. ");
                }
            }
        }