Lezione n°16 Prof.ssa Rossella Petreschi Lezione del 28/11/2014 del Corso di Algoritmica
Forza Bruta vs Backtrack Genera tutte le t-ple m1,m2,…mk Per ogni t-pla verifica se soddisfa la funzione P (x1,x2,…xn) Salva le t-ple che rappresentano la soluzione ottima Backtrack: Costruisce i vettori soluzione una componente alla volta All’i-esimo passo, confronta il sottovettore v= (x1,x2,…xi) con la funzione parziale P (x1,x2,…xi) per vedere se c’è una possibilità che v diventi sottovettore di una soluzione ottima.Se questa possibilità non c’è interrompi la costruzione di quell’ipotesi di soluzione. Backtrack riduce il numero di test da fare per trovare le soluzioni ottime. 2
Il metodo in generale Un algoritmo di backtracking è un metodo di analisi esaustiva, ma controllata, applicabile ad una classe di problemi di ricerca le cui soluzioni sono vettori (x1 x2 … xi …xf), 1≤f≤n, soddisfacenti alcuni vincoli predefiniti. Ogni xi appartiene ad un insieme finito linearmente ordinato Xi. Un algoritmo di backtracking genera, esplicitamente o implicitamente, un albero i cui nodi rappresentano t-ple parzialmente costruite durante i vari passi dell’algoritmo. La radice contiene la t-pla vuota. 3
Il metodo Quando si applica: Ricercare un insieme di soluzioni in genere la soluzione è esprimibile come t-pla (x1,x2,…xn) con xi in un insieme finito Si Ricercare una soluzione ottima soddisfacente alcuni vincoli ovvero massimizare (o minimizzare) una funzione P (x1,x2,…xn) Esempio: Problema: ordinare un vettore a di n interi Soluzione: esprimibile come t-pla (xi è l’indice in a dell’i-esimo elemento più piccolo) La funzione P è la diseguaglianza a(xi) ≤ a(xi+1), 1≤i<n L’ordinamento non è un problema che si risolve normalmente con il backtracking, ma è un tipico problema la cui soluzione è una t-pla.
Vincoli Vincoli espiciti: Sono regole che restringono xi a prendere valori in un intervallo limitato e dipendono dalla particolare istanza I del problema considerato. Lo spazio delle soluzioni per I è costituito da tutte le t-ple che soddisfano i vincoli espliciti Esempi: xi ≤ 0; li ≤ xi≤ ri ; xi in Si ={0.1} Vincoli impliciti: Sono regole che stabiliscono quali fra le t-ple nello spazio delle soluzioni di I soddisfano la funzione P; un vincolo implicito esprime il modo in cui le variabili xidebbono correlarsi. 5
Dalla t-pla j-esima alla j+1-esima A partire dalla t-pla j-esima w = (x1 x2 … xj) , si genera la t-pla (j+1)-esima v = (x1 x2 … xj+1) con xj+1 primo elemento in Xj+1 non ancora considerato. Si ha: v è una soluzione finale del problema: la soluzione viene memorizzata (termina se una soluzione è sufficiente) v è una soluzione parziale del problema: l’algoritmo passa dalla t-pla j+1-esima alla t-pla j+2-esima v non è né soluzione finale né soluzione parziale: - se vi sono ancora elementi da scegliere in Xj+1, si prende il primo disponibile come nuovo xj+1 e si torna al passo 1; - se non vi sono più elementi da scegliere in Xj+1, ,si torna alla t-pla j-esima, si sostituisce xj con il primo elemento elegibile in Xj e si torna al passo 1. Se ancora non vi sono più elementi da scegliere, si torna alla t-pla (j-1)-esima e si sostituisce xj-1, se possibile. 6
Il problema delle 8 regine Come disporre otto regine su una scacchiera (8×8) in modo tale che nessuna possa mangiarne un’altra? REGOLE: la regina si può muovere in orizzontale, in verticale e in diagonale di un qualunque numero di caselle, di conseguenza ogni regina deve avere la propria riga, la propria colonna e le proprie diagonali libere. Le dodici soluzioni base del problema delle 8 regine da cui, per riflessione e rotazione, si ottengono tutte le 92 soluzioni (1874, Gleisher e Gunther) 1 5 8 6 3 7 2 4 1 7 5 8 2 4 6 3 2 5 7 4 1 8 6 3 2 7 3 6 8 5 1 4 1 6 8 3 7 4 2 5 2 4 6 8 3 1 7 5 2 6 1 7 4 8 3 5 2 7 5 8 1 4 6 3 1 7 4 6 8 2 5 3 2 5 7 1 3 8 6 4 2 6 8 3 1 4 7 5 2 8 6 1 3 5 7 4 7
Una soluzione 15863724 8
Caso (4x4) 9
Caso (4x4) 10
Backtrack per le 8 regine Vincoli espliciti: Si ={1,2,3,4,5,6,7,8} 1 ≤ i ≤ 8 Conseguentemente lo spazio delle soluzioni è di 88 8-ple Vincoli impliciti: Tutte le regine debbono essere in colonne differenti Conseguentemente lo spazio delle soluzioni è costituito da tutte le permutazioni delle 8-ple {1,2,3,4,5,6,7,8} e quindi è ridotto da 88 a 8! Tutte le regine debbono essere in diagonali differenti 11
Regine sulle stesse diagonali La scacchiera S è rappresentata da una matrice quadrata di dimensioni nxn. Le righe e le colonne sono numerate da 1ad n. si considerino due regine nelle posizioni (i,j) e (k,l), rispettivamente. Tutte le diagonali dall’alto a sinistra verso in basso a destra mantengono costante numero colonna - numero riga per esempio S[2,1], S[3,2], S[4,3] hanno 1 quale valore costante pari alla differenza fra numero di riga e numero di colonna. Tutte le diagonali dall’alto a destra verso in basso a sinistra mantengono costante numero colonna + numero riga per esempio S[2,4], S[3,3], S[4,2] hanno 6 quale valore costante pari alla somma fra numero di riga e numero di colonna. Quindi due regine sono sulla stessa diagonale sess j-l =i-k Dato che vale o (1) i-j = k-l o (2) i+j = k+l Dalla (1) si ha j-l = i-k e dalla (2) si ha j-l = k-i 12
Procedura n-regine Procedura N-regine(k,n) stampa tutte i possibili posizionamenti senza conflitto di n regine su una scacchiera nxn (si inizia con k=1) procedura N-regine(k,n) For i=1 to n do if PLACE(k,i) then x[k] = i; if k=n then write x[1…n]; else N-regine(k+1,n); 13
Controllo del posizionamento PLACE(k,i) ritorna vero se la k-esima regina può essere posizionata nella k-esima riga e i-esima colonna della matrice rappresentativa della scacchiera; la regina in posizione (k,i) non si trovi sulla stessa diagonale con le regine in posizione (j, x(j)); ritorna falso, altrimenti. PLACE(k,i) For j=1 to k-1 do l = x[j] if l = i or j-k=i-l then return false; return true; 14
Somma di sottoinsiemi INPUT: m>0 , W =(w1w2 … wn), wi>0 (1≤i≤n) PROBLEMA: trovare tutti i sottoinsiemi di W la cui somma sia uguale ad m ESEMPIO: dati (w1w2 w3 w4 ) = (11,13,24,7) e m =31, i sottoinsiemi cercati sono (11,13,7) e (24,7) Queste due soluzioni si possono indicare come t-ple: xi = indici dei wi scelti (1,2,4) e (3,4), ovvero con t-ple di diversa dimensione; xi = 1 / 0 a seconda che wi sia stato selezionato o no (1,1,0,1) e (0,0,1,1), in questo caso le t-ple sono di dimensione fissata uguale ad n. VINCOLI ESPLICITI: xi in j/ j intero, 1≤j≤k e 1≤k≤n xi in 0,1 VINCOLI IMPLICITI: xi ≠ xj e xi ≤ xi+1 per 1≤ i <k e 1≤j≤k ∑wixi ≤ m 1≤ i <k, 1≤k≤n SPAZIO DELLE SOLUZIONI: 2n t-ple distinte 15
La tecnica del Branch and Bound E’ usata per problemi di ottimizzazione. Rispetto al Backtracking richiede in più per ogni nodo: di poter calcolare un limite superiore (o inferiore) rispetto al valore delle soluzioni ammissibili raggiungibili da quel nodo; di conoscere il valore della migliore soluzione calcolata fino a quel momento. Una soluzione ottima è una soluzione ammissibile che raggiunge il miglior valore per la funzione obiettivo. 16
L’albero degli stati Nell’albero degli stati classifichiamo i nodi in tre tipi a seconda che rappresentino genericamente uno stato del problema, uno stato soluzione o uno stato risposta. Uno stato soluzione è uno stato s del problema per il quale il cammino da dalla radice ad s definisce una t-pla nello spazio delle soluzioni (spazio delle soluzioni:tutti i cammini dalla radice agli altri nodi). Uno stato risposta è uno stato soluzione la cui t-pla appartiene all’insieme delle soluzioni. Una volta che si è stabilita la natura dell’albero degli stati, il problema si risolve generando sistematicamente gli stati del problema, determinando quali di questi siano stati soluzione e infine quali siano stati risposta 17
Come generare l’albero degli stati NodoE: Nodo vivo o da espandere, ovvero nodo i cui figli debbono ancora essere generati. Nodo morto: nodo che non può più essere espanso perché non ha figli da generare o perché una qualche funzione soglia lo ha ucciso. Backtracking: generazione dell’albero tramite DFS con funzione soglia. Branch and Bound: tutti i figli di un nodoE sono generati prima che un altro nodo sia considerato da espandere. La lista dei nodi da espandere può essere memorizzata tramite struttura FIFO (BFS) o tramite struttura LIFO(DS) 18
Criteri di terminazione L’espansione dell’albero su un ramo termina quando: il valore del limite in quel nodo non è migliore di quello della migliore soluzione ottenuta fino a quel momento; la soluzione rappresentata dal nodo viola i vincoli (non è ammissibile); il nodo non ha più figli verso cui espandersi. 19