public int UseMCTS(int x, int centerY) { Log.LogInformation("Driver MCTS - MCTS start"); int s = 1; while (!RectangleAgent.obstacleOpenSpace[centerY + s, x]) { s++; } Node square = new Node(x, centerY + s - 1, false); this.nodes[0] = square; int y = square.getY(); deleteCollectedDiamonds(); RectangleAgent.nodes = this.nodes; RectangleAgent.CreateEdgesAndAdjacencyMatrix(); this.adjacencyMatrix = RectangleAgent.adjacencyMatrix; this.directionMap = RectangleAgent.directionMap; MCTS driverMCTS = new MCTS(this.nodes, this.adjacencyMatrix, RectangleAgent.nCollectiblesLeft, 2000); Queue <Node> newRoute = driverMCTS.Run(); this.route = RectangleAgent.ClearRoute(newRoute.ToArray(), driverMCTS.outputNodeIndex); return(recalcNextNodes("MCTS", x, y)); }
public int UseMCTSWithAStar(int x, int centerY) { Log.LogInformation("Driver MCTS ASTAR - MCTS ASTAR start"); int s = 1; while (!RectangleAgent.obstacleOpenSpace[centerY + s, x]) { s++; } Node square = new Node(x, centerY + s - 1, false); this.nodes[0] = square; int y = square.getY(); deleteCollectedDiamonds(); RectangleAgent.nodes = this.nodes; RectangleAgent.CreateEdgesAndAdjacencyMatrix(); this.adjacencyMatrix = RectangleAgent.adjacencyMatrix; this.directionMap = RectangleAgent.directionMap; MCTS driverMCTS = new MCTS(this.nodes, this.adjacencyMatrix, RectangleAgent.nCollectiblesLeft, 2000); Queue <Node> newRoute = driverMCTS.Run(); this.route = RectangleAgent.ClearRoute(newRoute.ToArray(), driverMCTS.outputNodeIndex); //AStar Node[] routeAsArray = this.route.ToArray(); List <Node> diamondNodes = new List <Node>(); for (int n = 0; n < routeAsArray.Length; n++) { if (routeAsArray[n].getDiamond() && !diamondNodes.Contains(routeAsArray[n])) { diamondNodes.Add(routeAsArray[n]); } } this.route = RectangleAgent.calcShortestRouteWithDiamondOrderAStar(diamondNodes); //AStar end return(recalcNextNodes("MCTS ASTAR", x, y)); }
public double rollOut(MCTSNode mn) { double value = 0; int counter = 1; while (!mn.endState && counter < (MCTS.nodes.Count * 10)) { mn.expand(); MCTSNode randomNode = mn.select(); AddToIndexList(randomNode); if (randomNode == null) { break; } mn = randomNode; counter++; } if (mn.endState) { if (output) { Log.LogInformation("End state found: " + mn); } //Stop if first endstate found? //MCTS.endStateFound = true; } value = (mn.collected + 0.01) * 100 * 1000 / (counter - 1); if (MCTS.bestCollected < mn.collected || (MCTS.bestValue < value && MCTS.bestCollected == mn.collected)) { MCTS.SetBestRoute(mn); MCTS.bestCollected = mn.collected; MCTS.bestValue = value; } return(value); }