public NNBasicStrategy(Net.Net net, double eps = .9, double lambda = .5)
 {
     this.net = net;
     this.eps = eps;
     this.lambda = .5;
     r = new Random();
 }
Exemple #2
0
        private static double NNsimpleBasicStrategy(Net.Net net, int numOfHands, double eps, ref Deck deck, bool isTraining = false)
        {
            int    totalHandsPlayed;
            double winLoss = 0.0; //-1 for loss, +1 for win. +1.5 for blackjack. 0 for draw

            //input, playersVal (17), dealersVal(10), playerHasAce(1)
            var policy = new NNBasicStrategy(net, eps);

            //do each hand
            for (totalHandsPlayed = 0; totalHandsPlayed < numOfHands; totalHandsPlayed++)
            {
                if (deck.isDeckFinished())
                {
                    deck = new Deck(6);
                    deck.shuffleCards();
                }
                Hand playerHand = new Hand();
                Hand dealerHand = new Hand();
                //deal initial cards
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());

                playHand(ref deck, playerHand, ref dealerHand, ref policy, ref winLoss, isTraining);
            }

            var x = winLoss / (1.0 * numOfHands);

            return(x);
        }
Exemple #3
0
 public NNBasicStrategy(Net.Net net, double eps = .9, double lambda = .5)
 {
     this.net    = net;
     this.eps    = eps;
     this.lambda = .5;
     r           = new Random();
 }
