Algoritmi e Strutture Dati. Backtracking

Documenti analoghi
Informatica II. Capitolo 16 Backtrack

Il problema dello zaino

Esercizi di Algoritmi e Strutture Dati

Problemi, istanze, soluzioni

Algoritmi e Strutture Dati. Alberi

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

Algoritmi e Strutture Dati

Parte III: Algoritmo di Branch-and-Bound

Il passo del gambero. La soluzione di problemi con la tecnica del Backtracking. Ugo de' Liguoro - Algoritmi e Sperimentazioni 03/04 - Lez.

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

Esercizi vari. Alberto Montresor. 19 Agosto, 2014

Esercizi Capitolo 10 - Code con priorità e insiemi disgiunti

METODI DELLA RICERCA OPERATIVA

Alberto Montresor Università di Trento

Algoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione

LE STRUTTURE DATI DINAMICHE: GLI ALBERI. Cosimo Laneve

Esercizi di Algoritmi e Strutture Dati

Il problema del commesso viaggiatore

ESERCIZI SULLA TECNICA BACKTRACKING e BRANCH & BOUND

Problemi di ordinamento

Metodi di Ottimizzazione per la Logistica e la Produzione

Tecniche Algoritmiche /2 Paradigma selettivo: la tecnica enumerativa e la tecnica di backtracking

Dati e Algoritmi I (Pietracaprina) Esercizi sulle Nozioni di Base

Espressioni aritmetiche

3.4 Metodo di Branch and Bound

Problema del cammino minimo

Programmazione Procedurale in Linguaggio C++

Ottimizza la somma. Supponete di avere in input un vettore di n interi positivi distinti V [1... n] e un valore W. Scrivere un algoritmo che:

Note per la Lezione 4 Ugo Vaccaro

Esercizi Capitolo 6 - Alberi binari di ricerca

Intelligenza Artificiale

Algoritmi e Strutture Dati

Algoritmi di ordinamento

Cammini minimi fra tutte le coppie

Algoritmi di Ricerca

Informatica Generale Homework di Recupero 2016

Alberi binari e alberi binari di ricerca

2.2 Alberi di supporto di costo ottimo

Algoritmi e Strutture Dati. Introduzione

Algoritmi e Strutture Dati (Mod. B) Algoritmi Greedy (parte I)

Algoritmi e Strutture Dati Geometria Computazionale. Daniele Loiacono

Implementazione ADT: Alberi

Strutture dati per insiemi disgiunti

Esercitazione. Ricorsione. May 31, Esercizi presi dal libro di Rosen

Grafi: visita generica

Strutture dati e loro organizzazione. Gabriella Trucco

Introduzione alla programmazione lineare

Grafi pesati Minimo albero ricoprente

GLI ALBERI BINARI DI RICERCA. Cosimo Laneve

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Lezione 7 Alberi binari: visite e alberi di ricerca

Alberi e alberi binari I Un albero è un caso particolare di grafo

Algoritmi e Strutture Dati

Algoritmi e giochi combinatori

2.2 Alberi di supporto di costo ottimo

Algoritmi e loro proprietà. Che cos è un algoritmo? Un esempio di algoritmo

Algoritmi e strutture di dati 2

Triangolazione di Delaunay

Dati e Algoritmi I (Pietracaprina) Esercizi su Alberi Binari di Ricerca e (2,4)-Tree

Fondamenti di Informatica. Algoritmi di Ricerca e di Ordinamento

Heap e code di priorità

Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

Laboratorio di Programmazione Appunti sulla lezione 4: Divide et impera e algoritmi di ordinamento

Definizione FONDAMENTI DI INFORMATICA. Esempio di algoritmo: determinare il maggiore di due numeri interi x, y. Proprietà degli algoritmi

Programmazione Orientata agli Oggetti in Linguaggio Java

Laboratorio di Algoritmi e Strutture Dati. Code con Priorità

ALGORITMI DI OTTIMIZZAZIONE M Esercizi Parte I

Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output

2.3 Cammini ottimi. E. Amaldi Fondamenti di R.O. Politecnico di Milano 1

Transcript:

Algoritmi e Strutture Dati Backtracking Alberto Montresor Università di Trento 2016/12/08 This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

