Exemple #1
0
        public static IMove ComputeSingleThreadedUCT(IGameState gameState, int itermax, bool verbose, Action<string> printfn, float uctk)
        {
            var rootNode = new SingleThreadedNode(null, null, gameState, uctk);

            for (var i = 0; i < itermax; i++)
            {
                INode node = rootNode;
                var state = gameState;

                // Select
                while (node.NodeIsFullyExpandedAndNonterminal)
                {
                    //if (verbose)
                    //{
                    //    printfn(node.DisplayUTC());
                    //}
                    node = node.UCTSelectChild();
                    state = node.Move.DoMove();
                }

                // Expand
                var result = node.GetRandomMoveOrIsFalse();
                if (result.Item1)
                {
                    var move = result.Item2;
                    state = move.DoMove();
                    Func<INode> constructor = () => new SingleThreadedNode(node, move, state, node.UCTK);
                    node = node.AddChild(constructor);
                }

                // Rollout
                state.PlayRandomlyUntilTheEnd();

                // Backpropagate
                while (node != null)
                {
                    node.Update(state.GetResult(node.PlayerJustMoved));
                    node = node.Parent;
                }
            }
            if (verbose)
            {
                //printfn(rootNode.DisplayTree(0));
                printfn(rootNode.DisplayMostVisistedChild());
            }

            return rootNode.MostVisitedMove();
        }
Exemple #2
0
        public static IMove ComputeSingleThreadedUCT(IGameState gameState, int itermax, bool verbose, Action <string> printfn, float uctk)
        {
            var rootNode = new SingleThreadedNode(null, null, gameState, uctk);

            for (var i = 0; i < itermax; i++)
            {
                INode node  = rootNode;
                var   state = gameState.Clone();

                // Select
                while (node.NodeIsFullyExpandedAndNonterminal)
                {
                    //if (verbose)
                    //{
                    //    printfn(node.DisplayUTC());
                    //}
                    node = node.UCTSelectChild();
                    state.DoMove(node.Move);
                }

                // Expand
                var result = node.GetRandomMoveOrIsFalse();
                if (result.Item1)
                {
                    var move = result.Item2;
                    state.DoMove(move);
                    Func <INode> constructor = () => new SingleThreadedNode(node, move, state, node.UCTK);
                    node = node.AddChild(constructor);
                }

                // Rollout
                state.PlayRandomlyUntilTheEnd();

                // Backpropagate
                while (node != null)
                {
                    node.Update(state.GetResult(node.PlayerJustMoved));
                    node = node.Parent;
                }
            }
            if (verbose)
            {
                //printfn(rootNode.DisplayTree(0));
                printfn(rootNode.DisplayMostVisistedChild());
            }

            return(rootNode.MostVisitedMove());
        }
Exemple #3
0
        public static IMove ComputeSingleThreadedUCT(IGameState gameState, bool verbose, Action <string> printfn, float uctk, int secs)
        {
            var      rootNode       = new SingleThreadedNode(null, null, gameState, uctk);
            DateTime time           = DateTime.Now;
            DateTime end            = time.AddSeconds(secs);
            bool     exitEarlyCheck = true;

            int i = 0;

            for (; time < end; i++)
            {
                time = DateTime.Now;

                INode node = rootNode;

                // Exit early if we're not learning anything --> Go straight to tiebreak/playout
                if (exitEarlyCheck && ((SingleThreadedNode)node).Childs.Count() >= ((SingleThreadedNode)node).numMoves)
                {
                    bool atLeastOneWin = false;
                    foreach (INode c in ((SingleThreadedNode)node).Childs)
                    {
                        if (c.Wins > 0)
                        {
                            atLeastOneWin = true;
                            break;
                        }
                    }
                    if (!atLeastOneWin)
                    {
                        Console.WriteLine("No Wins, Quit Early With this long left: " + (end - time).ToString());
                        break;
                    }
                    else
                    {
                        exitEarlyCheck = false;
                    }
                }

                var state = ((Level)gameState).Clone();

                // Select
                while (node.NodeIsFullyExpandedAndNonterminal)
                {
                    //if (verbose)
                    //{
                    //    printfn(node.DisplayUTC());
                    //}
                    node  = node.UCTSelectChild();
                    state = node.Move.DoMove(state);
                }

                // Expand
                var result = node.GetRandomMoveOrIsFalse();
                if (result.Item1)
                {
                    var move = result.Item2;
                    state = move.DoMove(state);
                    Func <INode> constructor = () => new SingleThreadedNode(node, move, state, node.UCTK);
                    node = node.AddChild(constructor);
                }

                // Rollout
                state.PlayRandomlyUntilTheEnd();

                // Backpropagate
                while (node != null)
                {
                    node.Update(state.GetResult(node.PlayerJustMoved));
                    node = node.Parent;
                }
            }
            Game1.world.level.IterationsPerTurn.Add(i);

            if (verbose)
            {
                //printfn(rootNode.DisplayTree(0));
                printfn(rootNode.DisplayMostVisistedChild());
            }

            //return rootNode.MostVisitedMove();
            return(rootNode.MostVisitedMoveTieBreakWithPlayoutHybrid());
        }