In questo progetto si implementa un risolutore sequenziale alla versione decisionale del problema difficile Vertex Cover, sfidando l'intrattabilità sfruttando particolari proprietà del problema.
Dettagli del progetto:
- Realizzazione del algoritmo bruteforce ricorsivo e quello ottimizzato
- Realizzazione di benchmark prestazionali
2. Descrizione del Problema
VertexCover
Che cos’è?
Dato un grafo 𝐺 = 𝑉, 𝐸 un insieme 𝑆 ⊂ 𝑉 è un insieme di vertici che ricopre 𝐺 se
ogni arco 𝑒 ∈ 𝐸 ha almeno un dei suoi vertici in 𝑆
Esempio di Applicazione
Eseguire flooding efficiente in una Rete Ad Hoc composta da nodi mobili
Trovare un insieme di nodi (MPRSet) a distianza 1-hop che riesce a coprire tutti i
nodi a distanza 2-hop
Come si risolve?
È un problema NP-HARD, nella pratica si usa un algoritmo approssimato
3. Obiettivi del Progetto
Analizzare le complessità di VertexCover
BruteForce
RecursiveVC
Creare una Test Suite per fare il benchmarking sui tempi
Commentare i risultati ottenuti
5. Come trattare l’intrattabile
Riflessioni sul problema
1. Se 𝐺 = (𝑉, 𝐸) ha un insieme ricoprente di taglia 𝑘 allora 𝐸 ≤ 𝑘(𝑛 − 1),
dove 𝑛 = |𝑉|
2. Sia 𝑒 = (𝑢, 𝑣) un arco di 𝐺. Il grafo 𝐺 ha un insieme ricoprente di taglia
𝑘 se e solo se almeno uno dei grafi 𝐺/{𝑢} e 𝐺/ 𝑣 ha un insieme
ricoprente di taglia 𝑘 − 1
7. Test Suite – 1
Per poter effettuare l’analisi dei tempi consideriamo i fattori:
|V| : Numero di nodi
K : Dimensione del VertexCover
|E| : Numero di archi, al variare della densità del grafo
Abbiamo generato un dataset di 9 grafi per ogni |V| fissata
25 – 30 – 35 nodi
0.1 0.4 0.7
0.2 0.5 0.8
0.3 0.6 0.9
numero di archi al variare della densità 𝐷𝑖
𝐷𝑖 =
2 |𝐸|
|𝑉|( |𝑉|−1 )
𝐸 = 𝐷𝑖
|𝑉|( 𝑉 −1)
2
Istanze
Densità
8. Definite le istanze, lanciamo l’algoritmo verificando l’esistenza di un
VertexCover di taglia :
K piccolo = 𝐾𝑝 =
1
5
|𝑉|
K medio = 𝐾 𝑚 =
1
2
|𝑉|
K grande = 𝐾𝑔 =
4
5
|𝑉|
Istanze
Piccola Media Grande
Dp Dm Dg Dp Dm Dg Dp Dm Dg
K
0.1 0.4 0.7 0.1 0.4 0.7 0.1 0.4 0.7
0.2 0.5 0.8 0.2 0.5 0.8 0.2 0.5 0.8
0.3 0.6 0.9 0.3 0.6 0.9 0.3 0.6 0.9
K piccolo K medio K grande
Schema Progettazione Test Suite
Test Suite – 2
9. Fissiamo 𝑛 = |𝑉|
Per i=0 fino a 9
Calcoliamo m = 𝐸 = 𝐷 𝑥
|𝑉|( 𝑉 −1)
2
con 𝐷 𝑥 = {0.1, 0.2, … 0.9}
Generiamo un grafo random avente n nodi e m archi
Esporta su file «dataset_i.mtx»
Test Suite – 3
Generazione del dataset
%%%%%% Dataset_3 %%%%%%
30 30 120 %% n n m
1 1 %% e=(i, j)
2 5
5 8
2 6
12 5
21 6
16 30
…
Esempio dataset_3.mtx
18. Esplosione Del Problema
Eravamo partiti con l’intento di fare un confronto, tra il problema risolto
usando il puro BruteForce e RecursiveVC Ricorsivo
Ci siamo subito scontrati con la complessità esponenziale dell’algoritmo.
Sull’istanza da 30 nodi non siamo riusciti per questioni di tempo a fare lo stesso
livello di testing.
Abbiamo ristretto il numero di test eseguiti (fino al dataset_4.mtx)
19. BruteForce – 30 Nodi
Grafici2(Ordine K)
NOME-FILE NUM-EDGE K TIME
dataset_0.mtx 3 10 1
K Piccolo
dataset_1.mtx 51 10 4986
dataset_2.mtx 99 10 43906
dataset_3.mtx 147 10 229590
dataset_4.mtx 195 10 460698
dataset_0.mtx 3 17 0
K Medio
dataset_1.mtx 51 17 4933
dataset_2.mtx 99 17 44274
dataset_3.mtx 147 17 230899
dataset_4.mtx 195 17 460356
dataset_0.mtx 3 25 0
K Grande
dataset_1.mtx 51 25 4911
dataset_2.mtx 99 25 44094
dataset_3.mtx 147 25 229867
dataset_4.mtx 195 25 461246
0
50000
100000
150000
200000
250000
300000
350000
400000
450000
500000
3 51 99 147 195
T
|E|
BruteForce(|E| e K-piccolo)
20. BruteForce – 30 Nodi
Grafici2(Ordine K)
NOME-FILE NUM-EDGE K TIME
dataset_0.mtx 3 10 1
K Piccolo
dataset_1.mtx 51 10 4986
dataset_2.mtx 99 10 43906
dataset_3.mtx 147 10 229590
dataset_4.mtx 195 10 460698
dataset_0.mtx 3 17 0
K Medio
dataset_1.mtx 51 17 4933
dataset_2.mtx 99 17 44274
dataset_3.mtx 147 17 230899
dataset_4.mtx 195 17 460356
dataset_0.mtx 3 25 0
K Grande
dataset_1.mtx 51 25 4911
dataset_2.mtx 99 25 44094
dataset_3.mtx 147 25 229867
dataset_4.mtx 195 25 461246
0
50000
100000
150000
200000
250000
300000
350000
400000
450000
500000
3 51 99 147 195
T
|E|
BruteForce(|E| e K-medio)
21. BruteForce – 30 Nodi
Grafici2(Ordine K)
NOME-FILE NUM-EDGE K TIME
dataset_0.mtx 3 10 1
K Piccolo
dataset_1.mtx 51 10 4986
dataset_2.mtx 99 10 43906
dataset_3.mtx 147 10 229590
dataset_4.mtx 195 10 460698
dataset_0.mtx 3 17 0
K Medio
dataset_1.mtx 51 17 4933
dataset_2.mtx 99 17 44274
dataset_3.mtx 147 17 230899
dataset_4.mtx 195 17 460356
dataset_0.mtx 3 25 0
K Grande
dataset_1.mtx 51 25 4911
dataset_2.mtx 99 25 44094
dataset_3.mtx 147 25 229867
dataset_4.mtx 195 25 461246
0
50000
100000
150000
200000
250000
300000
350000
400000
450000
500000
3 51 99 147 195
T
|E|
BruteForce(|E| e K-grande)
29. Stima Crescita Tempi RecursiveVC
RecursiveVC
Numero Nodi O(Tempo)
25 1,4 s
30 52 s
35 632 s
40 8738 s
45 188083 s
50 40,5 giorni
55 694,4 giorni
0
500000
1000000
1500000
2000000
2500000
3000000
3500000
25 30 35 40 45 50
Tempo
(s)
|V|
Andamento dei Tempi RecursiveVC
Basate su k-grande e densità medio-bassa (0.3/0.4)
25-30-35 misure basate su medie
40-45 misure effettuate su singola esecuzione
50-55 predizioni
30. Conclusioni
BruteForce
K non ha influenza sui tempi
Esplode su una istanza da 30 nodi
Dataset_4.mtx : densità di 0,5 ( T ≃ 8 min. )
RecursiveVC
Esplode su instanze con K-grande e densità medio-bassa (≃ 0.3)
Generando opportune istanze
|V| = 40 -- |E| = 234 –- K = 32 TEMPO : 2,43 ore
|V| = 45 –- |E| = 297 –- K = 36 TEMPO : 52,24 ore
|V| = 50 -- |E| = 367 –- K = 40 TEMPO : ? (stima, Ω(40 giorni))
31. Perche non usare Java?
Uso tipi primitivi al posto degli oggetti
Accessi diretti in memoria al posto di Getter/Setter
Evitato l’uso della creazione/gestione Object
Evitato il cambio contesto copiando lo stesso codice nella chiamata ricorsiva
Su una istanza da 40 nodi impiega 4,31 min anzicchè 2,43 ore .
Stesso linguaggio, JAVA .
32. RecursiveVC3
Numero Nodi O(Tempo)
25 0 s
30 0 s
35 24,95 s
40 258,75 s
45 800 s
50 2000 s
Perche non usare Java?
Stima Crescita Tempi RecursiveVC3
-500
0
500
1000
1500
2000
2500
25 30 35 40
Tempo
(s)
|V|
Andamento dei Tempi RecursiveVC3
Basate su k-grande e densità medio-bassa (0.3/0.4)
Basate su singola esecuzione, DynTestRunningVC3