コード例 #1
0
        private static void SokobanRandom(string levelPath, int maxDepth, int iterations, uint seed)
        {
            string[]           levels       = ReadSokobanLevels(levelPath);
            int                randomSolved = 0;
            List <IPuzzleMove> moves        = null;

            RNG.Seed(seed + threadIndex);
            MersenneTwister rng;


            for (int i = 0; i < levels.Length; i++)
            {
                RNG.Seed(seed + threadIndex);
                rng = new MersenneTwister(seed + threadIndex);
                IPuzzleState state   = new AbstractSokobanState(levels[i], RewardType.R0, useNormalizedPosition, useGoalMacro, useTunnelMacro, useGoalCut, null, rng);
                IPuzzleMove  move    = null;
                int          restart = 0;
                IPuzzleState clone   = state.Clone();
                string       solution;
                while (!state.EndState() && restart < iterations)
                {
                    moves = new List <IPuzzleMove>();
                    state = clone.Clone();
                    int count = 0;

                    while (!state.isTerminal() && count < maxDepth)
                    {
                        move = state.GetRandomMove();
                        moves.Add(move);
                        state.DoMove(move);
                        count++;
                    }

                    restart++;
                }
                if (state.EndState())
                {
                    solution = "";
                    int pushCount = 0;
                    foreach (SokobanPushMove push in moves)
                    {
                        foreach (IPuzzleMove m in push.MoveList)
                        {
                            if (m > 3)
                            {
                                pushCount++;
                            }
                            solution += m;
                        }
                    }
                    Log("Level " + (i + 1) + "\titerations: " + restart + "\tsolution length:  (moves/pushes)" + solution.Length + "/" + pushCount + "\tsolution: " + solution);
                    randomSolved++;
                }
                else
                {
                    Log("Level " + (i + 1) + "\tNo solution found");
                }
            }
            Log("Solved: " + randomSolved + "/" + levels.Length);
        }
コード例 #2
0
        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));
                }
            }
        }
コード例 #3
0
        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);
        }