示例#1
0
        private static void Main(string[] args)
        {
            Console.WriteLine("Begin solving Sudoku using combinatorial evolution");
            Console.WriteLine("The Sudoku is:");

            var sudoku = Sudoku.Difficult;

            Console.WriteLine(sudoku.ToString());

            const int numOrganisms = 200;
            const int maxEpochs    = 5000;
            const int maxRestarts  = 40;

            Console.WriteLine($"Setting numOrganisms: {numOrganisms}");
            Console.WriteLine($"Setting maxEpochs: {maxEpochs}");
            Console.WriteLine($"Setting maxRestarts: {maxRestarts}");

            var solver       = new SudokuSolver();
            var solvedSudoku = solver.Solve(sudoku, numOrganisms, maxEpochs, maxRestarts);

            Console.WriteLine("Best solution found:");
            Console.WriteLine(solvedSudoku.ToString());
            Console.WriteLine(solvedSudoku.Error == 0 ? "Success" : "Did not find optimal solution");
            Console.WriteLine("End Sudoku using combinatorial evolution");
        }
        public void Solve(GrilleSudoku s)
        {
            //conversion de formats en int[,]
            int[,] converted = new int[9, 9];
            for (int row = 0; row < 9; row++)
            {
                for (int column = 0; column < 9; column++)
                {
                    converted[row, column] = s.Cellules[row * 9 + column];
                }
            }
            var sudoku = Sudoku.New(converted);

            var solver = new SudokuSolver();

            var solvedSudoku = solver.Solve(sudoku, 200, 5000, 40);
            // Possibilité d'incrémenter le nombre d'organismes jusqu'à obtenir une solution?
            // Mais les meilleures optimisations à faire sont probablement dans le code du solver lui-même, auquel cas, il faudrait copier le code dans le projet plutôt que le référencer

            var numOrganisms = 200;

            do
            {
                solvedSudoku  = solver.Solve(sudoku, numOrganisms, 5000, 1);
                numOrganisms *= 2;
            } while (solvedSudoku.Error > 0);

            //affichage du sudoku
            Console.WriteLine(solvedSudoku.ToString());
            //Reconversion depuis int[,]
            for (int row = 0; row < 9; row++)
            {
                for (int column = 0; column < 9; column++)
                {
                    s.Cellules[row * 9 + column] = solvedSudoku.CellValues[row, column];
                }
            }
        }