public override double rollOut() { this.s = 0; DeterministicNode tmp = new DeterministicNode(this.board.getBoardState(), null, Constant.NONE, Constant.NONE); while (tmp.board.isEnd() == END_STATE.CONTINUE) { this.s += 1; CESPFMove tmpMove = tmp.board.CESPF(); if (tmpMove.isFlippingAction()) { tmp.board.flip(tmpMove.move.from.row, tmpMove.move.from.column); } else { tmp.board.move(tmpMove.move.from.row, tmpMove.move.from.column, tmpMove.move.to.row, tmpMove.move.to.column); } } END_STATE end = tmp.board.isEnd(); if (end == END_STATE.DRAW) { return(0.5); } else if (DeterministicNode.side == (int)end) { return(1); } return(0); }
static void testNMCTS() { Board a = new Board(); a.flip(0, 0); SimpleTP.DeterministicNode.side = a.sideToMove; SimpleTP.DeterministicNode b = new SimpleTP.DeterministicNode(a.getBoardState(), null, Constant.NONE, Constant.NONE); double x = 0; Stopwatch timer = new Stopwatch(); timer.Start(); for (int i = 0; i < 200; i++) { b.selectAction(); //Console.WriteLine(i); //b.rollOut(b); //x += SimpleTP.Node.s; //Console.WriteLine(i); } timer.Stop(); Console.WriteLine(b.nVisits); Console.WriteLine(x); Console.WriteLine(timer.Elapsed.Seconds); //b.rollOut(b); //Console.WriteLine(Node.s); }
public void setPGLValue() { if (base.isShowConsole) { openConsole(); } DeterministicNode tmpNode = new DeterministicNode(this.board.getBoardState(), null, Constant.NONE, Constant.NONE); DeterministicNode.side = this.sideToMove; double x = 0; if (base.isShowConsole) { Console.WriteLine("\nSET PGL VALUE : 500 Kali"); } for (int i = 0; i < 500; i++) { tmpNode.rollOut(); x += tmpNode.s; } Node.PGL = x / 500; if (base.isShowConsole) { Console.WriteLine("SELESAI SET PGL VALUE"); Console.WriteLine("====================="); } }
public override void expand() { int actionLength = this.board.getCountActions(); if (actionLength != 0) { children = new Node[actionLength]; List <Actions> tmp = this.board.getActions(); int index = 0; for (int i = 0; i < tmp.Count; i++) { if (tmp[i].action == ACTION.MOVE) { DeterministicActions action = (DeterministicActions)tmp[i]; int length = action.to.Count; for (int x = 0; x < length; x++) { BoardState tmpBoardState = this.board.getBoardState(); this.board.move(action.from.row, action.from.column, action.to[x].row, action.to[x].column); children[index] = new DeterministicNode(this.board.getBoardState(), new Move(action.from, action.to[x]), Constant.NONE, Constant.NONE); this.board.restoreBoardState(tmpBoardState); index++; } } else { NondeterministicActions action = (NondeterministicActions)tmp[i]; NondeterministicNode tmpNode = new NondeterministicNode(action.probability, new Move(action.position, action.position)); tmpNode.children = new DeterministicNode[action.probability.Count]; for (int x = 0; x < action.piece.Count; x++) { BoardState tmpBoardState = this.board.getBoardState(); Position tmpPosition = this.board.getFlippedPositionByPiece(action.piece[x]); //temukan real position this.board.switchFlippedPieceByPosition(tmpPosition.row, tmpPosition.column, action.position.row, action.position.column); //pindahkan dari real position ke position yang diinginkan this.board.flip(action.position.row, action.position.column); //buka piece tmpNode.children[x] = new DeterministicNode(this.board.getBoardState(), new Move(action.position, action.position), action.piece[x], action.probability[x]); this.board.restoreBoardState(tmpBoardState); } children[index] = tmpNode; index++; } } } }
public Node startNMCTS() { if (base.isShowConsole) { openConsole(); } timer.Start(); tree = new DeterministicNode(this.board.getBoardState(), null, Constant.NONE, Constant.NONE); tree.expand(); tree.updateStatus(tree.rollOut(), tree.s); taskQueue jlhParallelThread = new taskQueue(base.jlhParallel); Task <DeterministicNode> searchTree = null; for (int i = 0; i < base.jlhParallel; i++) { searchTree = jlhParallelThread.enqueueReturn(move); } //sum winrate nondeterministic node for (int j = 0; j < searchTree.Result.children.Length; j++) { if (searchTree.Result.children[j] is NondeterministicNode) { ((NondeterministicNode)searchTree.Result.children[j]).sumWinRate(); } } DeterministicNode result = searchTree.Result; Node maxWinRate = result.children[0]; for (int i = 1; i < result.children.Length; i++) { if (maxWinRate.winRate <= result.children[i].winRate) { maxWinRate = result.children[i]; } } jlhParallelThread.Dispose(); return(maxWinRate); }
static void testParallelSSAB() { for (int xy = 0; xy < 1; xy++) { Console.WriteLine(xy + " uuuuuu"); time = new Stopwatch(); time.Start(); Board board = new Board(); board.flip(0, 0); SimpleTP.DeterministicNode.side = board.sideToMove; SimpleTP.DeterministicNode b = new SimpleTP.DeterministicNode(board.getBoardState(), null, Constant.NONE, Constant.NONE); double x = 0; int u = 0; List <SimpleTP.Node> visited = new List <SimpleTP.Node>(); SimpleTP.Node cur = b; visited.Add(cur); cur.expand(); //cur.updateStatus(cur.rollOut(cur)); object a = new object(); ParallelOptions po = new ParallelOptions(); po.MaxDegreeOfParallelism = 2; List <string> threadid = new List <string>(); Parallel.For(0, 2000, po, i => { u++; Console.WriteLine(u); b.selectAction(); } ); time.Stop(); SimpleTP.Node.PGL = x / 500; Console.WriteLine("PGL:" + SimpleTP.Node.PGL); Console.WriteLine(time.Elapsed.TotalSeconds); } }
static void consoleTesting() { Board logicalCDC = new Board(); logicalCDC.flip(3, 3); //DeterministicNode.side = logicalCDC.sideToMove; Console.WriteLine("\nsidetoMove : " + logicalCDC.sideToMove); logicalCDC.flip(3, 4); while (logicalCDC.isEnd() == END_STATE.CONTINUE) { Console.WriteLine("\nsidetoMove : " + logicalCDC.sideToMove); SimpleTP.DeterministicNode a = new SimpleTP.DeterministicNode(logicalCDC.getBoardState(), null, Constant.NONE, Constant.NONE); //double x = 0; //for (int i = 0; i < 500; i++) //{ // a.selectAction(); // x += Node.s; // //Console.WriteLine(Node.s); //} //Node.PGL = x / 500; SimpleTP.Node.PGL = 0; Console.WriteLine("Mulai"); SimpleTP.DeterministicNode b = new SimpleTP.DeterministicNode(logicalCDC.getBoardState(), null, Constant.NONE, Constant.NONE); for (int i = 0; i < 5000; i++) { b.selectAction(); Console.WriteLine(i); } Console.WriteLine("End"); SimpleTP.Node maxWinRate = b.children[0]; Console.WriteLine("0" + " , " + b.children[0].winRate + " , " + b.children[0].nVisits + " , " + b.children[0].action.from.ToString() + b.children[0].action.to.ToString()); for (int i = 1; i < b.children.Length; i++) { Console.WriteLine(i + " , " + b.children[i].winRate + " , " + b.children[i].nVisits + " , " + b.children[i].action.from.ToString() + b.children[i].action.to.ToString()); if (maxWinRate.winRate <= b.children[i].winRate) { maxWinRate = b.children[i]; } } if (maxWinRate.action.from.row == maxWinRate.action.to.row && maxWinRate.action.from.column == maxWinRate.action.to.column) { Console.WriteLine("Flip"); Console.WriteLine("Posisi " + maxWinRate.action.from.ToString()); Console.WriteLine("Sebelum"); logicalCDC.printArrayStateFlip(); logicalCDC.flip(maxWinRate.action.from.row, maxWinRate.action.from.column); } else { Console.WriteLine("move"); Console.WriteLine("From " + maxWinRate.action.from.ToString()); Console.WriteLine("to " + maxWinRate.action.to.ToString()); Console.WriteLine("Sebelum"); logicalCDC.printArrayStateFlip(); logicalCDC.move(maxWinRate.action.from.row, maxWinRate.action.from.column, maxWinRate.action.to.row, maxWinRate.action.to.column); } Console.WriteLine("Sesudah"); logicalCDC.printArrayStateFlip(); Console.WriteLine("\nsidetoMove : " + logicalCDC.sideToMove); Console.WriteLine("Input Move (0,4,1,0) : "); string move = Console.ReadLine(); string[] mymove = move.Split(','); if (mymove.Length == 2) { Console.WriteLine("Sebelum"); logicalCDC.printArrayStateFlip(); logicalCDC.flip(Convert.ToInt16(mymove[0]), Convert.ToInt16(mymove[1])); } else { Console.WriteLine("Sebelum"); logicalCDC.printArrayStateFlip(); logicalCDC.move(Convert.ToInt16(mymove[0]), Convert.ToInt16(mymove[1]), Convert.ToInt16(mymove[2]), Convert.ToInt16(mymove[3])); } Console.WriteLine("Sesudah"); logicalCDC.printArrayStateFlip(); Console.WriteLine("Tekan Sembarangan key untuk lanjut"); Console.ReadKey(); System.GC.Collect(); } }