Example #1
0
        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);
        }
Example #2
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("=====================");
            }
        }
Example #4
0
        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);
        }
Example #6
0
        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);
            }
        }
Example #7
0
        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();
            }
        }