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); }
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); } }
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 }
/// <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); }