Exemple #4
0
        static private void trainCC(int numberOfHands, int testInterval)
        {
            Stream          stream    = File.Open("playingNet.xml", FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();

            Net.Net playingNet = null;
            playingNet = (Net.Net)formatter.Deserialize(stream);
            stream.Close();
            List <double> percs  = new List <double>();
            List <double> bas    = new List <double>();
            List <int>    runNum = new List <int>();

            int[] y = { 50 };

            var bettingNet = new Net.Net(13, y, 1);
            var eps        = .9;
            //train the counting.
            var countingTraining = 1000000;

            testInterval = 10000;
            Deck deck = new Deck(6);

            deck.shuffleCards();
            for (int i = 0; i < numberOfHands; i++)
            {
                if (i % testInterval == 0)
                {
                    var perc = NNCountingBasicStrategy(playingNet, bettingNet, 100000, 1.0, ref deck);

                    percs.Add(perc);
                    runNum.Add(i);
                    Console.WriteLine(i + ": " + perc);
                    //set learning rate to perc
                    NetCore.learningRate = -1.0f * (float)(perc / 2.0);
                    if (NetCore.learningRate < 0.0f)
                    {
                        NetCore.learningRate = .001f;
                    }
                    if (i < 200000)
                    {
                        NetCore.learningRate = .2f;
                    }
                    Console.WriteLine(NetCore.learningRate);
                    //showPolicy(net);
                }
                else
                {
                    NNCountingBasicStrategy(playingNet, bettingNet, 1, eps, ref deck, true);
                }
            }

            Stream          stream1    = File.Open("bettingNet.xml", FileMode.Create);
            BinaryFormatter formatter1 = new BinaryFormatter();

            formatter1.Serialize(stream1, bettingNet);
            stream.Close();
            writeSingleToFile(percs);
        }
Exemple #5
0
        /*
         * static private void showPolicy(Net.Net n)
         * {
         *  Console.Write("    ");
         *  var pol = new NNBasicStrategy(n, 1.0);
         *  for (int d = 2; d <= 11; d++)
         *  {
         *      Console.Write(d + " ");
         *  }
         *  Console.WriteLine();
         *  //Try each possible input and get the output.
         *  for (int p = 21; p >= 4; p--)
         *  {
         *      if(p >= 10)
         *          Console.Write(p + "  ");
         *      else
         *          Console.Write(p + "   ");
         *      for (int d = 2; d <= 11; d++)
         *      {
         *          Hand pH = new Hand();
         *          Hand dH = new Hand();
         *          pH.addCards(p);
         *          dH.addCards(d);
         *          //var a = pol.choosePlayerAction(pH, dH, deck);
         *          Console.Write(a + " ");
         *      }
         *      Console.WriteLine();
         *  }
         *
         *  //do for soft totals
         *  Console.WriteLine();
         *  Console.WriteLine("------ SOFTS ------");
         *
         *  for (int p = 2; p <= 9; p++)
         *  {
         *      Console.Write(p + "   ");
         *      for (int d = 2; d <= 11; d++)
         *      {
         *          Hand pH = new Hand();
         *          Hand dH = new Hand();
         *          pH.addCards(11);
         *          pH.addCards(p);
         *          dH.addCards(d);
         *         // var a = pol.choosePlayerAction(pH, dH);
         *          Console.Write(a + " ");
         *      }
         *      Console.WriteLine();
         *  }
         *
         * }
         */

        /*
         * private static double simpleBasicStrategy(int numOfHands)
         * {
         * var ret = new List<double>();
         * int totalHandsPlayed;
         * double winLoss = 0.0; //-1 for loss, +1 for win. +1.5 for blackjack. 0 for draw
         * var policy = new BasicStrategy();
         * //do each hand
         * Deck deck = new Deck(6);
         * deck.shuffleCards();
         * for (totalHandsPlayed = 0; totalHandsPlayed < numOfHands; totalHandsPlayed++)
         * {
         *  if (deck.isDeckFinished())
         *  {
         *      deck = new Deck(6);
         *      deck.shuffleCards();
         *  }
         *
         *  //decide bet
         *  var trueCount = deck.getTrueCount();
         *  var bet = 1.0;
         *  if (trueCount > 2)
         *      bet = 10.0;
         *
         *  Hand playerHand = new Hand();
         *  Hand dealerHand = new Hand();
         *  //deal initial cards
         *  playerHand.addCards(deck.getCard());
         *  dealerHand.addCards(deck.getCard());
         *  playerHand.addCards(deck.getCard());
         *  dealerHand.addCards(deck.getCard());
         *  playHandBasic(ref deck, playerHand, ref dealerHand, ref policy, ref winLoss, bet);
         * }
         * var x = winLoss / (numOfHands);
         * return x;
         * }
         */
        private static double ccBasicStrategy(Net.Net bettingNet, int numOfHands, double eps, ref Deck deck, bool isTraining = false)
        {
            int    totalHandsPlayed;
            double winLoss       = 0.0; //-1 for loss, +1 for win. +1.5 for blackjack. 0 for draw
            var    policy        = new BasicStrategy();
            var    bettingPolicy = new NNBettingStrategy(bettingNet, eps);

            //do each hand
            for (totalHandsPlayed = 0; totalHandsPlayed < numOfHands; totalHandsPlayed++)
            {
                if (deck.isDeckFinished())
                {
                    deck = new Deck(6);
                    deck.shuffleCards();
                }

                //figure out bet
                var bet         = 1.0f;
                var actionTaken = bettingPolicy.chooseBet(deck);

                if (actionTaken == 1)
                {
                    bet = 5.0f;
                }
                if (actionTaken == 2)
                {
                    bet = 10.0f;
                }

                Hand playerHand = new Hand();
                Hand dealerHand = new Hand();
                //deal initial cards
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());

                var winBefore = winLoss;
                var winAfter  = winLoss;
                var diff      = winAfter - winBefore;

                var reward = playHandBasic(ref deck, playerHand, ref dealerHand, ref policy, ref winLoss);
                reward = reward * bet;
                if (isTraining)
                {
                    bettingPolicy.runBackwards(reward, actionTaken);
                }

                diff     = (bet * diff) - diff;
                winLoss += diff;
            }
            var x = winLoss / (numOfHands);

            return(x);
        }
