Beispiel #1
0
        public void NodeActionComputeTest()
        {
            var game = new GameInstance(3);

            var ability   = new AbilityInfo(3, 1, 1, 0);
            var abilityId = game.AddAbilityWithInfo(ability);

            var abilities1 = new List <int>();
            var abilities2 = new List <int> {
                abilityId
            };

            var info1 = new MobInfo(TeamColor.Red, 5, 1, 0, abilities1);
            var info2 = new MobInfo(TeamColor.Blue, 5, 1, 1, abilities2);

            var m1 = game.AddMobWithInfo(info1);
            var m2 = game.AddMobWithInfo(info2);

            game.PlaceMob(m1, new AxialCoord(1, 1));
            game.PlaceMob(m2, new AxialCoord(-1, -1));

            game.PrepareEverything();

            Assert.IsTrue(game.CurrentMob.HasValue);
            Assert.AreEqual(m1, game.CurrentMob.Value);

            var firstNode = new UctNode(0, 0, UctAction.NullAction(), game);

            firstNode.PrecomputePossibleActions(true, true);

            Assert.AreEqual(3, firstNode.PossibleActions.Count);
        }
Beispiel #2
0
        private static void PrintDotNode(StringBuilder builder, UctNode parent, UctNode node, int budget)
        {
            if (budget == 0)
            {
                return;
            }
            //if (node.N < 8) return;

            string color;
            var    teamColor = node.State.CurrentTeam;

            if (teamColor.HasValue)
            {
                if (node.Action.Type == UctActionType.EndTurn)
                {
                    var lastTeamColor = node.State.State.LastTeamColor;

                    if (lastTeamColor == teamColor)
                    {
                        color = teamColor.Value == TeamColor.Red ? "pink" : "lightblue";
                    }
                    else
                    {
                        color = teamColor.Value == TeamColor.Red ? "lightblue" : "pink";
                    }
                }
                else
                {
                    color = teamColor.Value == TeamColor.Red ? "pink" : "lightblue";
                }
            }
            else
            {
                color = "yellow";
            }

            builder.AppendLine($"\"{node}\" [fillcolor = {color}, style=filled]");

            if (parent != null)
            {
                builder.AppendLine($"\"{parent}\" -> \"{node}\"");
            }

            foreach (var child in node.Children)
            {
                PrintDotNode(builder, node, child, budget - 1);
            }
        }
Beispiel #3
0
        public static void PrintTreeRepresentation(UctNode root)
        {
#if XML
            var dirname = @"c:\dev\graphs\xml\";
            if (!Directory.Exists(dirname))
            {
                Directory.CreateDirectory(dirname);
            }

            string filename = dirname + "iter-" + searchCount + ".xml";

            using (var writer = new StreamWriter(filename)) {
                new XmlTreePrinter(root).Print(writer);
            }
#endif
#if DOT
            PrintDotgraph(root);
#endif
        }
Beispiel #4
0
        /// <summary>
        /// Prints the MCTS tree in a graphviz DOT file representation.
        /// </summary>
        /// <param name="root"></param>
        /// <param name="indexFunc"></param>
        public static void PrintDotgraph(UctNode root, Func <int> indexFunc = null)
        {
            var builder = new StringBuilder();

            int budget = 4;

            builder.AppendLine("digraph G {");
            PrintDotNode(builder, null, root, budget);
            builder.AppendLine("}");

            string str = builder.ToString();

            string dirname = @"data\graphs";

            if (!Directory.Exists(dirname))
            {
                Directory.CreateDirectory(dirname);
            }

            int index = indexFunc == null ? UctAlgorithm.SearchCount : indexFunc();

            File.WriteAllText($@"data\graphs\graph{index.ToString("00000")}.dot", str);
        }