public NNBasicStrategy(Net.Net net, double eps = .9, double lambda = .5) { this.net = net; this.eps = eps; this.lambda = .5; r = new Random(); }
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); }
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); }
/* * 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); }
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); }
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(); }
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); } } }
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); }
//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(); }
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; }
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(); } }
/* 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; }
//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(); }
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; }