Wednesday, November 09, 2005
Sudoku - Structural and Procedural Complexity
I usually don't like games with complex rules, so I guess I should like sudoku - rules are extremely simple, but the game can be challenging.
However, I quickly became more interested in thinking about a good object oriented design for a sudoku solver. Writing a solver is relatively easy, especially if you use simple strategies and maybe some backtracking (of course, better heuristics would make backtracking unnecessary in many cases). Still, if you structure your code around the algorithmic side, you'll end up with the usual mess :-) of procedural complexity.
Some of the solving strategies, on the other hand, seems to have a very natural object oriented flavor. Rows, columns and squares all have their own individual strategies. The outer square may get involved only when crossing strategies are concerned. Cells may contribute with their own intelligence (e.g. by keeping track of allowed configuration). Sure thing, you can bring procedural complexity down to a very elegant and manageable level, probably without any sensible impact on performance.
The OO model, however, won't be simple. We lack a very desirable property in the description above: low data coupling. Actually, the outer square, the inside squares, rows and columns are all inter-dependent on some level, as they share the underlying cells. This would make the structure more complex than I would like to. Add some kind of GUI, and you may end up with some kind of observer on steroids.
Is there a way to keep procedural complexity to a minimum for this problem, without ending up with high structural complexity? I don't have much time to think about it right now, but I could always turn this into a small scale design problem for one of my introductory courses :-)
Comments:
<< Home
Smontare la scatola...
Vi confesso che anch'io quest'estate mi sono cimentato nella risoluzione di un paio di sudoku. Se non fosse stato per la collaborazione di mia figlia dodicenne sicuramente ci avrei messo di più. Essere bruciati sul tempo da una pivellina può irritare, anche se poi l'orgoglio di padre mitiga la cosa. Anch'io come Carlo ho subito pensato che si sarebbe potuto scrivere un programma di risoluzione (un altro!).
Siamo dei deformati? Come se un fisico, di fronte ad uno stupendo tramonto, invece che godersi lo spettacolo si mettesse ad elucubrare sulla fusione nucleare.
Forse Carlo hai veramente perso un'ottima occasione di rilassarsi veramente :-))
Mi preparo alla prematura fine di uno scomodo commentatore
Vi confesso che anch'io quest'estate mi sono cimentato nella risoluzione di un paio di sudoku. Se non fosse stato per la collaborazione di mia figlia dodicenne sicuramente ci avrei messo di più. Essere bruciati sul tempo da una pivellina può irritare, anche se poi l'orgoglio di padre mitiga la cosa. Anch'io come Carlo ho subito pensato che si sarebbe potuto scrivere un programma di risoluzione (un altro!).
Siamo dei deformati? Come se un fisico, di fronte ad uno stupendo tramonto, invece che godersi lo spettacolo si mettesse ad elucubrare sulla fusione nucleare.
Forse Carlo hai veramente perso un'ottima occasione di rilassarsi veramente :-))
Mi preparo alla prematura fine di uno scomodo commentatore
Come sempre :-) io ho una visione un po' piu' positiva ;-), se non altro perche' tra uno stupendo tramonto ed il sudoku c'e' un discreto abisso :-).
Se sposto un po' la metafora, e penso ad uno storico dell'arte che guardando un dipinto non solo ne puo' apprezzare le qualita' estetiche ma anche vedere sotto un'altra luce il quadro, non mi sentirei di definirlo un "deformato" :-).
E' invece vero che chi si dedica a materie tecnico / scientifiche finisce piu' facilmente per avere un comportamento nerd-like, che pero' io non amo in modo particolare...
Nel caso specifico, il sudoku mi e' parso in realta' un po' troppo meccanico in troppi momenti, ovvero: lo sprazzo creativo mi sembra necessario solo in pochi momenti chiave, il resto e' meccanico e facilmente automatizzabile.
Per dirla tutta, giocare da solo mi annoia parecchio. Il giorno dopo, avendo ancora un quotidiano sottomano, ho risolto un sudoku con l'amata : ) ed e' stato piu' divertente, anche perche' lei ha subito adottato una euristica di gioco che io non usavo...
A latere, mi vengono pensieri su qualcosa che Colvin o Armour hanno scritto riguardo essere homo sapiens sapiens, e sulla reflection on action di Schon [autori molto in gamba che cito spesso, anche se si sono occupati di materie molto diverse tra loro], ma non vorrei passare per un nerd :-)))).
Se sposto un po' la metafora, e penso ad uno storico dell'arte che guardando un dipinto non solo ne puo' apprezzare le qualita' estetiche ma anche vedere sotto un'altra luce il quadro, non mi sentirei di definirlo un "deformato" :-).
E' invece vero che chi si dedica a materie tecnico / scientifiche finisce piu' facilmente per avere un comportamento nerd-like, che pero' io non amo in modo particolare...
Nel caso specifico, il sudoku mi e' parso in realta' un po' troppo meccanico in troppi momenti, ovvero: lo sprazzo creativo mi sembra necessario solo in pochi momenti chiave, il resto e' meccanico e facilmente automatizzabile.
Per dirla tutta, giocare da solo mi annoia parecchio. Il giorno dopo, avendo ancora un quotidiano sottomano, ho risolto un sudoku con l'amata : ) ed e' stato piu' divertente, anche perche' lei ha subito adottato una euristica di gioco che io non usavo...
A latere, mi vengono pensieri su qualcosa che Colvin o Armour hanno scritto riguardo essere homo sapiens sapiens, e sulla reflection on action di Schon [autori molto in gamba che cito spesso, anche se si sono occupati di materie molto diverse tra loro], ma non vorrei passare per un nerd :-)))).
Il fatto che sia "difficile" (o forse addirittura innaturale) fare il design ad oggetti di un solver per il sudoku, non potrebbe semplicemente significare che non è utile ? E che sforzarsi di ragionare ad oggetti in un contesto essenzialmente procedurale non sia semplicemnte un caso di sovra-design ?
Premesso che condivido il "difficile" tra virgolette, visto che stiamo parlando comunque di un programmino molto semplice, va detto che io non ho scritto che progettare con approccio OO il solver sudoku e' difficile. Ho detto che non bilancia bene la complessita' strutturale (che cresce "troppo") con quella procedurale (che decresce enormemente, ma a scapito dell'altra, senza raggiungere un buon equilibrio).
Sul fatto che il contesto sia "procedurale", temo di non essere molto d'accordo [in questo caso specifico]. A meno che tu non risolva tutto in una funzionaccia :-)) brutta che esplora un albero di ricerca ricorsivamente con backtracking, ti ritroverai piu' o meno naturalmente a suddividere le euristiche intorno ad alcune entita', come le righe, le colonne, i sottoquadri, le righe e colonne dei sottoquadri, ecc. C'e' una ovvia struttura OO li' dietro, e c'e' anche spazio per l'ereditarieta': alcune euristiche si applicano a tutti contenitori di 9 celle, siano righe, colonne o sottoquadri.
Ci sono sicuramente casi dove progettare OO "non paga", o semplicemente non ha senso. Un algoritmo di sort e' un esempio elementare: qui una tecnica procedurale unita ad un po' di programmazione generica porta a risultati migliori. Sul sudoku non sarei cosi' categorico: e' solo che il punto di equilibrio tra le forme di complessita' non mi pare soddisfacente (per la soluzione che intuisco al volo, probabilmente pensandoci meglio salta fuori qualcosa di meglio).
Post a Comment
Sul fatto che il contesto sia "procedurale", temo di non essere molto d'accordo [in questo caso specifico]. A meno che tu non risolva tutto in una funzionaccia :-)) brutta che esplora un albero di ricerca ricorsivamente con backtracking, ti ritroverai piu' o meno naturalmente a suddividere le euristiche intorno ad alcune entita', come le righe, le colonne, i sottoquadri, le righe e colonne dei sottoquadri, ecc. C'e' una ovvia struttura OO li' dietro, e c'e' anche spazio per l'ereditarieta': alcune euristiche si applicano a tutti contenitori di 9 celle, siano righe, colonne o sottoquadri.
Ci sono sicuramente casi dove progettare OO "non paga", o semplicemente non ha senso. Un algoritmo di sort e' un esempio elementare: qui una tecnica procedurale unita ad un po' di programmazione generica porta a risultati migliori. Sul sudoku non sarei cosi' categorico: e' solo che il punto di equilibrio tra le forme di complessita' non mi pare soddisfacente (per la soluzione che intuisco al volo, probabilmente pensandoci meglio salta fuori qualcosa di meglio).
<< Home





