private static void SokobanIDAStarTest(string levelPath, int maxCost, RewardType rewardType, int maxTableSize, bool useNormalizedPosition, bool useTunnelMacro, bool useGoalMacro, bool useGoalCut) { string[] levels = ReadSokobanLevels(levelPath); IPuzzleState[] states = new IPuzzleState[levels.Length]; int solvedLevels = 0; Stopwatch stopwatch = new Stopwatch(); long stateInitTime; long solvingTime; //GoalMacroWrapper.BuildMacroTree(null); for (int i = 0; i < states.Length; i++) { stopwatch.Restart(); states[i] = new AbstractSokobanState(levels[i], rewardType, useNormalizedPosition, useGoalMacro, useTunnelMacro, useGoalCut, null); stopwatch.Stop(); stateInitTime = stopwatch.ElapsedMilliseconds; IDAStarSearch idaStar = new IDAStarSearch(); //Log("Level" + (i + 1) + ":\n" + states[i].PrettyPrint()); stopwatch.Restart(); List <IPuzzleMove> solution = idaStar.Solve(states[i], maxCost, maxTableSize, 700); stopwatch.Stop(); solvingTime = stopwatch.ElapsedMilliseconds; string moves = ""; int pushCount = 0; if (solution != null) { foreach (IPuzzleMove m in solution) { //Debug.WriteLine(states[i]); //Debug.WriteLine(m); SokobanPushMove push = (SokobanPushMove)m; foreach (IPuzzleMove basicMove in push.MoveList) { moves += basicMove; if (basicMove.move > 3)//the move is a push move { pushCount++; } } states[i].DoMove(m); } if (states[i].EndState()) { solvedLevels++; } Log("Level " + (i + 1) + " solved: " + (states[i].EndState()) + " with " + idaStar.NodeCount + " nodes; solution length:" + moves.Count() + "/" + pushCount + " - Init Time: " + TimeFormat(stateInitTime) + " - Solving Time: " + TimeFormat(solvingTime)); Log("Moves: " + moves); Log("Solved " + solvedLevels + "/" + (i + 1)); Console.Write("\rSolved " + solvedLevels + "/" + (i + 1)); } } }
private static int[] SokobanTest(double const_C, double const_D, int iterations, int restarts, string[] levels, uint seed, bool abstractSokoban, RewardType rewardType, bool stopOnResult, double epsilonValue, bool log) { uint threadIndex = GetThreadIndex(); RNG.Seed(seed + threadIndex); MersenneTwister rng = new MersenneTwister(seed + threadIndex); int currentLevelIndex = GetTaskIndex(threadIndex); ISPSimulationStrategy simulationStrategy; simulationStrategy = new SokobanEGreedyStrategy(epsilonValue, rng); IPuzzleState[] states = new IPuzzleState[levels.Length]; //SokobanMCTSStrategy player; //Debug.WriteLine("Solved random: "+randomSolved+"/"+levels.Length); // Debug.WriteLine(restart); int solvedLevels = 0; int[] rolloutsCount = new int[states.Length]; Stopwatch stopwatch = new Stopwatch(); long stateInitializationTime; long solvingTime; int totalRollouts = 0; int totalNodes = 0; List <int> visitsList = new List <int>(); List <int> raveVisitsList = new List <int>(); double totalDepth = 0; int totalNodesEliminated = 0; int totalNodesNotExpanded = 0; for (int i = 0; i < states.Length; i++) { RNG.Seed(seed + threadIndex); rng = new MersenneTwister(seed + threadIndex); if (simulationType == SimulationType.EpsilonGreedy) { simulationStrategy = new SokobanEGreedyStrategy(epsilonValue, rng); } else { simulationStrategy = new SokobanIDAstarStrategy(maxNodes, tableSize, 200, 0.2); } if (i % SinglePlayerMCTSMain.threadIndex != threadIndex) { continue; } stopwatch.Restart(); if (abstractSokoban) { states[i] = new AbstractSokobanState(levels[i], rewardType, useNormalizedPosition, useGoalMacro, useTunnelMacro, useGoalCut, simulationStrategy, rng); } else { states[i] = new SokobanGameState(levels[i], rewardType, simulationStrategy); } stopwatch.Stop(); stateInitializationTime = stopwatch.ElapsedMilliseconds; List <IPuzzleMove> moveList = new List <IPuzzleMove>(); //player = new SokobanMCTSStrategy(rng, iterations, 600, null, const_C, const_D, stopOnResult); //SP_MCTSAlgorithm mcts = new SP_MCTSAlgorithm(new SP_UCTTreeNodeCreator(const_C, const_D, rng), stopOnResult); OptMCTSAlgorithm mcts = new OptMCTSAlgorithm(new Opt_SP_UCTTreeNodeCreator(const_C, const_D, rng, ucb1Tuned, rave, raveThreshold, nodeRecycling), iterations, memoryBudget, stopOnResult, avoidCycles, useNodeElimination); string moves = ""; stopwatch.Restart(); moveList = mcts.Solve(states[i], iterations); stopwatch.Stop(); solvingTime = stopwatch.ElapsedMilliseconds; //moveList = player.GetSolution(states[i]); int pushCount = 0; foreach (IPuzzleMove m in moveList) { if (abstractSokoban) { //Debug.WriteLine("Move: " + m); //Debug.WriteLine(states[i]); SokobanPushMove push = (SokobanPushMove)m; foreach (IPuzzleMove basicMove in push.MoveList) { moves += basicMove; if (basicMove.move > 3)//the move is a push move { pushCount++; } } } else { moves += m; if (m.move > 3)//the move is a push move { pushCount++; } } states[i].DoMove(m); } if (states[i].EndState()) { solvedLevels++; totalRollouts += mcts.IterationsForFirstSolution; } else { totalRollouts += mcts.IterationsExecuted; } totalDepth += mcts.maxDepth; totalNodesEliminated += mcts.nodesEliminated; totalNodesNotExpanded += mcts.nodesNotExpanded; rolloutsCount[i] = mcts.IterationsExecuted; scores[i] = rolloutsCount[i]; solved[i] = states[i].EndState(); if (log) { Log("Level " + (i + 1) + "\titerations: " + mcts.IterationsExecuted + "\titerations for first solution: " + mcts.IterationsForFirstSolution + "\ttotal solutions: " + mcts.SolutionCount + "\tbest solution length (moves/pushes): " + moves.Count() + "/" + pushCount + "\tInit Time: " + TimeFormat(stateInitializationTime) + " - Solving Time: " + TimeFormat(solvingTime) + "\tTree depth: " + mcts.maxDepth + "\tNodes: " + mcts.NodeCount + "\tNodes Eliminated: " + mcts.nodesEliminated + "\tNodes Not Expanded: " + mcts.nodesNotExpanded + "\tBest solution: " + moves); } totalNodes += mcts.NodeCount; visitsList.AddRange(mcts.visits); raveVisitsList.AddRange(mcts.raveVisits); Console.Write("\r "); Console.Write("\rSolved " + solvedLevels + "/" + (i + 1)); } visitsList.Sort((x, y) => (x.CompareTo(y))); raveVisitsList.Sort((x, y) => (x.CompareTo(y))); double avgVisits = 0; foreach (int v in visitsList) { avgVisits += v; } double avgRaveVisits = 0; foreach (int v in raveVisitsList) { avgRaveVisits += v; } avgVisits /= visitsList.Count; avgRaveVisits /= raveVisitsList.Count; Log("Solved " + solvedLevels + "/" + levels.Length); Log("Total iterations: " + totalRollouts); Log("Total nodes: " + totalNodes); Log("Nodes eliminated: " + totalNodesEliminated); Log("Nodes Not Expanded: " + totalNodesNotExpanded); Log("avg nodes:" + ((double)totalNodes) / states.Length); Log("avg visits: " + avgVisits); Log("avg raveVisits: " + avgRaveVisits); Log("median visits: " + (visitsList.Count % 2 == 0 ? visitsList[visitsList.Count / 2] : (visitsList[visitsList.Count / 2] + visitsList[1 + visitsList.Count / 2]) / 2)); Log("median raveVisits: " + (raveVisitsList.Count % 2 == 0 ? raveVisitsList[raveVisitsList.Count / 2] : (raveVisitsList[raveVisitsList.Count / 2] + raveVisitsList[1 + raveVisitsList.Count / 2]) / 2)); Log("avg depth: " + totalDepth / states.Length); return(rolloutsCount); }