예제 #1
0
        public override CSPSolution Solve()
        {
            Console.WriteLine("Beginning arc consistency check");
            _solverStopwatch = Stopwatch.StartNew();

            // Do arc consistency checking to narrow the domains
            Queue <Arc> arcs = GetAllArcs();

            try
            {
                DoArcConsistency(arcs);
            }
            catch (InvalidOperationException ioe)
            {
                Console.WriteLine(ioe.ToString());
            }

            // Complete the solution with backtracking search
            BacktrackingSolver backtracker = new BacktrackingSolver(_grid);
            CSPSolution        solution2   = backtracker.Solve();

            _solverStopwatch.Stop();

            return(CompleteSolve("Arc Consistency with Backtracking Search", solution2.SolutionGrid, _solverStopwatch.Elapsed, _procesesed, _iterations));
        }
예제 #2
0
        protected CSPSolution CompleteSolve(string name, SudokuGrid grid, TimeSpan elapsed, int processed, int iterations)
        {
            CSPSolution solution = new CSPSolution();

            solution.AlgorithmName = name;
            solution.SolutionGrid  = grid;
            solution.TimeElapsed   = elapsed;
            solution.Processed     = processed;
            solution.Iterations    = iterations;

            return(solution);
        }
예제 #3
0
        private static void PrintSolution(CSPSolution solution)
        {
            Console.WriteLine("-------------------------------------------------------");
            Console.WriteLine($"Solution for {solution.AlgorithmName}");
            Console.WriteLine($"Solved in {solution.TimeElapsed.TotalMilliseconds} ms");
            Console.WriteLine($"Processed {solution.Processed} nodes");
            if (solution.Iterations > 0)
            {
                Console.WriteLine($"Solved in {solution.Iterations} iterations");
            }
            Console.WriteLine();

            PrintGrid(solution.SolutionGrid);

            Console.WriteLine("-------------------------------------------------------");
        }
예제 #4
0
        static void Main(string[] args)
        {
            Console.WriteLine($"{args[0]} loaded");

            bool quit = false;

            while (!quit)
            {
                SudokuGrid initialProblem = LoadGridFromFile(args[0]);

                Console.WriteLine();
                Console.WriteLine("Choose an algorithm: ArcConsistency (ac), BacktrackingSearch (bts), or GradientDescent (gd)");
                Console.WriteLine("Press Q to quit, or P to print the initial grid");
                string choice = Console.ReadLine();

                List <CSPSolver> problemSolvers = new List <CSPSolver>();

                switch (choice.ToLower().Trim())
                {
                case "print":
                case "p":
                    PrintGrid(initialProblem);
                    break;

                case "q":
                case "quit":
                    quit = true;
                    break;

                case "ac":
                case "arcconsistency":
                case "arc":
                    problemSolvers.Add(new ArcConsistencySolver(initialProblem));
                    break;

                case "backtracking":
                case "bts":
                case "bt":
                case "backtrackingsearch":
                    problemSolvers.Add(new BacktrackingSolver(initialProblem));
                    break;

                case "gradientdescent":
                case "gd":
                case "gradient":
                    problemSolvers.Add(new GradientDescentSolver(initialProblem));
                    break;

                default:        // just do the solution for all of them
                    problemSolvers.Add(new ArcConsistencySolver(initialProblem));
                    problemSolvers.Add(new BacktrackingSolver(initialProblem));
                    problemSolvers.Add(new GradientDescentSolver(initialProblem));
                    break;
                }


                foreach (CSPSolver solver in problemSolvers)
                {
                    CSPSolution solution = solver.Solve();
                    PrintSolution(solution);
                }
            }
        }