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]; } } }