Prima di leggere oltre, supponi di sapere quale gioco di sudoku e come risolverlo.
Quindi ho creato un risolutore di sudoku con forza bruta: L'algoritmo va come
- calcola (attraverso un semplice controllo delle regole) tutti i possibili valori di ogni cella vuota.
- Conta celle vuote
- Se una cella ha una sola possibilità, imposta il valore della cella e ricalcola tutte le possibilità
- conta nuovamente le celle vuote
- Se il vecchio numero di celle vuote < nuovo conteggio delle celle vuote, ripetere
- else apply bruteforce
Algoritmo della forza bruta
1. (nidificato) per ogni cella si applica la prima possibilità
2. Controllare isSolved se è vero? pausa: altrimenti applica la seconda possibilità e ripeti.
Sebbene l'algoritmo B.F. di cui sopra funzioni per problemi facili e medi, ma problemi difficili con molte possibilità per ogni cella, il programma si blocca a causa del ciclo annidato
Il mio algoritmo di backtracking utilizza lo stesso primo algo per restringere la ricerca, quindi
- imposta la prima possibilità per la prima cella vuota
- controlla se grid isValid == true; (se risolto quindi interrompi), altrimenti imposta la prima possibilità per la cella successiva, ripeti
- se grid isValid == false, torna alla cella precedente e imposta la prossima possibilità e continua
Ho applicato l'algoritmo BackTracking sulla griglia 6x6 e funziona, devo ancora applicarlo sulla griglia 9x9.
Algoritmo di Annealing simulato:
- imposta in modo casuale i valori di ogni cella vuota
- calcola il conteggio degli errori
- Genera una soluzione adiacente casuale e ri-conta gli errori
- se il nuovo numero di errori < vecchio conteggio degli errori: mantieni la nuova griglia, altrimenti mantieni la vecchia
- se la griglia viene risolta, quindi interrompere; altrimenti ripeti
Ora per le mie domande:
- Il mio algoritmo di annealing simulato è corretto?
- Ovviamente BackTracking risolverà il problema molto più velocemente di BruteForce, quanto più velocemente la ricottura simulata risolverà un problema? Dal momento che mescola in modo casuale, potrebbe richiedere più tempo per risolverlo rispetto a BackTracking.
- Come faccio a generare una soluzione adiacente casuale nel passaggio 3