Sommario 1 Introduzione 2 Enumerazione Sottoinsiemi Permutazioni Giochi 3 Backtracking iterativo Inviluppo convesso

Introduzione Introduzione Classi di problemi (decisionali, di ricerca, di ottimizzazione) Definizioni basate sul concetto di soluzione ammissibile: una soluzione che soddisfa un certo insieme di criteri Problemi tipici Costruire almeno una o tutte le soluzioni ammissibili Contare le soluzioni ammissibili Trovare le soluzioni ammissibili "più grandi", "più piccole" o in generale "ottimali" Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 1 / 49

Introduzione Problemi tipici Enumerazione Elencare algoritmicamente tutte le soluzioni ammissibili (spazio di ricerca) Esempio: elencare tutte le permutazioni di un insieme Costruire almeno una soluzione Si utilizza l algoritmo per l enumerazione, fermandosi alla prima soluzione disponibile Esempio: identificare una sequenza di mosse nel gioco del 15 Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 2 / 49

Introduzione Problemi tipici Contare le soluzioni In alcuni casi, è possibile contare in modo analitico Esempio: contare il numero di sottoinsiemi di k elementi presi da un insieme di n elementi n! k! (n k)! In altri casi, si costruiscono le soluzioni e si contano Esempio: numero di sottoinsiemi di un insieme di interi S la cui somma è un numero primo. Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 3 / 49

Introduzione Problemi tipici Trovare le soluzioni ottimali Si enumerano tutte le soluzioni, che vengono valutate tramite una funzione di costo Si possono utilizzare altre tecniche: Programmazione dinamica, greedy Tecniche risolutive per problemi intrattabili Esempio: Circuito hamiltoniano (commesso viaggiatore) Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 4 / 49

Introduzione Costruire tutte le soluzioni Per costruire tutte le 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" problemi di dimensioni medio-piccole 10! = 3.63 10 6 (permutazione di 10 elementi) 2 20 = 1.05 10 6 (sottoinsieme di 20 elementi) Inoltre, a volte lo spazio delle soluzioni non deve essere analizzato interamente Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 5 / 49

Introduzione Backtracking Filosofia "Prova a fare qualcosa, e se non va bene, disfalo e prova qualcos altro" "Ritenta, e sarai più fortunato" 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 Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 6 / 49

Introduzione Organizzazione generale Organizzazione generale Esempi 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 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 Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 7 / 49

Introduzione Soluzioni parziali Ad ogni passo, partiamo da una soluzione parziale S[1... k] in cui k 0 scelte sono state prese Se S[1... k] è una soluzione ammissibile, la "processiamo" Viene stampata, contata, evaluata Si può decidere di terminare o continuare elencando tutte le soluzioni Se S[1... k] non è una soluzione completa Se è possibile, estendiamo S[1... k] con una delle possibili scelte in una soluzione S[1... k + 1] Altrimenti, "cancelliamo" l elemento S[k] (backtrack) e ripartiamo dalla soluzione S[1... k 1] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 8 / 49

Introduzione Albero delle decisioni Albero di decisione Spazio di ricerca Radice Soluzione parziale vuota Nodi interni dell albero di decisione Soluzioni parziali Foglie in un albero di decisione Soluzioni ammissibili S[0] S[3] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 9 / 49

Introduzione Albero delle decisioni Albero di decisione Spazio di ricerca Radice Soluzione parziale vuota Nodi interni dell albero di decisione Soluzioni parziali Foglie in un albero di decisione Soluzioni ammissibili S[0] S[1] S[3] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 9 / 49

Introduzione Albero delle decisioni Albero di decisione Spazio di ricerca Radice Soluzione parziale vuota Nodi interni dell albero di decisione Soluzioni parziali Foglie in un albero di decisione Soluzioni ammissibili S[0] S[1] S[2] S[3] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 9 / 49

Introduzione Albero delle decisioni Albero di decisione Spazio di ricerca Radice Soluzione parziale vuota Nodi interni dell albero di decisione Soluzioni parziali Foglie in un albero di decisione Soluzioni ammissibili S[0] S[1] S[2] S[3] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 9 / 49