Exemple #6
0
        private static double NNCountingBasicStrategy(Net.Net playingNet, Net.Net bettingNet, int numOfHands, double eps, ref Deck deck, bool isTraining = false)
        {
            int    totalHandsPlayed;
            double winLoss = 0.0; //-1 for loss, +1 for win. +1.5 for blackjack. 0 for draw

            //input, playersVal (17), dealersVal(10), playerHasAce(1)
            var playingPolicy = new NNBasicStrategy(playingNet, 1.0);//fixed policy for playing
            var bettingPolicy = new NNBettingStrategy(bettingNet, eps);

            //do each hand
            for (totalHandsPlayed = 0; totalHandsPlayed < numOfHands; totalHandsPlayed++)
            {
                //figure out bet
                var bet         = 1.0f;
                var actionTaken = bettingPolicy.chooseBet(deck);

                if (actionTaken == 1)
                {
                    bet = 5.0f;
                }
                if (actionTaken == 2)
                {
                    bet = 10.0f;
                }

                if (deck.isDeckFinished())
                {
                    deck = new Deck(6);
                    deck.shuffleCards();
                }
                Hand playerHand = new Hand();
                Hand dealerHand = new Hand();
                //deal initial cards
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());

                var reward = playHand(ref deck, playerHand, ref dealerHand, ref playingPolicy, ref winLoss, isTraining);
                reward = reward * bet;
                bettingPolicy.runBackwards(reward, actionTaken);
            }

            var x = winLoss / (1.0 * numOfHands);

            return(x);
        }
Exemple #7
0
        static private void trainCCWithBasic(int numberOfHands, int testInterval)
        {
            List <double> percs  = new List <double>();
            List <double> bas    = new List <double>();
            List <int>    runNum = new List <int>();

            int[] y = { 50 };

            var bettingNet = new Net.Net(13, y, 1);
            var eps        = .9;
            //train the counting.
            var countingTraining = 1000000;

            testInterval = 10000;
            Deck deck = new Deck(6);

            deck.shuffleCards();
            for (int i = 0; i < numberOfHands; i++)
            {
                if (i % testInterval == 0)
                {
                    var perc = ccBasicStrategy(bettingNet, 100000, 1.0, ref deck);

                    percs.Add(perc);
                    runNum.Add(i);
                    Console.WriteLine(i + ": " + perc);
                    //set learning rate to perc
                    NetCore.learningRate = -1.0f * (float)(perc / 2.0);
                    if (NetCore.learningRate < 0.0f)
                    {
                        NetCore.learningRate = .001f;
                    }
                    if (i < 200000)
                    {
                        NetCore.learningRate = .2f;
                    }
                    Console.WriteLine(NetCore.learningRate);
                    //showPolicy(net);
                }
                else
                {
                    ccBasicStrategy(bettingNet, 1, eps, ref deck, true);
                }
            }
        }
 public NNBettingStrategy(Net.Net bettingNet, double eps)
 {
     net = bettingNet;
     this.eps = eps;
     r = new Random();
 }
Exemple #9
0
        private static void trainCCWithBasic(int numberOfHands, int testInterval)
        {
            List<double> percs = new List<double>();
            List<double> bas = new List<double>();
            List<int> runNum = new List<int>();
            int[] y = { 50 };

            var bettingNet = new Net.Net(13, y, 1);
            var eps = .9;
            //train the counting.
            var countingTraining = 1000000;
            testInterval = 10000;
            Deck deck = new Deck(6);
            deck.shuffleCards();
            for (int i = 0; i < numberOfHands; i++)
            {
                if (i % testInterval == 0)
                {
                    var perc = ccBasicStrategy(bettingNet, 100000, 1.0, ref deck);

                    percs.Add(perc);
                    runNum.Add(i);
                    Console.WriteLine(i + ": " + perc);
                    //set learning rate to perc
                    NetCore.learningRate = -1.0f * (float)(perc / 2.0);
                    if (NetCore.learningRate < 0.0f)
                        NetCore.learningRate = .001f;
                    if (i < 200000)
                        NetCore.learningRate = .2f;
                    Console.WriteLine(NetCore.learningRate);
                    //showPolicy(net);
                }
                else
                {
                    ccBasicStrategy(bettingNet, 1, eps, ref deck, true);
                }
            }
        }
