Download - Problemi np con esempio

Transcript
Page 1: Problemi np con esempio

per capire se un problema è np (ovvero risolvibile con un algoritmo non deterministico in tempo polinomiale)

se riesci quindi a trovare un algoritmo che ti ricava in tempo polinomiale non deterministico le soluzioni candidatee poi trovi un algoritmo che dalla soluzione candidata ti sa dire se è una istanza yes in tempo polinomiale allora il problema è np.quindi il problema si divide in due1) trovare un algoritmo per ricavare le soluzioni2) dalle soluzioni trovare un algoritmo che ne stabilisca se sono istanze yesIl secondo è alquanto semplice anche se non c'è una maniera specifica per tutti, ad ogni esercizio devi trovare un modo diversoma la seconda parte è la cosa più facile.Per la prima che apparentemente sembra difficile c'è la storia dei guess che aiuta tantissimo.Infatti a te serve un algoritmo che generi tutte le possibili istanze in tempo polinomiale non deterministico.L'algoritmo con le guess lo genera addirittura in tempo lineare (o lineare per logaritmico a seconda se le guess sono binarie o secondo un alfabeto finito).Quindi il difficile adesso è trovare il modo di rappresentare i tuoi dati e darli in pasto all'algoritmo guess.______________ricapitolando

1) trovare un vettore che rappresenta i tuoi dati che può essere o binario (allora la generazioni è lineare) oppure un vettore di elementi di un certo alfabeto di n elementi (allora la generazione è logaritmina rispetto al quell'n)2) trovare un algoritmo che dica se il vettore generato è yes o no

Page 2: Problemi np con esempio

allora potremmo prendere un esempio concreto24-giugno-2004Esercizio 4 (25%) Si consideri il problema di decisione PARTIZIONE IN CLIQUE. PARTIZIONE IN CLIQUE Istanza: <G, K>, dove G = (V,E) è un grafo e K è un intero tale che 0 < K ≤ |V|. Predicato: E’ possibile partizionare i vertici di G in K insiemi (disgiunti) V1,....,VK tali che: per 1 ≤ i ≤ K il sottografo di G che comprende i vertici di Vi e tutti gli archi incidenti su tali vertici è completo (cioè Vi è una clique di G)? 4.1) Dimostrare che il problema PARTIZIONE IN CLIQUE appartiene ad NP.

Il problema chiede di trovare una partizione in sottoinsiemi del grafo in maniera tale che siano tutte clique.

Allora la prima cosa è capire come rappresentare in un vettore questi datiil concetto è che tu devi prendere i tuoi dati pensandoli come in generale ad una istanza; non devi pensare al risultato che vuoi ma devi pensare ad una certa istanza e a come codificarla, poi l'algoritmo guess provvederà a riempire il vettore in tutti i modi possibili.In questo caso io avevo pensato ad un vettore che rappresenta tutti i vertici e quindi di dimensione |V|.Ogni elemento del vettore può avere un valore da 1 a k e rappresenta l'appartenenza ad una partizione; in questo modo sai che tutte le istanze sono tutte le possibile combinazioni di appartenenza dei vertici ad una certa partizione k-esima

Page 3: Problemi np con esempio

il concetto è che alla fine dei guess tu hai questo vettore riempito in miliadri di modi, ovvero tutte le maniere possibili.Ogni istanza rappresenta un modo di associare ogni vertice ad una partizione

tu trovi una maniera di rappresentare i dati in maniera generica e poi l'algoritmo con le guess riempe i vettori in tutte le maniere possibili

ogni posizione i-esima ha un valore 1<n<k che rappresenta l'appartenenza dell'i-esimo vertice alla partizione n-esima.Dopo |V| guess avrai tutte le possibili istanze (in numero pari a K|V|).

Come esempio si può prendere un triangolo con attaccato un vertice.Quindi la rappresentazione è un vettore di 4 elementi ciascuno identifica un vertice.Nel vettore ci memorizzi una partizione di appartenenza (da 1 a 4 siccome al massimo puoi avere 4 partizioni).Dopo ogni guess riempo una posizione da destra verso sinistra con un numero. I rami generati fissano un numero.Dopo 4 guess ho tutte le mie 64 combinazioni.Adesso devo determinare un algoritmo di costo polinomiale che presa una qualsiasi combinazione determina se è una istanza yes.Un possibile algoritmo di costo quadratico è:

scandisco ogni elemento del vettore;per ognuno scandisco tutti i suoi successivi;

per ogni coppia determino se appartengono alla stessa partizione (se il vettore in corrispondenza delle due posizioni contiene lo stesso numero)

se appartengono alla stessa partizione allora determino, con la matrice di adiacenze (supposta riempita), se i vertici sono adiacenti;

se non sono adiacenti allora l'istanza è no.