Introduzione Albero delle decisioni Albero di decisione Spazio di ricerca Radice Soluzione parziale vuota Nodi interni dell albero di decisione Soluzioni parziali Foglie in un albero di decisione Soluzioni ammissibili S[0] S[1] S[2] S[3] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 9 / 49

Introduzione Albero delle decisioni Albero di decisione Spazio di ricerca Radice Soluzione parziale vuota Nodi interni dell albero di decisione Soluzioni parziali Foglie in un albero di decisione Soluzioni ammissibili S[0] S[1] S[2] S[3] S[3] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 9 / 49

Introduzione Albero delle decisioni Albero di decisione Spazio di ricerca Radice Soluzione parziale vuota Nodi interni dell albero di decisione Soluzioni parziali Foglie in un albero di decisione Soluzioni ammissibili S[0] S[1] S[2] S[3] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 9 / 49

Introduzione Albero delle decisioni Albero di decisione Spazio di ricerca Radice Soluzione parziale vuota Nodi interni dell albero di decisione Soluzioni parziali Foglie in un albero di decisione Soluzioni ammissibili S[0] S[1] S[3] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 9 / 49

Introduzione Albero delle decisioni Albero di decisione Spazio di ricerca Radice Soluzione parziale vuota Nodi interni dell albero di decisione Soluzioni parziali Foglie in un albero di decisione Soluzioni ammissibili S[0] S[1] S[2] S[3] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 9 / 49

Introduzione Albero delle decisioni Albero di decisione Spazio di ricerca Radice Soluzione parziale vuota Nodi interni dell albero di decisione Soluzioni parziali Foglie in un albero di decisione Soluzioni ammissibili S[0] S[1] S[2] S[3] S[3] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 9 / 49

Introduzione Pruning 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 Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 10 / 49

Introduzione Pruning 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 Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 10 / 49

Introduzione 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 tornando sui propri passi Esempio: Inviluppo convesso Esempio: String matching Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 11 / 49

Sommario 1 Introduzione 2 Enumerazione Sottoinsiemi Permutazioni Giochi 3 Backtracking iterativo Inviluppo convesso

Enumerazione Enumerazione boolean enumeration(item[ ] S, int n, int i,... ) Set C choices(s, n, i,...) % Determina C in funzione di S[1... i 1] foreach c C do S[i] c if isadmissible(s, n, i) then if processsolution(s, n, i,...) then return true if enumeration(s, n, i + 1,...) then return true return false Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 12 / 49

Enumerazione Enumerazione S: vettore contenente le soluzioni parziali S[1... i] i: indice corrente...: informazioni addizionali C è l insieme dei possibili candidati per estendere la soluzione isadmissible(): restituisce true se S[1... i] è una soluzione ammissibile processsolution(): restituisce true per bloccare l esecuzione alla prima soluzione ammissibile, false per esplorare tutto l albero Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 13 / 49

Enumerazione Sottoinsiemi Esempio 1 Elencare tutti i sottoinsiemi dell insieme {1,..., n} subsets(int[ ] S, int n, int i) Set C iif(i n, {0, 1}, ) foreach c C do S[i] c if i = n then processsolution(s, n) subsets(s, n, i + 1) Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 14 / 49

Enumerazione Sottoinsiemi Esempio 1 (Versione più "pulita") Elencare tutti i sottoinsiemi dell insieme {1,..., n} subsets(int[ ] S, int n, int i) foreach c {0, 1} do S[i] c if i = n then processsolution(s, n) else subsets(s, n, i + 1) Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 15 / 49

Enumerazione Sottoinsiemi Esempio 1 Non c è pruning. Tutto lo spazio possibile viene esplorato. Ma questo avviene per definizione Complessità O(n2 n ) In che ordine vengono stampati gli insiemi? E possibile pensare ad una soluzione iterativa, ad-hoc? (non-backtracking) Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 16 / 49

Enumerazione Sottoinsiemi Esempio 1 subsets(int n) for j 0 to 2 n 1 do print { for i 0 to n 1 do if (j and 2 i ) 0 then print i print } Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 17 / 49

Enumerazione Sottoinsiemi Esempio 2 Elencare tutti i sottoinsiemi di dimensione k di un insieme {1,..., n} Versione iterativa Qual è il costo? Soluzione basata su backtracking Possiamo potare? Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 18 / 49