Exemple #10
0
        private static void trainCC(int numberOfHands, int testInterval)
        {
            Stream stream = File.Open("playingNet.xml", FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();
            Net.Net playingNet = null;
            playingNet = (Net.Net)formatter.Deserialize(stream);
            stream.Close();
            List<double> percs = new List<double>();
            List<double> bas = new List<double>();
            List<int> runNum = new List<int>();
            int[] y = { 50 };

            var bettingNet = new Net.Net(13, y, 1);
            var eps = .9;
            //train the counting.
            var countingTraining = 1000000;
            testInterval = 10000;
            Deck deck = new Deck(6);
            deck.shuffleCards();
            for (int i = 0; i < numberOfHands; i++)
            {
                if (i % testInterval == 0)
                {
                    var perc = NNCountingBasicStrategy(playingNet, bettingNet, 100000, 1.0, ref deck);

                    percs.Add(perc);
                    runNum.Add(i);
                    Console.WriteLine(i + ": " + perc);
                    //set learning rate to perc
                    NetCore.learningRate = -1.0f * (float)(perc / 2.0);
                    if (NetCore.learningRate < 0.0f)
                        NetCore.learningRate = .001f;
                    if (i < 200000)
                        NetCore.learningRate = .2f;
                    Console.WriteLine(NetCore.learningRate);
                    //showPolicy(net);
                }
                else
                {
                    NNCountingBasicStrategy(playingNet, bettingNet, 1, eps, ref deck, true);
                }
            }

            Stream stream1 = File.Open("bettingNet.xml", FileMode.Create);
            BinaryFormatter formatter1 = new BinaryFormatter();
            formatter1.Serialize(stream1, bettingNet);
            stream.Close();
            writeSingleToFile(percs);
        }
Exemple #11
0
        //test with only hit and stand actions
        private static void simpleBlackjack(int numberOfHands, int testInterval)
        {
            int[] x = { 150 };
            int[] y = { 50 };
            List<double> percs = new List<double>();
            List<double> bas = new List<double>();
            List<int> runNum = new List<int>();
            //+9 card coupts
            //input, playersVal (17), dealersVal(10), playerHasAce(1), doubleFlag(1), spltFlag(1), actions(4)
            //var net = new Net.Net(32, x, 1);
            var playingNet = new Net.Net(41, x, 1);
            //9 card counds, 1 decks left, 3 actions (low, med, high)
            var bettingNet = new Net.Net(13, y, 1);
            Random r = new Random();
            var eps = .7;
            //showPolicy(net);
            Deck deck = new Deck(6);
            deck.shuffleCards();

            for (int i = 0; i < numberOfHands; i++)
            {
                if (i % testInterval == 0)
                {
                    var perc = NNsimpleBasicStrategy(playingNet, 100000, 1.0, ref deck);
                    //var bs = simpleBasicStrategy(100000);

                    percs.Add(perc);
                    //bas.Add(bs);
                    runNum.Add(i);
                    Console.WriteLine(i + ": " + perc);
                    //set learning rate to perc
                    NetCore.learningRate = -1.0f * (float)(perc);
                    if (NetCore.learningRate < 0.0f)
                        NetCore.learningRate = .001f;
                    if (i < 1000000)
                        NetCore.learningRate = .2f;
                    Console.WriteLine(NetCore.learningRate);
                    //showPolicy(net);
                }
                else
                {
                    NNsimpleBasicStrategy(playingNet, 1, eps, ref deck, true);
                }

                //if(i % 100000 == 0)
                //showPolicy(net);

            }

            writeToFile(runNum, percs, bas);

            //save training net
            //Opens a file and serializes the object into it in binary format.
            Stream stream = File.Open("playingNet.xml", FileMode.Create);
            BinaryFormatter formatter = new BinaryFormatter();

            formatter.Serialize(stream, playingNet);
            stream.Close();
        }
Exemple #12
0
        private static double NNsimpleBasicStrategy(Net.Net net, int numOfHands, double eps, ref Deck deck, bool isTraining = false)
        {
            int totalHandsPlayed;
            double winLoss = 0.0; //-1 for loss, +1 for win. +1.5 for blackjack. 0 for draw

            //input, playersVal (17), dealersVal(10), playerHasAce(1)
            var policy = new NNBasicStrategy(net, eps);

            //do each hand
            for (totalHandsPlayed = 0; totalHandsPlayed < numOfHands; totalHandsPlayed++)
            {
                if (deck.isDeckFinished())
                {
                    deck = new Deck(6);
                    deck.shuffleCards();
                }
                Hand playerHand = new Hand();
                Hand dealerHand = new Hand();
                //deal initial cards
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());

                playHand(ref deck, playerHand, ref dealerHand, ref policy, ref winLoss, isTraining);
            }

            var x = winLoss / (1.0 * numOfHands);
            return x;
        }
