Beispiel #1
0
        static void CompareStrategies()
        {
            Random masterRandom = new NPack.MersenneTwister();
            Random random1      = new NPack.MersenneTwister();
            Random random2      = new NPack.MersenneTwister();


            Rules rules = new Rules {
                Decks = 8, MinBet = 100, MaxBet = 20000, Splits = 3
            };

            int    max_bet       = 5000;
            double pp_multiplier = 4.0;
            double ev_cutoff     = 0.0015;

            DiffStrategy b1 = new DiffStrategy(
                new SuperOptStrategy(max_bet, ev_cutoff, pp_multiplier),
                new OptStrategy(max_bet, ev_cutoff, pp_multiplier)
                );
            OptStrategy b2 = new OptStrategy(max_bet, ev_cutoff, pp_multiplier);

            Game game1 = new Game(rules, b1, pp_multiplier, random1);
            Game game2 = new Game(rules, b2, pp_multiplier, random2);

            int    runs          = 0;
            double expected      = 0;
            double expected_diff = 0;
            int    diff_count    = 0;

            while (true)
            {
                if (runs % 1000 == 0)
                {
                    double total1 = TotalMoney(game1);
                    double total2 = TotalMoney(game2);

                    Console.WriteLine();
                    Console.WriteLine("Runs:                {0}", runs);
                    Console.WriteLine("Expected total:      $ {0:0.00}", expected);
                    Console.WriteLine("SuperOpt total:      $ {1:0.00} ({2:0.00} c/hand)", b1.GetType(), total1, total1 * 100.0 / (double)runs);
                    Console.WriteLine("Opt total:           $ {1:0.00} ({2:0.00} c/hand)", b2.GetType(), total2, total2 * 100.0 / (double)runs);
                    Console.WriteLine("Different choices:   {0:0} ({1:0.00}%)", diff_count, 100.0 * diff_count / (double)runs);
                    Console.WriteLine("Difference:          $ {0:0.00}", total1 - total2);
                    Console.WriteLine("Expected difference: $ {0:0.00}", expected_diff);

                    TextWriter writer = new StreamWriter("compare.txt", true);

                    writer.WriteLine(string.Format("{0} {1} {2} {3}", runs, expected, TotalMoney(game1), TotalMoney(game2)));

                    writer.Close();
                }

                int seed = masterRandom.Next();

                game1.Random = new NPack.MersenneTwister(seed);
                game2.Random = new NPack.MersenneTwister(seed);

                game1.ResetShoe();
                game2.ResetShoe();

                int remove_count = masterRandom.Next(84);

                game1.RemoveCards(remove_count);
                game2.RemoveCards(remove_count);

                expected += b1.ShoeEV() * b1.Bet(game1) / 100.0;

                game1.StartRound();
                game2.StartRound();

                game1.DealRound();
                game2.DealRound();

                if (b1.IsDiff)
                {
                    expected_diff += game1.Bet * b1.Diff / 100.0;
                    diff_count++;
                    b1.IsDiff = false;
                }

                runs++;
            }
        }
Beispiel #2
0
        static void CompareStrategies()
        {
            Random masterRandom = new NPack.MersenneTwister();
            Random random1 = new NPack.MersenneTwister();
            Random random2 = new NPack.MersenneTwister();

            Rules rules = new Rules { Decks = 8, MinBet = 100, MaxBet = 20000, Splits = 3 };

            int max_bet = 5000;
            double pp_multiplier = 4.0;
            double ev_cutoff = 0.0015;

            DiffStrategy b1 = new DiffStrategy(
                new SuperOptStrategy(max_bet, ev_cutoff, pp_multiplier),
                new OptStrategy(max_bet, ev_cutoff, pp_multiplier)
                );
            OptStrategy b2 = new OptStrategy(max_bet, ev_cutoff, pp_multiplier);

            Game game1 = new Game(rules, b1, pp_multiplier, random1);
            Game game2 = new Game(rules, b2, pp_multiplier, random2);

            int runs = 0;
            double expected = 0;
            double expected_diff = 0;
            int diff_count = 0;

            while (true)
            {
                if (runs % 1000 == 0)
                {
                    double total1 = TotalMoney(game1);
                    double total2 = TotalMoney(game2);

                    Console.WriteLine();
                    Console.WriteLine("Runs:                {0}", runs);
                    Console.WriteLine("Expected total:      $ {0:0.00}", expected);
                    Console.WriteLine("SuperOpt total:      $ {1:0.00} ({2:0.00} c/hand)", b1.GetType(), total1, total1 * 100.0 / (double)runs);
                    Console.WriteLine("Opt total:           $ {1:0.00} ({2:0.00} c/hand)", b2.GetType(), total2, total2 * 100.0 / (double)runs);
                    Console.WriteLine("Different choices:   {0:0} ({1:0.00}%)", diff_count, 100.0 * diff_count / (double)runs);
                    Console.WriteLine("Difference:          $ {0:0.00}", total1 - total2);
                    Console.WriteLine("Expected difference: $ {0:0.00}", expected_diff);

                    TextWriter writer = new StreamWriter("compare.txt", true);

                    writer.WriteLine(string.Format("{0} {1} {2} {3}", runs, expected, TotalMoney(game1), TotalMoney(game2)));

                    writer.Close();
                }

                int seed = masterRandom.Next();

                game1.Random = new NPack.MersenneTwister(seed);
                game2.Random = new NPack.MersenneTwister(seed);

                game1.ResetShoe();
                game2.ResetShoe();

                int remove_count = masterRandom.Next(84);

                game1.RemoveCards(remove_count);
                game2.RemoveCards(remove_count);

                expected += b1.ShoeEV() * b1.Bet(game1) / 100.0;

                game1.StartRound();
                game2.StartRound();

                game1.DealRound();
                game2.DealRound();

                if (b1.IsDiff)
                {
                    expected_diff += game1.Bet * b1.Diff / 100.0;
                    diff_count++;
                    b1.IsDiff = false;
                }

                runs++;
            }
        }