Enumerazione Sottoinsiemi Esempio 2 - Tentativo 1 subsets(int[ ] S, int n, int k, int i) Set C iif(i n, {0, 1}, ) foreach c C do S[i] c if i = n then int count 0 for j 1 to n do count count + S[j] if count = k then processsolution(s, n) subsets(s, n, k, i + 1) Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 19 / 49

Enumerazione Sottoinsiemi Esempio 2 - Tentativo 2 subsets(int[ ] S, int n, int k, int i, int count) Set C iif(i n, {0, 1}, ) foreach c C do S[i] c count count + S[i] if i = n and count = k then processsolution(s, n) subsets(s, n, k, i + 1, count) count count S[i] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 20 / 49

Enumerazione Sottoinsiemi Esempio 2 - Tentativo 3 (Corretto) subsets(int[ ] S, int n, int k, int i, int count) Set C = iif(count < k and count + (n i + 1) k, {0, 1}, ) foreach c C do S[i] c count count + S[i] if count = k then processsolution(s, i) else subsets(s, n, k, i + 1, count) count count S[i] Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 21 / 49

Enumerazione Sottoinsiemi Esempio 2: 2: vantaggi vantaggi Alberto Montresor Montresor (UniTN) ASD - Backtracking 2016/12/08 22 / 4920

Enumerazione Sottoinsiemi 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 Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 23 / 49

Enumerazione Permutazioni Esempio 3 Stampa di tutte le permutazioni di un insieme A L insieme dei candidati dipende dalla soluzione parziale corrente permutations(set A, int n, Item[ ] S, int i) foreach c A do S[i] c A.remove(c) if A.isEmpty() then processsolution(s, n) else permutations(a, n, S, i + 1) A.insert(c) Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 24 / 49

Enumerazione Giochi Problema delle otto regine Problema Posizionare n regine in una scacchiera n n, in modo tale che nessuna regina ne "minacci" un altra. Un po di storia: Introdotto da Max Bezzel (1848) Gauss trovò 72 delle 92 soluzioni Partiamo dall approccio più stupido, e mano a mano raffiniamo la soluzione. Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 25 / 49

Enumerazione Giochi Problema delle otto regine Idea: Ci sono n 2 caselle dove piazzare una regina S[1..n 2 ] array binario controllo soluzione se i = n 2 choices(s, n, i) pruning S[i] = true "regina in S[i]" {true, false} # soluzioni per n = 8 2 64 1.84 10 19 Commenti se la nuova regina minaccia una delle regine esistenti, restituisce Forse abbiamo un problema di rappresentazione? Matrice binaria molto sparsa Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 26 / 49

Enumerazione Giochi Problema delle otto regine Idea: Dobbiamo piazzare n regine, ci sono n 2 caselle S[1... n] coordinate in {1... n 2 } S[i] coordinata della regina i controllo soluzione se i = n choices(s, n, i) {1... n 2 } pruning restituisce il sottoinsieme di mosse legali # soluzioni per n = 8 (n 2 ) n = 64 8 = 2 48 2.81 10 14 Commenti C è un miglioramento, ma lo spazio è ancora grande... Problema: come si distingue una soluzione "1-7-... " da "7-1-... "? Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 27 / 49

Enumerazione Giochi Problema delle otto regine Idea: non mettere regine in caselle precedenti a quelle già scelte S[1... n] coordinate in {1... n 2 } controllo soluzione S[i] coordinata della regina i se i = n choices(s, n, i) {1... n 2 } pruning restituisce mosse legali, S[i] > S[i 1] # soluzioni per n = 8 (n 2 ) n /n! = 2 48 /40320 6.98 10 9 Commenti Ottimo, abbiamo ridotto molto, ma si può ancora fare qualcosa Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 28 / 49

Enumerazione Giochi Problema delle otto regine Idea: ogni riga della scacchiera deve contenere esattamente una regina S[1... n] coordinate in {1... n} controllo soluzione S[i] colonna della regina i, dove riga = i se i = n choices(s, n, i) {1... n} pruning restituisce le colonne legali # soluzioni per n = 8 n n = 8 8 1.67 10 7 Commenti Quasi alla fine Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 29 / 49