Exemple #13
0
        private static void commandLineBJ()
        {
            Stream          stream    = File.Open("playingNet.xml", FileMode.Open);
            BinaryFormatter formatter = new BinaryFormatter();

            Net.Net playingNet = null;
            playingNet = (Net.Net)formatter.Deserialize(stream);
            stream.Close();

            /*
             * Stream stream1 = File.Open("bettingNet.xml", FileMode.Open);
             * BinaryFormatter formatter1 = new BinaryFormatter();
             * Net.Net bettingNet = null;
             * bettingNet = (Net.Net)formatter1.Deserialize(stream1);
             * stream1.Close();
             */
            Random r = new Random();

            var playingPolicy = new NNBasicStrategy(playingNet, 1.0);//fixed policy for playing
            //var bettingPolicy = new NNBettingStrategy(bettingNet, eps);
            Deck deck = new Deck(6);

            deck.shuffleCards();
            bool exit = false;

            while (!exit)
            {
                if (deck.isDeckFinished())
                {
                    deck = new Deck(6);
                    deck.shuffleCards();
                }

                Hand playerHand = new Hand();
                Hand dealerHand = new Hand();
                //deal initial cards
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());
                bool handFinished = false;
                while (!handFinished)
                {
                    Console.WriteLine("Enter Q to quit");
                    Console.WriteLine();
                    Console.WriteLine();
                    Console.WriteLine("PLAYER HAND:    " + playerHand.handToString());
                    Console.WriteLine("DEALER SHOWING: " + dealerHand.getDealerShowing());
                    Console.WriteLine("Q Values: ");
                    var qVals  = playingPolicy.getQScores(playerHand, dealerHand, deck);
                    var action = playingPolicy.choosePlayerAction(playerHand, dealerHand, deck);
                    foreach (var q in qVals)
                    {
                        Console.Write("  " + q);
                    }
                    if (action != 3)
                    {
                        var x = (float)(-1 * r.NextDouble());
                        Console.Write("  " + x);
                    }
                    else
                    {
                        var x = (float)(r.NextDouble());
                        while (x < .5f)
                        {
                            x = (float)(r.NextDouble());
                        }
                        Console.Write("  " + x);
                    }
                    Console.WriteLine();
                    Console.WriteLine("Choose action (0 = stay, 1 = hit, 2 = double, 3 = split)");
                    var line = Console.ReadLine();
                    if (line.Equals("Q") || line.Equals("q"))
                    {
                        exit = true;
                        continue;
                    }

                    var act = Int32.Parse(line);
                    if (act == 0) //stand
                    {
                        handFinished = true;
                    }
                    else if (act == 1) //hit
                    {
                        playerHand.addCards(deck.getCard());
                        if (playerHand.getValue() > 21)
                        {
                            handFinished = true;
                        }
                    }
                    else if (act == 2) //double
                    {
                        playerHand.addCards(deck.getCard());
                        handFinished = true;
                    }
                    else
                    {
                        Console.WriteLine("Split doesnt work with the command line interface right now");
                    }
                }

                if (playerHand.getValue() > 21)
                {
                    Console.WriteLine("LOST -- WE BUSTED");
                    continue;
                }

                //play dealer
                var dealerVal = playDealer(ref deck, ref dealerHand);

                Console.WriteLine("PLAYER HAND: " + playerHand.handToString());
                Console.WriteLine("DEALER HAND: " + dealerHand.handToString());

                if (dealerVal > 21) //dealer busts
                {
                    Console.WriteLine("WINNER -- DEALER BUSTED");
                }
                else if (dealerVal < playerHand.getValue()) //we beat dealer
                {
                    Console.WriteLine("WINNER");
                }
                else if (dealerVal == playerHand.getValue()) //draw
                {
                    Console.WriteLine("DRAW");
                }
                else //we lost to dealer
                {
                    Console.WriteLine("YOU LOST");
                }
                Console.WriteLine();
                Console.WriteLine();
                Console.WriteLine("ENTER TO CONTINUE");
                Console.ReadLine();
            }
        }
