14.03.2015 Views

traccia

traccia

traccia

SHOW MORE
SHOW LESS

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.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!