Enumerazione Giochi Problema delle otto regine Idea: anche ogni colonna deve contenere esattamente una regina S[1... n] coordinate in {1... n} controllo soluzione permutazione di {1... n} se i = n choices(s, n, i) {1... n} pruning elimina le diagonali # soluzioni per n = 8 n! = 8! = 40320 Commenti Soluzioni effettivamente visitate = 15720 Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 30 / 49

Enumerazione Giochi Problema delle otto regine Minimum-conflicts heuristic Si parte da una soluzione iniziale ragionevolmente buona, e si muove il pezzo con il più grande numero di conflitti nella casella della stessa colonna che genera il numero minimo di conflitti. Si ripete fino a quando non ci sono più pezzi da muovere. Algoritmo in tempo lineare Ad esempio, con n = 1, 000, 000, richiede 50 passi in media Questo algoritmo non garantisce che la terminazione sia sempre corretta Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 31 / 49

Enumerazione Giochi lo 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 deri ancora una scacchiera n n; lo scopo è trovare un giro di cavallo, n percorso di mosse valide del cavallo in modo che ogni casella venga al più una volta backtrack Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 30 32 / 49

Enumerazione Giochi Giro di cavallo Soluzione Matrice n n le cui celle contengono: 0 se la cella non è mai stata visitata i se la cella è stata visitata al passo i-esimo # soluzioni: 64! 10 89 Ma: ad ogni passo ho al massimo 8 caselle possibili, quindi ne visito al più 8 64 10 57 In realtà, grazie al pruning ne visito molto meno Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 33 / 49

Enumerazione Giochi Giro di cavallo boolean cavallo(int[ ][ ] S, int i, int x, int y) Set C mosse(s, x, y) foreach c C do S[x, y] i if i = 64 then processsolution(s) return true else if cavallo(s, i + 1, x + m x [c], y + m y [c]) then return true; S[x, y] 0 return false Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 34 / 49

Enumerazione Giochi Giro di cavallo Set mosse(int[ ][ ] S, int x, int y) Set C Set() for int i 1 to 8 do n x x + m x [i] n y y + m y [i] if 1 n x 8 and 1 n y 8 and S[n x, n y ] = 0 then C.insert(i) return C m x { 1, +1, +2, +2, +1, 1, 2, 2} m y { 2, 2, 1, +1, +2, +2, +1, 1} Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 35 / 49

Enumerazione Giochi Sudoku - "Suuji wa dokushin ni kagiru" 2 5 9 7 6 2 4 1 5 3 9 8 9 4 5 2 6 1 2 4 2 5 6 7 3 8 3 2 1 9 7 3 7 8 9 2 2 5 3 8 9 1 4 7 6 8 9 7 2 6 4 3 1 5 6 4 1 5 7 3 9 2 8 7 8 9 4 3 5 2 6 1 1 3 6 7 2 9 8 5 4 4 2 5 6 1 8 7 3 9 9 6 8 3 5 2 1 4 7 5 1 2 9 4 7 6 8 3 3 7 4 1 8 6 5 9 2 Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 36 / 49

Enumerazione Giochi Sudoku boolean sudoku(int[ ][ ] S, int i) int x i mod 9 int y i/9 Set C Set() if i 80 then if S[x, y] 0 then C.insert(S[x, y]) else for c 1 to 9 do if check(s, x, y, c) then C.insert(c) int old S[x, y] foreach c C do S[x, y] c if i = 80 then processsolution(s, n) return true if sudoku(s, i + 1) then return true S[x, y] old return false Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 37 / 49

Enumerazione Giochi Sudoku boolean check(int[ ][ ] S, int x, int y, int c) for j 0 to 8 do if S[x, j] = c then return false if S[j, y] = c then return false % Controllo sulla colonna % Controllo sulla riga int b x x/3 int b y y/3 for i x 0 to 2 do for int i y 0 to 2 do % Controllo sulla sottotabella if S[b x 3 + i x, b y 3 + i y ] = c then return false return true Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 38 / 49

u Generazione labirinti u Problemi u Enumerazione Giochi Come generare un labirinto in una scacchiera n n? Come uscire da un labirinto? Problemi u Esempio: Come generare un labirinto in una griglia n n? Come uscire da un labirinto? Alberto Montresor Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 39 / 49

