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