Exemple #14
0
        /*
        static private void showPolicy(Net.Net n)
        {
            Console.Write("    ");
            var pol = new NNBasicStrategy(n, 1.0);
            for (int d = 2; d <= 11; d++)
            {
                Console.Write(d + " ");
            }
            Console.WriteLine();
            //Try each possible input and get the output.
            for (int p = 21; p >= 4; p--)
            {
                if(p >= 10)
                    Console.Write(p + "  ");
                else
                    Console.Write(p + "   ");
                for (int d = 2; d <= 11; d++)
                {
                    Hand pH = new Hand();
                    Hand dH = new Hand();
                    pH.addCards(p);
                    dH.addCards(d);
                    //var a = pol.choosePlayerAction(pH, dH, deck);
                    Console.Write(a + " ");
                }
                Console.WriteLine();
            }

            //do for soft totals
            Console.WriteLine();
            Console.WriteLine("------ SOFTS ------");

            for (int p = 2; p <= 9; p++)
            {
                Console.Write(p + "   ");
                for (int d = 2; d <= 11; d++)
                {
                    Hand pH = new Hand();
                    Hand dH = new Hand();
                    pH.addCards(11);
                    pH.addCards(p);
                    dH.addCards(d);
                   // var a = pol.choosePlayerAction(pH, dH);
                    Console.Write(a + " ");
                }
                Console.WriteLine();
            }

        }
        */
        /*
        private static double simpleBasicStrategy(int numOfHands)
        {
            var ret = new List<double>();
            int totalHandsPlayed;
            double winLoss = 0.0; //-1 for loss, +1 for win. +1.5 for blackjack. 0 for draw
            var policy = new BasicStrategy();
            //do each hand
            Deck deck = new Deck(6);
            deck.shuffleCards();
            for (totalHandsPlayed = 0; totalHandsPlayed < numOfHands; totalHandsPlayed++)
            {
                if (deck.isDeckFinished())
                {
                    deck = new Deck(6);
                    deck.shuffleCards();
                }

                //decide bet
                var trueCount = deck.getTrueCount();
                var bet = 1.0;
                if (trueCount > 2)
                    bet = 10.0;

                Hand playerHand = new Hand();
                Hand dealerHand = new Hand();
                //deal initial cards
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());
                playHandBasic(ref deck, playerHand, ref dealerHand, ref policy, ref winLoss, bet);
            }
            var x = winLoss / (numOfHands);
            return x;
        }
        */
        private static double ccBasicStrategy(Net.Net bettingNet, int numOfHands, double eps, ref Deck deck, bool isTraining = false)
        {
            int totalHandsPlayed;
            double winLoss = 0.0; //-1 for loss, +1 for win. +1.5 for blackjack. 0 for draw
            var policy = new BasicStrategy();
            var bettingPolicy = new NNBettingStrategy(bettingNet, eps);
            //do each hand
            for (totalHandsPlayed = 0; totalHandsPlayed < numOfHands; totalHandsPlayed++)
            {
                if (deck.isDeckFinished())
                {
                    deck = new Deck(6);
                    deck.shuffleCards();
                }

                //figure out bet
                var bet = 1.0f;
                var actionTaken = bettingPolicy.chooseBet(deck);

                if (actionTaken == 1)
                    bet = 5.0f;
                if (actionTaken == 2)
                    bet = 10.0f;

                Hand playerHand = new Hand();
                Hand dealerHand = new Hand();
                //deal initial cards
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());

                var winBefore = winLoss;
                var winAfter = winLoss;
                var diff = winAfter - winBefore;

                var reward = playHandBasic(ref deck, playerHand, ref dealerHand, ref policy, ref winLoss);
                reward = reward * bet;
                if(isTraining )
                    bettingPolicy.runBackwards(reward, actionTaken);

                diff = (bet * diff) - diff;
                winLoss += diff;
            }
            var x = winLoss / (numOfHands);
            return x;
        }