Enumerazione Giochi Un ultimo puzzle Problema Si consideri una scacchiera n n, con n = 2 k Qualsiasi scacchiera di questo tipo con una cella rimossa può essere ricoperta da triomini a forma di L Trovare un algoritmo che trovi una possibile ricopertura della scacchiera Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 40 / 49

Sommario 1 Introduzione 2 Enumerazione Sottoinsiemi Permutazioni Giochi 3 Backtracking iterativo Inviluppo convesso

Backtracking iterativo Inviluppo convesso Inviluppo convesso Poligono convesso Un poligono nel piano è convesso se ogni segmento di retta che congiunge due punti del poligono sta interamente nel poligono stesso, incluso il bordo. Inviluppo convesso Dati n punti p 1,..., p n nel piano, con n 3, l inviluppo convesso (convex hull) è il più piccolo poligono convesso che li contiene tutti? a) b) c) d) Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 41 / 49

Backtracking iterativo Inviluppo convesso Algoritmo inefficiente O(n 3 ) Un poligono può essere rappresentato per mezzo dei suoi spigoli Si consideri la retta che passa per una coppia di punti p i, p j, che divide il piano in due semipiani chiusi Se tutti i rimanenti n 2 punti stanno "dalla stessa parte", allora lo spigolo S ij fa parte dell inviluppo convesso i S ij i S ij j j a) OK b) KO Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 42 / 49

Backtracking iterativo Inviluppo convesso Stessa parte Data una retta definita dai punti p 1 e p 2, determinare se due punti p e q stanno nello stesso semipiano definito dalla retta. boolean stessaparte(point p 1, point p 2, point p, point q) float dx p 2.x p 1.x float dy p 2.y p 1.y float dx 1 p.x p 1.x float dy 1 p.y p 1.y float dx 2 q.x p 2.x float dy 2 q.y p 2.y return ((dx dy 1 dy dx 1 ) (dx dy 2 dy dx 2 ) 0) Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 43 / 49

Backtracking iterativo Inviluppo convesso Algoritmo di Graham Fase 1 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 12 10 8 14 13 11 9 7 6 4 5 15 3 α 2 1 Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 44 / 49

Backtracking iterativo Inviluppo convesso Algoritmo di Graham Stack graham(point[ ] p, int n) int min 1 for i 2 to n do if p[i].y < p[min].y then min i p[1] p[min] { riordina p[2,... n] in base all angolo formato rispetto all asse orizzontale quando sono connessi con p[1] } { elimina eventuali punti allineati tranne i più lontani da p 1, aggiornando n } Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 45 / 49

Backtracking iterativo Inviluppo convesso Algoritmo di Graham Fase 2 Inserisci p 1, p 2 nell inviluppo corrente Per tutti i punti p i = 3,..., n: siano p h e p j, con h < j = i 1, gli ultimi due vertici dell inviluppo corrente scandisci a ritroso i punti nell inviluppo corrente ed elimina p j se stessaparte(p j, p h, p 1, p i ) = false; termina tale scansione se p j non deve essere eliminato; aggiungi p i all inviluppo corrente Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 46 / 49

Backtracking iterativo Inviluppo convesso Algoritmo di Graham 12 13 14 15 12 10 8 10 9 13 9 5 11 6 14 7 11 7 4 3 2 15 1 1 i = 3 i = 4 8 6 3 4 2 5 12 13 14 15 12 10 8 10 8 9 13 9 5 11 6 14 11 6 7 4 4 5 7 3 3 2 15 2 1 1 i = 5 i = 8 Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 47 / 49

Backtracking iterativo Inviluppo convesso Algoritmo di Graham Stack graham(point[ ] p, int n) (continua) Stack S Stack() S.push(p 1 ); S.push(p 2 ) for i 3 to n do while not stessaparte(s.top(), S.top2(), p 1, p i ) do S.pop() S.push(p i ) return S Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 48 / 49

Backtracking iterativo Inviluppo convesso Algoritmo di Graham Complessità O(n log n), dominato dall ordinamento Alberto Montresor (UniTN) ASD - Backtracking 2016/12/08 49 / 49