Upload
eloisa-amore
View
217
Download
0
Embed Size (px)
Citation preview
1© Alberto Montresor
BactrackingBactracking
Algoritmi e Strutture DatiCapitolo 16 - Backtrack
Alberto MontresorUniversità di Trento
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/2.5/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.
2© Alberto Montresor
IntroduzioneIntroduzione
✦Classi di problemi (decisionali, di ricerca, di ottimizzazione)
✦Definizioni basate sul concetto di soluzione ammissibile: una soluzione che soddisfa un certo insiemi di criteri
✦Problemi “tipici”
✦Contare le soluzioni ammissibili
✦Costruire almeno una o tutte le soluzioni ammissibili
✦Trovare le soluzioni ammissibili “più grandi”, “più piccole” o in generale “ottimali”
✦Esempio:
✦Elencare tutti i sottoinsiemi di k elementi di un insieme S
3© Alberto Montresor
Problemi: commentiProblemi: commenti
✦Enumerazione
✦Elencare algoritmicamente tutte le possibili soluzioni ammissibili (spazio di ricerca)
✦Costruire almeno una soluzione
✦Si utilizza l'algoritmo per elencare tutte le soluzioni, fermandosi alla prima
✦Contare le soluzioni
✦In molti casi, è possibile contare in modo analitico✦Esempio: |S| = n, # sottoinsiemi di k elementi:
✦In altri casi, si costruiscono le soluzioni e si contano
4© Alberto Montresor
Problemi: commentiProblemi: commenti
Trovare le soluzioni ottimali Si costruiscono tutte le soluzioni e si valuta una funzione di costo
Si possono utilizzare altre tecniche: Programmazione dinamica, greedy Tecniche risolutive per problemi intrattabili
Esempi: Circuito hamiltoniano (commesso viaggiatore)
5© Alberto Montresor
Costruire tutte le soluzioniCostruire tutte le soluzioni
✦Per costruire tutte le possibili soluzioni, si utilizza un approccio “brute-force”: si esamina interamente lo spazio delle possibili soluzioni
✦A volte è l'unica strada possibile
✦La potenza dei computer moderni rende “affrontabili” problemidi discrete dimensioni
✦10! = 3.63 · 106 permutazione di 10 elementi✦220 = 1.05 · 106 sottoinsieme di 20 elementi
✦Inoltre, a volte non è necessario analizzare l'intero spazio delle soluzioni
6© Alberto Montresor
Backtracking
✦Filosofia:
✦“Prova a fare qualcosa, e se non va bene, disfalo e prova qualcos'altro”
✦Come funziona?
✦Un metodo sistematico per iterare su tutte le possibili istanze di uno spazio di ricerca
✦E' una tecnica algoritmica che, come altre, deve essere personalizzata per ogni applicazione individuale
7© Alberto Montresor
BacktrackingBacktracking
✦Organizzazione generale
✦Una soluzione viene rappresentata come un vettore S[1..n]
✦Il contenuto degli elementi S[i] è preso da un insieme di scelte C dipendente dal problema
✦Esempi:
✦C insieme generico, possibili soluzioni permutazioni di C
✦C insieme generico, possibili soluzioni sottoinsiemi di C
✦C mosse di gioco, possibili soluzioni sequenze di mosse
✦C archi di un grafo, possibili soluzioni percorsi sul grafo
8© Alberto Montresor
BacktrackingBacktracking
✦Come procedere: ad ogni passo, partiamo da una soluzione parziale S[1..k]
✦Se S[1..k] è una soluzione ammissibile, la “processiamo” in qualche modo e abbiamo finito
✦Altrimenti:✦Se è possibile, estendiamo S[1..k] con una delle possibili scelte in una soluzione S[1..k+1], e valutiamo la nuova soluzione ricorsivamente✦Altrimenti, “cancelliamo” (ritornando indietro nella ricorsione) l'elemento S[k] (backtrack) e ripartiamo dalla soluzione S[1..k-1]✦Si può fare backtrack su più passi di ricorsione
9© Alberto Montresor
BacktrackingBacktracking
✦Spazio di ricerca ≡ albero di decisione
✦Soluzioni ≡ foglie in un albero di decisione
✦Soluzioni parziali ≡ nodi interni dell'albero di decisione
✦Radice ≡ soluzione parziale vuota
10
© Alberto Montresor
BacktrackingBacktracking
✦Lo spazio di ricerca può essere ridotto:
✦“Rami” dell'albero che sicuramente non portano a soluzioni ammissibili possono essere “potati” (pruned)
✦La valutazione viene fatta nelle soluzioni parziali radici del sottoalbero da potare
11
© Alberto Montresor
Backtracking
✦Due possibili approcci:
✦Ricorsivo: ✦lavora tramite una visita in profondità nell'albero delle scelte, basata su un approccio ricorsivo
✦Iterativo: utilizza un approccio greedy, eventualmente tornandosui propri passi
✦Esempio: Inviluppo convesso✦Esempio: String matching
12
© Alberto Montresor
Algoritmo generico
S: vettore contenente la soluzione parziale S[1..i]
...: informazioni addizionali
C insieme di possibili candidati per estendere la soluzione
Ritorna true per bloccarel'esecuzione, ad esempiodopo la prima soluzione
Ritorna false per le soluzioni parziali
13
© Alberto Montresor
Esempio 1Esempio 1
✦Problema
✦Elencare tutti i sottoinsiemi di un insieme S
✦Problemi
✦Quali sono le scelte possibili?
14
© Alberto Montresor
Esempio 1: commentiEsempio 1: commenti
Commenti Non c'è pruning. Tutto lo spazio possibile viene esplorato.
Ma questo avviene per definizione
In che ordine vengono stampati gli insiemi?
E' possibile pensare ad una soluzione iterativa, ad-hoc?(non-backtracking)
15
© Alberto Montresor
Esempio 1: versione iterativaEsempio 1: versione iterativa
16
© Alberto Montresor
Esempio 2Esempio 2
✦Problema
✦Elencare tutti i sottoinsiemi di dimensione k di un insieme S
✦Versione iterativa
✦Qual è il costo?
✦Soluzione basata su backtracking
✦Possiamo potare?
17
© Alberto Montresor
Esempio 2: 1° tentativoEsempio 2: 1° tentativo
Qual è il problema?
18
© Alberto Montresor
Esempio 2: 2° tentativoEsempio 2: 2° tentativo
Qual è il problema?
19
© Alberto Montresor
Esempio 2: Tentativo correttoEsempio 2: Tentativo corretto
20
© Alberto Montresor
Esempio 2: vantaggiEsempio 2: vantaggi
21
© Alberto Montresor
Esempio 2: sommario
✦Cosa abbiamo imparato?
✦“Specializzando” l'algoritmo generico, possiamo ottenere una versione più efficiente
✦Versione efficiente per ✦valori di k “piccoli” (vicini a 1)✦valori di k “grandi” (vicini a n)
✦Miglioramento solo parziale verso n/2
✦E' difficile ottenere la stessa efficienza con un algoritmo iterativo
22
© Alberto Montresor
Esempio 3Esempio 3
Problema Stampa di tutte le permutazioni di un insieme A
Rispetto al problema precedente: L'insieme dei candidati dipende dalla soluzione parziale corrente
23
© Alberto Montresor
n Reginen Regine
✦Problema: posizionare n regine in una scacchiera n·n, in modo tale che nessuna regina ne “minacci” un'altra.
✦Commenti storici:
✦Il problema classico, con n=8, è stato studiato, fra gli altri, anche da Gauss
✦Metodo
✦Partiamo dall'approccio più stupido,e mano a mano raffiniamo la soluzione.
24
© Alberto Montresor
n Reginen Regine
✦Idea: ci sono n2 caselle dove piazzare una regina
✦Algoritmo:
✦S[1..n2] array binario S[i] = true “regina in ⇒ S[i]”
✦controllo soluzione se i = n2
✦choices(S, n, i) ritorna { true, false} se regina in S[i] non minaccia
le regine inS[1..i-1],
{ false } altrimenti
✦# soluzioni per n=8 264 ~ 1.84 · 1019
✦Commenti:
✦Forse abbiamo un problema di rappresentazione?
✦Matrice binaria molto sparsa
25
© Alberto Montresor
n Reginen Regine
✦Idea: Dobbiamo piazzare n regine, ci sono n2 caselle
✦Algoritmo
✦S[1..n] coordinate in 1..n2 S[i] coordinata della regina i
✦controllo soluzione se i = n
✦choices(S, n, i) ritorna posizioni legali
✦# soluzioni per n=8 (n2)n = 648 = 248 ~ 2.81 · 1014
✦Commenti
✦C'è un miglioramento, ma lo spazio è ancora grande...
✦Problema: una soluzione “1-7-....” come si distingue da “7-1-....” ?
26
© Alberto Montresor
n regine
✦Idea: la regina i non può stare in una casella “precedente” alla regina i-1 (S[i-1] < S[i])
✦Algoritmo
✦S[1..n] coordinate in 1..n2 S[i] coordinata della regina i
✦controllo soluzione se i = n
✦choices(S, n, i) ritorna posizioni legali, S[i-1] < S[i]
✦# soluzioni per n=8 (n2)n / n! = 648 / 40320 ~ 6.98 · 109
✦Commenti:
✦Ottimo, abbiamo ridotto molto, ma si può ancora fare qualcosa
27
© Alberto Montresor
n regine
✦Idea: ogni riga della scacchiera deve contenere esattamente una regina. Infatti non ne può contenere 2 o più, e se ne contenesse 0 un'altra riga dovrebbe contenerne 2
✦Algoritmo
✦S[1..n] valori in 1..n S[i] colonna della regina i
✦controllo soluzione se i = n
✦choices(S, n, i) ritorna le colonne “legali”
✦# soluzioni per n=8 nn = 88 ~ 1.67 · 107
✦Commenti
✦Quasi alla fine
28
© Alberto Montresor
n reginen regine
✦Idea: anche ogni colonna deve contenere esattamente una regina;i numeri 1..n devono apparire in S[1..n] come permutazione
✦Algoritmo
✦Modifichiamo l'algoritmo delle permutazioni per verificare anche le diagonali
✦# soluzioni per n=8 n! = 40320 ~ 4.03 · 104
✦# soluzioni effettivamente visitate: 15720
QuickTime™ and aGIF decompressor
are needed to see this picture.
29
© Alberto Montresor
n regine
✦Non è la soluzione migliore per ottenere una soluzione
✦Minimum-conflicts heuristic✦Si muove il pezzo con il più grande numero di conflitti nella casella delle stessa colonna con il numero minimo di conflitti✦Per n=106, circa 50 passi in media✦Assume che la soluzione iniziale sia “ragionevolmente buona”.
✦Ogni regina viene messa nella colonna che ha il numero minimo di conflitti con le regine già sulla scacchiera
✦Al contrario, se tutte le regine sono sulla stessa riga, ci vogliono almeno n-1 spostamenti
✦Questo algoritmo non garantisce che la terminazione sia sempre corretta
30
© Alberto Montresor
Giro di cavallo
✦Problema:
✦Si consideri ancora una scacchiera n·n; lo scopo è trovare un “giro di cavallo”, ovvero un percorso di mosse valide del cavallo in modo che ogni casella venga visitata al più una volta
✦Soluzione:
✦Tramite backtrack
31
© Alberto Montresor
Giro di cavalloGiro di cavallo
✦Soluzione
✦Matrice n∙n contenente le cui celle contengono ✦0 se la cella non è mai stata visitata✦i se la cella è stata visitata al passo i
✦# soluzioni: 64! ~ 1089
✦Ma: ad ogni passo ho al massimo 8 caselle possibili, quindi ne visito al più 864 ~1057
✦In realtà, grazie al pruning ne visito molto meno
32
© Alberto Montresor
Giro di cavalloGiro di cavallo
33
© Alberto Montresor
Sudoku
✦“Suuji wa dokushin ni kagiru”
34
© Alberto Montresor
Sudoku
35
© Alberto Montresor
36
© Alberto Montresor
Generazione labirintiGenerazione labirinti
Problemi Come generare un labirinto in una scacchiera n·n?
Come uscire da un labirinto?
Esempio:
37
© Alberto Montresor
Un ultimo puzzleUn ultimo puzzle
✦Problema
✦Si consideri ancora una scacchiera n·n, con n=2k
✦Qualsiasi scacchiera di questo tipo con una cella rimossa può essere ricoperta da triomini a forma di L
✦Trovare un algoritmo che trovi una possibilericopertura della scacchiera
38
© Alberto Montresor
Inviluppo convesso
✦Definizione
✦Un poligono nel piano bidimensionale è convesso se ogni segmento di retta che congiunge due punti del poligono sta interamente nel poligono stesso, incluso il bordo.
✦Inviluppo convesso (Convex hull)
✦Dati n punti p1, . . . , pn nel piano, con n ≥ 3, trovare il più piccolo poligono convesso che li contiene tutti
39
© Alberto Montresor
Inviluppo convesso
✦Un algoritmo banale ma inefficiente
✦Un poligono può essere rappresentato per mezzo dei suoi spigoli
✦Si consideri la retta che passa per una coppia di punti i,j, che divide il piano in due semipiani chiusi
✦Se tutti i rimanenti n-2 punti stanno dalla stessa parte, allora lo spigolo Sij fa parte dell’inviluppo convesso
40
© Alberto Montresor
Inviluppo convesso
41
© Alberto Montresor
Algoritmo di Graham
✦Algoritmo di Graham (1972)
✦Il punto con ordinata minima fa parte dell’inviluppo convesso
✦Si ordinano i punti in base all’angolo formato dalla retta passante per il punto con ordinata minima e la retta orizzontale
42
© Alberto Montresor
43
© Alberto Montresor
Algoritmo di Graham
44
© Alberto Montresor
Algoritmo di Graham
45
© Alberto Montresor
Algoritmo di Graham
✦Complessità
✦O(n log n), perchè dominato dalla fase di ordinamento degli angoli