Exemple #15
0
        //test with only hit and stand actions
        static private void simpleBlackjack(int numberOfHands, int testInterval)
        {
            int[]         x      = { 150 };
            int[]         y      = { 50 };
            List <double> percs  = new List <double>();
            List <double> bas    = new List <double>();
            List <int>    runNum = new List <int>();
            //+9 card coupts
            //input, playersVal (17), dealersVal(10), playerHasAce(1), doubleFlag(1), spltFlag(1), actions(4)
            //var net = new Net.Net(32, x, 1);
            var playingNet = new Net.Net(41, x, 1);
            //9 card counds, 1 decks left, 3 actions (low, med, high)
            var    bettingNet = new Net.Net(13, y, 1);
            Random r          = new Random();
            var    eps        = .7;
            //showPolicy(net);
            Deck deck = new Deck(6);

            deck.shuffleCards();


            for (int i = 0; i < numberOfHands; i++)
            {
                if (i % testInterval == 0)
                {
                    var perc = NNsimpleBasicStrategy(playingNet, 100000, 1.0, ref deck);
                    //var bs = simpleBasicStrategy(100000);

                    percs.Add(perc);
                    //bas.Add(bs);
                    runNum.Add(i);
                    Console.WriteLine(i + ": " + perc);
                    //set learning rate to perc
                    NetCore.learningRate = -1.0f * (float)(perc);
                    if (NetCore.learningRate < 0.0f)
                    {
                        NetCore.learningRate = .001f;
                    }
                    if (i < 1000000)
                    {
                        NetCore.learningRate = .2f;
                    }
                    Console.WriteLine(NetCore.learningRate);
                    //showPolicy(net);
                }
                else
                {
                    NNsimpleBasicStrategy(playingNet, 1, eps, ref deck, true);
                }

                //if(i % 100000 == 0)
                //showPolicy(net);
            }

            writeToFile(runNum, percs, bas);

            //save training net
            //Opens a file and serializes the object into it in binary format.
            Stream          stream    = File.Open("playingNet.xml", FileMode.Create);
            BinaryFormatter formatter = new BinaryFormatter();

            formatter.Serialize(stream, playingNet);
            stream.Close();
        }
Exemple #16
0
 public NNBettingStrategy(Net.Net bettingNet, double eps)
 {
     net      = bettingNet;
     this.eps = eps;
     r        = new Random();
 }
Exemple #17
0
        private static double NNCountingBasicStrategy(Net.Net playingNet, Net.Net bettingNet, int numOfHands, double eps, ref Deck deck, bool isTraining = false)
        {
            int totalHandsPlayed;
            double winLoss = 0.0; //-1 for loss, +1 for win. +1.5 for blackjack. 0 for draw

            //input, playersVal (17), dealersVal(10), playerHasAce(1)
            var playingPolicy = new NNBasicStrategy(playingNet, 1.0);//fixed policy for playing
            var bettingPolicy = new NNBettingStrategy(bettingNet, eps);
            //do each hand
            for (totalHandsPlayed = 0; totalHandsPlayed < numOfHands; totalHandsPlayed++)
            {
                //figure out bet
                var bet = 1.0f;
                var actionTaken = bettingPolicy.chooseBet(deck);

                if (actionTaken == 1)
                    bet = 5.0f;
                if (actionTaken == 2)
                    bet = 10.0f;

                if (deck.isDeckFinished())
                {
                    deck = new Deck(6);
                    deck.shuffleCards();
                }
                Hand playerHand = new Hand();
                Hand dealerHand = new Hand();
                //deal initial cards
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());
                playerHand.addCards(deck.getCard());
                dealerHand.addCards(deck.getCard());

                var reward = playHand(ref deck, playerHand, ref dealerHand, ref playingPolicy, ref winLoss, isTraining);
                reward = reward * bet;
                bettingPolicy.runBackwards(reward, actionTaken);
            }

            var x = winLoss / (1.0 * numOfHands);
            return x;
        }