Exemplo n.º 1
0
        public static void Demo2b_ImprovedLinear(this GameBoard board)
        {
            var linearStrategy = new ChutesAndLadders.Strategy.Linear.Engine();

            var improvedLinearStrategy1 = new ChutesAndLadders.Strategy.Rules.Engine("Improved Linear 1");

            improvedLinearStrategy1.AddTakeLadderRules(28, 84);
            improvedLinearStrategy1.AddTakeLadderRules(80, 100);

            var improvedLinearStrategy2 = new ChutesAndLadders.Strategy.Rules.Engine("Improved Linear 2");

            improvedLinearStrategy2.AddTakeLadderRules(28, 84);
            improvedLinearStrategy2.AddTakeLadderRules(80, 100);
            improvedLinearStrategy2.AddTakeChuteRules(98, 78);

            // This is the shortest path, which should give the same results
            // as "Take All Ladders" if all games started from 0
            var improvedLinearStrategy3 = new ChutesAndLadders.Strategy.Rules.Engine("Improved Linear 3");

            improvedLinearStrategy3.AddTakeLadderRules(1, 38);
            improvedLinearStrategy3.AddTakeLadderRules(51, 67);
            improvedLinearStrategy3.AddTakeLadderRules(71, 91);


            var player1 = new Player("Player 1", linearStrategy);
            var player2 = new Player("Player 2", improvedLinearStrategy1);
            var player3 = new Player("Player 3", improvedLinearStrategy2);
            var player4 = new Player("Player 4", improvedLinearStrategy3);
            var players = new Player[] { player1, player2, player3, player4 };

            var engine = new SimulationCollection();

            engine.RunSimulations(players, 30000, true);
        }
        public static void GameActionOutput_SmallSample(this GameBoard board)
        {
            var randomStrategy = new ChutesAndLadders.Strategy.Random.Engine();

            var player1 = new Player("Player 1", randomStrategy);
            var player2 = new Player("Player 2", randomStrategy);
            var player3 = new Player("Player 3", randomStrategy);
            var player4 = new Player("Player 4", randomStrategy);
            var player5 = new Player("Player 5", randomStrategy);
            var player6 = new Player("Player 6", randomStrategy);
            var players = new Player[] { player1, player2, player3, player4, player5, player6 };

            var engine  = new SimulationCollection();
            var results = engine.RunSimulations(players, 60000, false, @".\");
        }
Exemplo n.º 3
0
        public static void Demo2a_RulesEngine(this GameBoard board)
        {
            var linearStrategy      = new ChutesAndLadders.Strategy.Rules.Engine();
            var greedyRulesStrategy = new ChutesAndLadders.Strategy.GreedyRules.Engine();
            var ladderRulesStrategy = new ChutesAndLadders.Strategy.TakeAllLadders.Engine();

            var player1 = new Player("Player 1", linearStrategy);
            var player2 = new Player("Player 2", greedyRulesStrategy);
            var player3 = new Player("Player 3", ladderRulesStrategy);
            var players = new Player[] { player1, player2, player3 };

            var engine = new SimulationCollection();

            engine.RunSimulations(players, 30000, true);
        }
Exemplo n.º 4
0
        public static void Demo1a_GreedyAlgorithm(this GameBoard board)
        {
            var greedyStrategy = new ChutesAndLadders.Strategy.Greedy.Engine();
            var badStrategy    = new ChutesAndLadders.Strategy.AgressivelyBad.Engine();
            var linearStrategy = new ChutesAndLadders.Strategy.Linear.Engine();

            var player1 = new Player("Player 1", greedyStrategy);
            var player2 = new Player("Player 2", badStrategy);
            var player3 = new Player("Player 3", linearStrategy);
            var players = new Player[] { player1, player2, player3 };

            var engine = new SimulationCollection();

            engine.RunSimulations(players, 30000, true);
        }
Exemplo n.º 5
0
        public static void Demo3c_GeneticSuperiority(this GameBoard board)
        {
            var greedyStrategy = new ChutesAndLadders.Strategy.Greedy.Engine();
            var linearStrategy = new ChutesAndLadders.Strategy.Linear.Engine();

            var geneticStrategy = new ChutesAndLadders.Strategy.Rules.Engine("Best Found");

            geneticStrategy.AddBestStrategyRules();

            var player1 = new Player("Player 1", greedyStrategy);
            var player2 = new Player("Player 2", linearStrategy);
            var player3 = new Player("Player 3", geneticStrategy);
            var players = new Player[] { player1, player2, player3 };

            var engine = new SimulationCollection();

            engine.RunSimulations(players, 100000, true);
        }
Exemplo n.º 6
0
        public static void Demo3b_GeneticEvolution(this GameBoard board)
        {
            const int    maxGenerations           = 300;
            const int    simulationsPerGeneration = 1200;
            const double misspellingRate          = 0.05;

            var basicGeneticStrategy = new ChutesAndLadders.Strategy.Genetic.Engine();

            var player1 = new Player("Player 1", basicGeneticStrategy.Evolve(misspellingRate));
            var player2 = new Player("Player 2", basicGeneticStrategy.Evolve(misspellingRate));
            var player3 = new Player("Player 3", basicGeneticStrategy.Evolve(misspellingRate));
            var player4 = new Player("Player 4", basicGeneticStrategy.Evolve(misspellingRate));
            var player5 = new Player("Player 5", basicGeneticStrategy.Evolve(misspellingRate));
            var player6 = new Player("Player 6", basicGeneticStrategy.Evolve(misspellingRate));
            var players = new Player[] { player1, player2, player3, player4, player5, player6 };

            var engine = new SimulationCollection();

            int mostWins        = 0;
            int generationCount = 0;

            while (generationCount < maxGenerations)
            {
                players = engine.RunSimulations(players, simulationsPerGeneration).Players.ToArray();

                // Create the next generation of Players/Strategies
                // by evolving based on the strategies of the top 2 players
                var bestPlayers = players.OrderByDescending(p => p.WinCount).Take(2);
                if (bestPlayers.First().WinCount > mostWins)
                {
                    mostWins = bestPlayers.First().WinCount;
                    Console.WriteLine($"Generation {generationCount} (most wins {mostWins}):");
                }

                player1 = new Player("Player 1", bestPlayers.First().Strategy);
                player2 = new Player("Player 2", bestPlayers.Last().Strategy);
                player3 = new Player("Player 3", (player1.Strategy as ChutesAndLadders.Strategy.Genetic.Engine).Evolve());
                player4 = new Player("Player 4", (player1.Strategy as ChutesAndLadders.Strategy.Genetic.Engine).Evolve());
                player5 = new Player("Player 5", (player1.Strategy as ChutesAndLadders.Strategy.Genetic.Engine).Evolve());
                player6 = new Player("Player 6", (player2.Strategy as ChutesAndLadders.Strategy.Genetic.Engine).Evolve());
                players = new Player[] { player1, player2, player3, player4, player5, player6 };

                generationCount++;
            }


            // Run the original (linear) strategy against the best one found genetically
            var rootStrategy  = new ChutesAndLadders.Strategy.Genetic.Engine("GeneticRoot");
            var finalStrategy = players.OrderByDescending(p => p.WinCount).First().Strategy as ChutesAndLadders.Strategy.Genetic.Engine;

            var p1           = new Player("Player 1", finalStrategy);
            var p2           = new Player("Player 2", finalStrategy);
            var p3           = new Player("Player 3", finalStrategy);
            var p4           = new Player("Player 4", rootStrategy);
            var p5           = new Player("Player 5", rootStrategy);
            var p6           = new Player("Player 6", rootStrategy);
            var finalPlayers = new Player[] { p1, p2, p3, p4, p5, p6 };

            engine.RunSimulations(finalPlayers, simulationsPerGeneration, true);

            Console.WriteLine($"{finalStrategy.Name} rules:");
            Console.WriteLine(finalStrategy.ContrastWith(rootStrategy));
        }
Exemplo n.º 7
0
        public static void Evolution(int maxGenerations, int simulationsPerGeneration,
                                     double misspellingRate, Func <int, int, int, Task> updateDelegate = null)
        {
            var players = new PlayerCollectionBuilder()
                          .Add("Player 1", new ChutesAndLadders.Strategy.Genetic.Engine())
                          .Add("Player 2", new ChutesAndLadders.Strategy.Genetic.Engine())
                          .Add("Player 3", new ChutesAndLadders.Strategy.Genetic.Engine())
                          .Add("Player 4", new ChutesAndLadders.Strategy.Genetic.Engine())
                          .Add("Player 5", new ChutesAndLadders.Strategy.Genetic.Engine())
                          .Add("Player 6", new ChutesAndLadders.Strategy.Genetic.Engine())
                          .Build();

            var engine = new SimulationCollection();

            int mostWins        = 0;
            int generationCount = 0;
            int evolutionCount  = 0;

            while (generationCount < maxGenerations)
            {
                generationCount++;
                players = engine.RunSimulations(players, simulationsPerGeneration).Players.ToArray();

                // Create the next generation of Players/Strategies
                // by evolving based on the strategies of the top 2 players
                var bestPlayers = players.OrderByDescending(p => p.WinCount).Take(2);
                if (bestPlayers.First().WinCount > mostWins)
                {
                    mostWins = bestPlayers.First().WinCount;
                    Console.WriteLine($"Generation {generationCount} (most wins {mostWins}):");
                    evolutionCount++;
                }

                if (updateDelegate != null)
                {
                    updateDelegate.Invoke(generationCount, mostWins, evolutionCount);
                }

                var bestStrategy     = bestPlayers.First().Strategy;
                var runnerUpStrategy = bestPlayers.Last().Strategy;

                players = new PlayerCollectionBuilder()
                          .Add("Player 1", bestStrategy)
                          .Add("Player 2", runnerUpStrategy)
                          .Add("Player 3", (bestStrategy as Strategy.Genetic.Engine).CrossoverWith(runnerUpStrategy as Strategy.Genetic.Engine))
                          .Add("Player 4", (bestStrategy as Strategy.Genetic.Engine).Evolve())
                          .Add("Player 5", (bestStrategy as Strategy.Genetic.Engine).Evolve())
                          .Add("Player 6", (runnerUpStrategy as Strategy.Genetic.Engine).Evolve())
                          .Build();
            }


            // Run the linear strategy against the best one found genetically
            var rootStrategy = new ChutesAndLadders.Strategy.Genetic.Engine("GeneticRoot");

            // rootStrategy.LoadLinearDNA();
            rootStrategy.LoadBestPathDNA();

            var finalStrategy = players.OrderByDescending(p => p.WinCount).First().Strategy as Strategy.Genetic.Engine;

            new SimulationCollectionBuilder()
            .AddPlayer("Player 1", finalStrategy)
            .AddPlayer("Player 2", finalStrategy)
            .AddPlayer("Player 3", finalStrategy)
            .AddPlayer("Player 4", rootStrategy)
            .AddPlayer("Player 5", rootStrategy)
            .AddPlayer("Player 6", rootStrategy)
            .MaxExecutionCount(simulationsPerGeneration)
            .OutputResults(true)
            .Run();

            Console.WriteLine($"{finalStrategy.Name} rules:");
            Console.WriteLine(finalStrategy.ContrastWith(rootStrategy));
        }