Passa ai contenuti principali

Adesso tu



Era il 1986, un giovane di belle speranze chiamato Eros Ramazzotti vinse il 36° Festival di Sanremo con il brano “Adesso tu” in cui canta “andare avanti senza arrivare mai". 
Questa potrebbe non essere la strategia migliore anche nel risolvere tanti problemi algoritmici, per i quali, invece, è meglio andare avanti finché possibile, per poi tornare indietro e provare un'altra strada. 
In inglese, questo procedere guardingo porta il nome poco poetico di backtracking.
Lo troviamo implementato in un algoritmo di ricerca in profondità (DFS) per la creazione di quei labirinti che, specie in estate, popolano le riviste di giochi e passatempi. 
Alcuni di essi sembrano partoriti dalla mente del mitico Dedalo, talmente appaiono intricati: decine di bivi separano l'ingresso dall'uscita e un solo percorso è quello giusto (labirinto perfetto). Noi, sotto l’ombrellone, siamo avvantaggiati nell'impresa perché possiamo contare su una bellissima vista aerea dell'intera “struttura”, ma provate solo a immaginare le difficoltà di un povero Teseo senza il provvidenziale filo.
Come funziona il backtracking? 
Sostanzialmente consiste in una funzione (nel codice che ho messo a punto è un metodo di classe) che richiama sé stessa un numero imprecisato di volte fino al verificarsi di certe condizioni (funzione ricorsiva). 

def genera_labirinto(self, x, y):
    self.visitato[y, x] = True
    self.griglia[y, x] = 0  # Segna il passaggio
    random.shuffle(self.direzioni)  # Randomizza l'ordine di esplorazione
    for dy, dx in self.direzioni:
        nx, ny = x + dx, y + dy
        if 0 <= nx < self.larghezza and 0 <= ny < self.altezza and not self.visitato[ny, nx]:
            self.griglia[y + dy // 2, x + dx // 2] = 0  # Rimuove il muro intermedio
            self.genera_labirinto(nx, ny)


Spiegazione:
  1. L'algoritmo marca la cella corrente (x, y) come visitata.
  2. Tenta di esplorare tutte le direzioni possibili (randomizzate).
  3. Il backtracking si verifica quando:
    • l'algoritmo raggiunge una cella da cui non può più avanzare (tutte le celle adiacenti sono già state visitate o sono fuori dai limiti).
    • oppure ha finito di esplorare tutte le direzioni possibili da una cella; a questo punto, l'esecuzione torna indietro (backtrack) alla chiamata precedente nella pila di ricorsione.
  4. Al termine della chiamata ricorsiva self.genera_labirinto(nx, ny), il controllo torna alla funzione chiamante per provare la direzione successiva nel ciclo for. 

Esempio pratico:
Supponiamo di essere in una cella (5, 5).
  1. L'algoritmo prova a spostarsi in una direzione, ad esempio a destra verso (7, 5).
  2. Dalla cella (7, 5)
    continua l'esplorazione ricorsivamente.
  3. Quando l'esplorazione da (7, 5) finisce, l'algoritmo fa backtracking tornando a (5, 5).
  4. Da (5, 5) prova poi a esplorare un'altra direzione, ad esempio verso il basso (5, 7).
  5. Questo processo continua finché tutte le direzioni da (5, 5) sono state esplorate.
  6. A quel punto, fa backtracking alla cella precedente da cui siamo arrivati.
Alcune delle principali tipologie di labirinto

  • Labirinto perfetto, quello di questo esempio (senza cicli)
  • Labirinto imperfetto (con cicli)
  • Labirinto a corridoi largamente spaziati
  • Labirinto con stanze e corridoi
  • Labirinto con struttura gerarchica (tipo albero)
  • Labirinto a griglia esagonale
  • Labirinto estremo (difficoltà massima)

Post popolari in questo blog

Salmoni, scarpette, cetrioli e altro

Tutto il testo contenuto in questa pagina è stato pensato e scritto dall'autore del blog.   1. Come il salmone 2. Ooops! 3. Le scarpette hi-tech 4. Equivoci contemporanei 5. I saccenti 6. Medaglie di legno 7. La festività del Nulla 8. Gli aggiornamenti elettronici del Libro dell'Apocalisse 9. Dubbi ne ho 10. La maieutica del vulcaniano 11. Un piacevole vasetto di miele 12. Povere sfere 13. Caos comune mezzo gaudio 14. La fontana senza volti 15. Il piromane super beffardo 16. Boom di serpenti 17. Sistemi in via di degradazione 18. Il gatto nero 19. Alain Delon è ancora vivo? 20. Per sempre con i cani 21. Eventi imprevedibili 22. I robot sottomessi 23. Lady Gaga e Bruno Mars incantano 24. Definizioni mancate 25. Il mio nemico drone 26. Errore di valutazione 27. Ringraziamenti 28. Cari cetrioli, vi scrivo 29. Boom di detective 30. Gli UFO trascurati 31. Il grande salto delle rane 32. La malattia artificiale 33. Homo consumens 34. Lacune informatiche 35. Sei troppo! 36. ...

Generatore Markmap HD

Pagina per il download di  Memento Lite Generatore Markmap Avanzato - Specifiche per l'utente finale Scopo principale: l'applicazione “Generatore Markmap Avanzato” permette agli utenti di trasformare testo scritto in formato Markdown in mappe mentali interattive. Offre funzionalità per creare, visualizzare, salvare, modificare, gestire ed esportare queste mappe mentali in vari formati. Interfaccia utente: l'interfaccia è strutturata nelle seguenti sezioni principali: Link al blog esterno: un link “🌐 Visita il Blog: Pensieri d'assestamento” che apre il blog associato in una nuova scheda. Intestazione (Header): Titolo: “Generatore Markmap Avanzato”. Sottotitolo: “Trasforma, salva e condividi il tuo testo Markdown in mappe mentali interattive”. Area Principale dei Contenuti: divisa in due pannelli affiancati (o impilati su schermi piccoli): Pannello di Input (Editor Markdown): Titolo: “✏️ Editor Markdown”. Area di Testo: un campo multiriga dove l...

Neural Tic-Tac-Toe Lab

Questo articolo presenta l'implementazione di una rete neurale specializzata nel gioco del tris (tic-tac-toe), addestrata mediante una metodologia innovativa basata sull'enumerazione completa degli stati di gioco. L'approccio supera le limitazioni dei metodi tradizionali di campionamento casuale, garantendo una copertura totale dello spazio delle configurazioni possibili. Struttura della rete neurale La rete implementata utilizza un'architettura feed-forward compatta con 9 neuroni di input, 16 neuroni nel layer nascosto e 9 neuroni di output. I neuroni di input ricevono la rappresentazione numerica dello stato della board (-1, 0, 1 per ciascuna delle 9 caselle), mentre i neuroni di output producono valutazioni numeriche per ogni possibile mossa. Il layer nascosto utilizza 16 neuroni con funzione di attivazione relu per introdurre capacità di apprendimento non-lineare. La rete contiene complessivamente 297 parametri: 144 pesi per le connessioni input-hidden, 16 bi...