You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
VERTEX COVER CON CONFLITTI E 2SAT<br />
ESERCITAZIONE DI LABORATORIO<br />
G. PERSIANO – ALGORITMI II–MAGIS INFO<br />
1. Vertex cover with conflicts<br />
1.1. Descrizione del problema. Nel problema classico del vertex cover, un’istanza consiste<br />
di un grafo G e di un intero k. Il problema consiste nel decidere se G ha un vertex cover di<br />
cardinalità k e, nel caso che esista, di calcolarne uno.<br />
Invece, un’istanza del problema di vertex cover con conflitti consiste di due grafi G e C con<br />
lo stesso insieme di vertici V e di un intero k. Il grafo C è il grafo dei conflitti ed il problema<br />
consiste nel cercare un vertex cover U ⊆ V di G che comprenda al più k vertici e tale che<br />
nessuna coppia di vertici di U è un arco nel grafo C dei conflitti. Si può assumere che due<br />
vertici adiacenti in G non lo siano in C e che ogni vertice abbia non più di un conflitto.<br />
1.2. Esempi. Consideriamo le due istanze descritte di seguito in cui il grafo G ha i vertici<br />
colorato di blu e il grafo C ha i vertici colorati di rosso.<br />
0<br />
1<br />
0 1<br />
2<br />
3<br />
2 3<br />
8<br />
1<br />
2<br />
8<br />
1<br />
2<br />
7<br />
0<br />
3<br />
7<br />
0<br />
3<br />
6<br />
5<br />
4<br />
6<br />
5<br />
4<br />
Date: November 13, 2011.<br />
1
2 G. PERSIANO – ALGORITMI II–MAGIS INFO<br />
La prima istanza ha un solo vertex cover di dimensione 2: l’insieme di vertici {0, 3}. Si noti<br />
che l’insieme {1, 2} non è ammissibile in quanto i due vertici sono in conflitto (nota che il<br />
grafo rosso contiene l’arco (1, 2)).<br />
La seconda istanza ha due vertex cover di cardinalità 5: {0, 1, 3, 5, 7} e {0, 2, 4, 6, 8}. Il<br />
vertext cover {0, 1, 3, 5, 8} non è ammissibile in quanto i vertici 1 e 8 sono in conflitto.<br />
1.3. Algoritmo. Progettare ed analizzare un algoritmo che risolve il problema del vertex<br />
cover con conflitti in tempo O(2 k · poly(n)) dove n è il numero di vertici del grafo G. Nota<br />
che l’algoritmo di forza bruta prende tempo O(n k ).<br />
1.4. Implementazione. Implementare l’algoritmo sviluppato al punto precedente.<br />
1.4.1. Formato dell’input. L’input ha la seguente struttura. La prima riga dell’input contiene<br />
il numero di istanze. Per ogni istanza abbiamo i seguenti dati.<br />
(1) la prima riga contiene il numero di vertici nov, il numero di archi noe, il numero di<br />
conflitti noc e la cardinalità k del vertex cover desiderato.<br />
(2) le successive noe righe contengono ciascuna due vertici che constituiscono gli estremi<br />
di un arco del grafo G.<br />
I vertici sono identificati con gli interi da 0 a nov−1.<br />
(3) le successive noc righe contengono ciascuna due vertici che constituiscono gli estremi<br />
di un arco del grafo C.<br />
L’input corrispondente al primo esempio ha la seguente struttura.<br />
File di input<br />
1<br />
4 4 1 2<br />
0 1<br />
2 3<br />
0 2<br />
1 3<br />
1 2<br />
Commento<br />
numero di istanze<br />
nov noe noc k<br />
arco (0,1)<br />
arco (2,3)<br />
arco (0,2)<br />
arco (1,3)<br />
conflitto (1,2)<br />
Il programma sviluppato legge l’input da stdin.<br />
formato e che i valori siano consistenti.<br />
Si può assumere che l’input sia ben<br />
1.4.2. Formato dell’output. Per ciascuna istanza input, il programma deve dare in output<br />
una linea che descrive un vertex cover di cardinalità k con una stringa di 0 e 1. Se nessun<br />
vertex cover esiste il programma deve dare in output la stringa nessun vertex cover<br />
trovato. Ad esempio, l’output corretto corrispondente all’input descritto in precedenza è<br />
la linea:<br />
1001<br />
che descrive il vertex cover che consiste dei vertici 0 e 3. L’output non deve contenere<br />
nessun altro carattere.
VERTEX COVER CON CONFLITTI E 2SAT ESERCITAZIONE DI LABORATORIO 3<br />
2. 2SAT<br />
2.1. Descrizione del problema. Vogliamo utilizzare l’algoritmo per il problema del vertex<br />
cover con conflitti sviluppato ed implementato nella sezione precedente per risolvere il<br />
problema 2SAT. Un’istanza di 2SAT è una formula Φ in forma congiuntiva normale (cioè un<br />
AND di OR) in cui ciascuna clausola consiste esattamente di due letterali. Il problema consiste<br />
nel calcolare se esiste un assegnamento di verità alle n variabili che soddisfa la formula<br />
e, in caso affermativo, di calcolarne uno.<br />
2.2. Riduzione. Mostrare che 2SAT si riduce al problema di vertex cover con conflitti e che<br />
quindi ogni algoritmo per vertex cover con conflitti può essere usato come subroutine per un<br />
algoritmo per 2SAT.<br />
Più precisamente, progettare e dimostrare la correttezza di due algoritmi polinomiali. Il<br />
primo prende in input una formula Φ e restituisce un’istanza I = (G, C, k) di vertex cover con<br />
conflitti tale che I ha un vertex cover con conflitti di k vertici se e solo se Φ è soddisfacibile.<br />
Il secondo algoritmo prende in input un vertex cover con conflitti per I e restituisce un<br />
assegnamento di verità che soddisfa Φ.<br />
2.3. Implementazione. Implementare un programma che risolve il problema 2SAT e che<br />
usa i due algoritmi della riduzione e l’algoritmo per il problema di vertex cover con conflitti.<br />
Il programma che si ottiene prenderà tempo esponenziale ed è interessante solo come esercizio<br />
in quanto è noto un algoritmo polinomiale per 2SAT.<br />
2.3.1. Formato dell’input. L’input ha la seguente struttura. La prima riga contiene il numero<br />
di istanze. Per ogni istanza abbiamo i seguenti dati.<br />
(1) la prima riga contiene il numero di variabili nov e il numero di clausole noc.<br />
(2) le successive noc righe contengono ciascuna i due letterali di una clausola.<br />
Le nov variabili della formula sono identificate con gli interi da 1 a nov. Il letterale<br />
corrispondente alla negazione della variabile i è identificato con l’intero −i.<br />
L’input corrispondente alle formule<br />
(x 1 ∨ ¯x 2 ) ∧ (x 1 ∨ x 3 ) ∧ (x 2 ∨ x 4 ) ∧ ( ¯x 1 ∨ ¯x 5 )<br />
( ¯x 1 ∨ x 2 ) ∧ (x 1 ∨ x 2 ) ∧ ( ¯x 1 ∨ ¯x 2 ) ∧ (x 1 ∨ ¯x 2 )<br />
ha la seguente struttura<br />
Input<br />
2<br />
5 4<br />
1 -2<br />
1 3<br />
2 4<br />
-1 -5<br />
2 4<br />
-1 2<br />
1 2<br />
-1 -2<br />
1 -2<br />
Commento<br />
numero di istanze<br />
nov e noc per la prima formula<br />
prima clausola della prima formula<br />
seconda clausola della prima formula<br />
terza clausola della prima formula<br />
quarta clausola della prima formula<br />
nov e noc per la seconda formula<br />
prima clausola della seconda formula<br />
seconda clausola della seconda formula<br />
terza clausola della seconda formula<br />
quarta clausola della seconda formula
4 G. PERSIANO – ALGORITMI II–MAGIS INFO<br />
2.3.2. Formato dell’output. Per ciascuna formula input, il programma deve dare in output<br />
una linea che descrive un assegnamento di verità che soddisfa la formula. Se la formula non<br />
è soddisfacibile il programma deve dare in output la stringa formula non soddisfacibile.<br />
Un asegnamento di verità è descritto da una stringa che contiene un carattere per ogni<br />
variabile con 1 che indica vero e 0 che indica falso. Per l’input descritto nella sezione<br />
precedente un possibile output corretto è<br />
Output<br />
Commento<br />
10010<br />
formula non soddisfacibile<br />
output per prima formula<br />
output per seconda formula<br />
3. File da consegnare<br />
Ciascuno studente deve consegnare una directory il cui nome è uguale al cognome dello<br />
studente. La directory contiene due directory: una per i sorgenti (di nome SRC) ed una per<br />
la descrizione degli algoritmi (di nome AlgoDesc).<br />
La directory per i sorgenti contiene i sorgenti (quindi file .c e .h) ed un file Makefile.<br />
L’eseguibile per il problema vertex cover con conflitti deve avere nome vcwc e deve essere<br />
prodotto dal comando make vcwc. L’eseguibile per il problema 2SAT deve avere nome 2sat<br />
e deve essere prodotto dal comando make 2sat.<br />
La directory per la descrizione degli algoritmi contiene due file pdf: uno per gli algoritmi<br />
della Sezione 1.3 con nome vcwc.pdf ed uno per le riduzioni della Sezione 2.2 con nome<br />
2sat.pdf. Ciascun file deve specificare nome, cognome e matricola dello studente.<br />
Per consegnare l’elaborato lo studente deve produrre un file zip che ha come nome il cognome<br />
dello studente stesso ed estensione zip. L’archivio zip può essere prodotto mediante<br />
il comando<br />
zip -r cognome.zip cognome<br />
eseguito nella directory padre di quella contenente i sorgenti.