322CC TEMA 3 PROBLEMA 1 Sa se verifice daca o valoare x apartine unei matrice A cu n linii si 3*m coloane folosind un algoritm nedeterminist cu 3*n copii. Calculati complexitatea algoritmului. 0 apartine(x, A, n, m) 1 i = choice([1 ... 3*n]) 2 for j = 1:m 3 if A[i % n + 1][((i 1) ! n)*m + j] == x " #(m) $ %&cce%% ' fai( Explicatie: i primeste o valoare intre 1 si 3*n. Din aceasta obtin pe de o parte linia, care este in 1:n prin urmare i modulo n + 1, iar pe de alta parte coloana prin (i 1 div n) * m + j ceea ce duce la intervalul fixat pentru coloane, 1:3*m. Alegerea astfel facuta duce la acoperirea intregii matrici. Complexitatea algoritmului este: O(m) (for-ul de la linia 2 se executa de m+1 ori si continte numai operatii simple, matematice). Fiind un algoritm nedeterminist, complexitatea algoritmului este suma complexitatii operatiilor de pe calea cea mai scurta, care se termina cu succes. (complexitate angelica). PROBLEMA 2 Enuntati 5 probleme din NPC. 1. Programarea programarii mai multor procesoare (Multiprocessor scheduling) Fiind dat o multime J de lucrari, unde lucrarea j are lungimea L j si un numar de procesoare m, care este timpul minim necesar pentru programarea lucrarilor J pe m procesoare, astfel incat nici unul sa nu se suprapuna?" Exemplu: chiar functionarea unui sistem de operare multitasking, multiprocesor pe un PC. 2. Problema stocarii eficiente (Bin packing problem) Fiind dat un numar finit de containere de capacitate V s se gseasc impachetarea optima a unor obiecte de volume diferite, prin optim n?elegnd numr minim de containere . Exemplu: stocarea datelor, a copiilor de siguranta pe casete cu banda magnetica. Obiectele sunt in acest caz fisierele de dimensiuni diferite -, iar containerele sunt casetele, de aceeasi dimensiune, V. 3. Problema sumei submul ? imilor (Subset sum problem) Fiind data o multime de intregi, si un numar s exista o submultime a carei suma este s? Exemplu: pentru { -7, -3, -2, 5, 8} si s =0, raspunsul este DA, exista submultimea {-3, -2, 5} a carei suma este s, adica zero. Acest algoritm se foloseste in criptografie, pentru calculul cheii publice. Aceasta problema mai este cunoscuta si ca problema rucsacului (Knapsack Problem): fiind dat un rucsac de un anumit volum si mai multe obiecte cu costuri si volume asociate sa se gaseasca multimea de obiecte optima care incap in sac. 4. Problema dirijarii vehicolelor (Vehicle routing problem) Fiind dat un parc auto si o multime de clienti se cere ordonarea servirii clientilor pentru minimizarea costurilor de livrare . Exemplu: acest algooritm poate rezolva problema unei Pizzerii cu livrarea la domiciliu. In functie de comenzi, de adresele clientilor si de numarul de masini, cursele trebuie programate in asa fel incat sa fie serviti toti clientii consumand cat mai putina benzina. 5. Problema multimii de vrfuri independente (Independent set problem) Fiind dat un graf neorientat G si un intreg k se pune problema daca exista un subgraf format dintr-o submultime a nodurilor grafului initial, cu proprietatea ca varfurile nu sunt doua cate doua adiacente, altfel spus graful indus de aceste varfuri nu are muchii, doar varfuri izolate. Exemplu: Pentru graful din parea stanga, si k 21 (maxim de altfel), o multime de noduri independente este cea ingrosata in imaginea din partea dreapta. PROBLEMA 3 Demonstrez ca problema 5, K_Independent_Set (a multimii de varfuri independente de cardinal k) este NP-Completa. Arat acest lucru reducand problema K_clica (presupusa NP-Completa) si aratand ca K Independent Set este in NP. Lema 1: K_Indepenedent_Set este in NP Demonstratie: Fie algoritmul nedeterminist urmator care rezolva problema: 0 a()*+*in,epen,ent*%et(-, .) 1 -/ = m&(timea*0i,a 2 n = car,(-) 3 m = car,(.) $ for 1 = 1:2 ' 0 := choice(n) 3 if 0 e -/ #(2) 4 fai( 5 for j = 1 : car,(-/) #(2) 10 if (0, -/[j]) e . #(m) 11 fai( 12 -/ = -/ + 6 0 " 1' %&cce%% Algoritmul functioneaza in felul urmator: adauga la o submultime V' toate varfurile fara muchii intre ele. Daca am ajuns la k, am obtinut o multime de varfuri independente: V'. Complexitatea algoritmului este: O(k 2 +m*k 2 ) = O(k 2 ) deci are complexitate temporala polinomiala, rezolva problema K_Independent_Set, asadar Lema 1 este demonstrata. Lema 2: Problema K_Clica este reductibila in timp polinomial la problema K_Independent_Set. Demonstratie: Plec de la urmatoarea afirmatie: Fiind dat graful G in care k noduri verifica problema K_Clica, aceleasi noduri in graful complementar G' verifica problema K_Independent set. In imaginea de mai sus, se observa cum am transformat graful G (in care subgraful corespunzator problemei 4_Clica este subliniat cu galben), in graful G' (din dreapta, in care nodurile rosii verifica problema 4_Independent_Set). Demonstratia acestei echivalente este simpla: => G verifica K_Clica -> G' verifica K_Independent_Set Presupun prin reducere la absurd ca G' nu verifica K_Independent_Set. Astfel, exista doua varfuri (v1, v2) cu (v1, v2) e E'. Cum, E' este complementara lui E (multimile muchiilor), rezulta ca (v1, v2) nu apartine E. Dar v1, v2 sunt varfuri din subgraful K_Clica, deci (v1, v2) apartine E. Contradictie. <= G' verifica K_Independent_Set -> G verifica K_Clica Analog, presupun prin absurd, ca G nu verifica K_Clica. Asadar, exista (v1, v2) doua varfuri, iar (v1, v2) nu apartine E. Conform constructiei G', (v1, v2) ca apartine E', ceea ce contrazice faptul ca G' verifica K_Independent_Set pe o submultime de varfuri incluzand v1, v2. Contradictie, deci demonstrat. Mai ramane de aratat existenta algoritmului determinist care transforma G in G' (creaza un graf complementar pe baza unui graf dat). Acesta este simplu: con%tr&ct*7/(-, .) ./ = m&(timea 0i,a -/ = - for i in - for j in - if i 8= j 99 (i, j) n& apartine . ./ = ./ + 6 (i, j) " ret&rn (-/, ./) Asadar, Lema 2 este demonstrata. Teorema: K_Independent_Set este NPC. Demonstratie: K_Independent_Set e NP (Lema 1) K_Clica < p K_Independent_Set (Lema 2) K_Clica e NPC (ipoteza, seminar) Din acestea 3 rezulta K_Independent_Set este NPC, asadar teorema este demonstrata.