Classi di Problemi Università degli Studi di Milano Marco Frasca ● Classi di problemi (decisionali, di ricerca, di ottimizzazione) ● Definizioni basate sul concetto di soluzione ammissibile: ➢ ● Diverse esigenze ➢ Contare le soluzioni ammissibili ➢ Costruire almeno una oppure tutte le soluzioni ammissibili ➢ ● una soluzione che soddisfa un certo insiemi di criteri Trovare le soluzioni ammissibili “più grandi”, “più piccole” o in generale “migliori” Esempio: ● Elencare tutti i sottoinsiemi di k elementi di un insieme S Soluzioni Università degli Studi di Milano Marco Frasca ● Enumerazione ➢ ● Costruire almeno una soluzione ➢ ● Elencare algoritmicamente tutte le soluzioni ammissibili (spazio di ricerca) Si può utilizzare 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 Soluzioni Ottimali Università degli Studi di Milano Marco Frasca Trovare le soluzioni ottimali ● Diverse possibilità, dipende dalla natura del problema ● Dove possibile uso di tecniche “efficienti”: ● ➢ Programmazione dinamica, greedy Si costruiscono tutte le soluzioni e si valuta una funzione di costo (“forza bruta”) ● Lo spazio delle soluzioni deve essere finito ➢ Fattibile solo con spazi delle soluzioni discreti ➢ Solo se è l'unica strada possibile e lo spazio delle soluzioni è finito Soluzioni Ottimali Università degli Studi di Milano Marco Frasca Inoltre esistono problemi inerentemente “complessi”, trattabili in maniera esatta solo per taglie piccole: ➢ Problema del Commesso viaggiatore (TSP) ● ➢ Un commesso viaggiatore che deve visitare n città ritornando poi a quella iniziale. Lo scopo è quello di minimizzare la distanza percorsa (e quindi il costo). Quale ordine di visita scegliamo? Problema del circuito hamiltoniano = problema del commesso viaggiatore in cui le distanze sono unitarie Soluzioni Ottimali Università degli Studi di Milano Marco Frasca ● Se si utilizza un approccio di “forza bruta” , alcuni programmi potrebbero non terminare! La potenza dei computer moderni rende “affrontabili” problemi di discrete dimensioni, ma non molto ● 10! = 3.63 · 106 permutazioni di 10 elementi ● ● 220 = 1.05 · 106 sottoinsiemi di 20 elementi Backtracking Università degli Studi di Milano Marco Frasca ● ● ● L'algoritmo di backtracking è un algoritmo di forza bruta che esplora tutto lo spazio delle soluzioni per trovare una soluzione ammissibile o per cercare quella ottima Ciononostante, talvolta si può evitare di tentare tutte le possibili soluzioni in base a criteri per capire in anticipo che delle soluzioni non possono migliorare quella attualmente calcolata Ogni soluzione ammissibile è un assegnamento delle variabili che deve rispettare (laddove ci siano) i vincoli del problema Backtracking Università degli Studi di Milano Marco Frasca ● ● ● Se S[v1..vk] è una soluzione ammissibile sulle prime k variabili Ovviamente ogni variabile può assumere un numero finito di valori Si prova un assegnamento non ancora provato per la variabile vk+1 ottenendo S[1..k+1] ➢ ➢ Se la sottosoluzione è ammissibile allora continua con la variabile successiva Altrimenti torna indietro e prova un altro valore per la variabile vk+1 Backtracking Università degli Studi di Milano Marco Frasca ● ● ● ● L'algoritmo di backtracking è inerentemente ricorsivo, ma esiste versione iterativa L’intero processo di ricerca in molti casi può essere descritto come la visita di un albero in cui ogni nodo rappresenta un sotto-obiettivo (quindi una sottosoluzione), e vi è un cammino da un sotto-obiettivo A a un sotto-obiettivo B, se B è raggiungibile dopo aver raggiunto A. I figli del nodo A sono tutti e soli i sotto-obiettivi raggiungibili direttamente (cioè cambiando il valore di una sola variabile) da A. In genere ogni livello dell'albero corrisponde all'assegnamento di una variabile Backtracking Università degli Studi di Milano Marco Frasca Spazio di ricerca finito ≡ albero di decisione Soluzioni ≡ foglie in un albero di decisione Soluzioni parziali ≡ nodi interni dell'albero di decisione Radice ≡ inizio del cammino Variabili: v1 , v2 , …..., vn ∊ {a1 , a2 , …, am} v2=a1 a1a1 v1=a1 a1 v2=a2 a1a2 v1=a2 v2=a1 a2 a2a1 v2=a2 a2a2 Backtracking Università degli Studi di Milano Marco Frasca Esempio :possibili sottoinsiemi di un insieme S = {s1, s2, ..., sm} vi := variabile binaria associata a si , per i ∊ {1, 2, …, m}. Vi = 1 se si è inserito nel sottoinsieme, 0 altrimenti. - Sottoinsieme := stringa binaria di lunghezza m - I sottoinsiemi possibili sono tutte le possibili stringhe binarie di lunghezza m, cioè 2m. Soluzioni ≡ foglie in un albero di decisione v1=1 1 v2=1 11 v3=1 101 Livello v1 v1=0 0 v2=0 10 v3=0 100 Livello v2 v2=a1 v3=1 011 v2=a2 01 00 v3=0 010 Backtracking Università degli Studi di Milano Marco Frasca Spazio di ricerca ≡ albero di decisione Esempio: Circuito Hamiltoniano vi := variabile che indica la i-ma città visitata; v i∈{a1, a 2, , am } Nelle foglie trovo tutti i modi di visitare m+1 città, anche con ripetizione A noi ne interessano solo alcune, quelle in cui ogni città compare 1 volta, ecceto la prima, due volte. v1=a1 a1 v2=a1 ............ a1a1 v1=am ................ v2=a2 a1am ............ v2=a1 am ............ ama1 ............ v2=a2 amam Backtracking Università degli Studi di Milano Marco Frasca Spesso l’albero di ricerca può essere potato: l’algoritmo usa dei criteri (euristiche) per riconoscere in anticipo alcune delle situazioni in cui la visita di un cammino (o di un sottoalbero) non porta ad alcuna soluzione; ovviamente un tale cammino (o un tale sottoalbero) viene escluso dalla ricerca. Non appena si giunge a un nodo tale che ogni ramo cui il nodo appartiene viene riconosciuto come ”vicolo cieco” (il sottoalbero di cui il nodo è radice non contiene foglie soluzione), tale nodo viene abbandonato e si risale (backtrack) nel ramo fino al nodo più profondo che ammetta mosse non ancora esplorate: da qui la ricerca riprende scegliendo un nuovo cammino attraverso una di queste mosse. Backtracking Università degli Studi di Milano Marco Frasca Esempio: Circuito Hamiltoniano I nodi a1a1 e amam sono gìà vicoli ciechi perché ogni soluzione ammissibile deve passare per ogni città una sola volta v1=a1 v2=a1 a1 ............ a1a1 v1=am ................ v2=a2 a1am ............ v2=a1 am ............ ama1 ............ v2=a2 amam Esercizio Università degli Studi di Milano Marco Frasca ● Scrivere un programma in MATLAB che utilizzando l'algoritmo backtracking risolva il problema del commesso viaggiatore semplificato,in cui cioè non bisogna tornare nella città di partenza. Provare per n= 3, 5, 10 città. Il programma deve restituire uno dei cammino ottimali ed il suo costo ● Rappresentare le strade tra le città come matrice delle connessioni W. W simmetrica ovviamente. ➢ Wij := lunghezza della strada che collega direttamente la città i e la città j ➢ Wij := -1 se non esiste collegamento diretto tra città i e j Esercizio Università degli Studi di Milano Marco Frasca 1 2 2 2 1,5 3 Livello v1 Livello v2 1,5 Init = 1 N=2,3 k = 2, Visita sottoalbero Soluzione 2+3,5 k=3 Visita sottoalbero Soluzione 1,5+3,5 4 v2=1 v1=2 v3=1 v3=2 v2=4 v1=3 12 2 v3=4 v3=3 v4=1 v4=2 v1=1 1 124 4 v4=4 2 v1=2 4 3 v3=1 1,513 v3=4 v3=2 v3=3 v4=1 3,5 134 v4=4 v4=2 v4=3 v4= 3 1243 5,5 v1=4 v1=3 1342 5