// public void MCTS(int playerTurn, SkyNetNode prevNode){ // IBoard board = localGame.getBoard(); // int ind = 0; // bool expanding = true; // while(expanding){ // // string[][] bString = localGame.getBoardAsString (board, playerTurn); // string bHash = hashAndSlasher.HashIt (bString); // // List<GameMove> availMoves = localGame.getAllPlayerMoves (board, playerTurn); // // if (!shortTermMemory.ContainsKey (bHash)) { // shortTermMemory.Add (bHash, new List<SkyNetNode> ()); // } // // List<SkyNetNode> movesInMem = shortTermMemory[bHash]; // GameMove selected = availMoves [ind]; // SkyNetNode selectAsNode = new SkyNetNode (selected, prevNode, playerTurn, false); // int memInd = movesInMem.IndexOf (selectAsNode); // if (memInd != -1) { // We've done this move from this state before // selectAsNode = movesInMem[memInd]; // selectAsNode.prevNode = prevNode; // } else { // movesInMem.Add (selectAsNode); // } // selectAsNode.incVisit (); // // board = mockMove (board, selectAsNode); // if (!CheckTerminalNode (board)) { // // } else { // expanding = false; // backpropWin (selectAsNode); // } // } // } private void MCTSExpand(SkyNetNode curNode) { Console.WriteLine("ENTERING MCTS EXPANSION"); bool playerOne = !curNode.playerOne; List <GameMove> availMoves = localGame.getAllPlayerMoves(localBoard, playerOne); int cnt = availMoves.Count; string hash = hashAndSlasher.HashIt(localGame.getBoardAsString(localBoard, playerOne)); bool curBoardTerminal = CheckTerminalNode(localBoard); if (cnt > 0 && !curBoardTerminal) { curNode.children = new List <SkyNetNode>(); for (int i = 0; i < cnt; i++) { curNode.children.Add(new SkyNetNode(availMoves [i], curNode, playerOne, hash)); Console.WriteLine(String.Format("Added new Child Node at Index: {1}{2}", i.ToString(), curNode.children[i].ToString())); } } else { Console.WriteLine(String.Format("Found Terminal Node {1}", curNode.ToString())); curNode.setTerminalFlag(true); } Console.WriteLine("EXITING MCTS EXPANSION"); }
public MCTSkyNet(IGame game, bool playerOne) { hashAndSlasher = ZobristKiller.GetTheKiller(); shortTermMemory = new Dictionary <string, List <SkyNetNode> > (); localBoard = game.getBoard(); localBString = game.getBoardAsString(localBoard, playerOne); rootNode = new SkyNetNode(hashAndSlasher.HashIt(localBString), playerOne); }