Soluții Laboratorul 6
Există multiple soluții pentru fiecare problemă, mai mult sau mai puțin bune, care oferă răspuns corect pentru un set mai mare sau mai mic, dar limitat, de date de intrare. În continuare vom prezenta câteva posibile idei.
1. K Vertex Cover
Soluția greedy pentru problema K Vertex Cover ar fi să alegem în mod repetat un nod care acoperă cel mai mare număr de muchii neacoperite. În fiecare pas, adăugăm nodul respectiv în setul nostru și eliminăm toate muchiile care sunt acoperite de acest nod. Repetăm acest proces până când avem un set de K noduri sau până când toate muchiile sunt acoperite.
În exempul de față, algoritmul greedy nu poate depista Cover-ul de lungime 4 format din nodurile {$ 5, 6, 7, 8$} pentru că va alege ca prim nod nodul $ 9$.
2. K Clique
Pentru problema K Clique, o soluție greedy ar fi să alegem noduri în funcție de gradul lor, adică să începem cu nodurile care au cei mai mulți vecini în graf. La fiecare pas, adăugăm un nod în setul nostru și eliminăm toate nodurile care nu sunt conectate la acesta. Continuăm acest proces până când avem un set de K noduri sau nu mai există noduri rămase în graf.
Cu toate acestea, o astfel de abordare greedy nu garantează întotdeauna găsirea unei clique de dimensiune maximă.
În cazul de față algoritmul propus va alege ca prim nod nodul $ 1$, va elimina nodurile $ 8$ și $ 9$ pentr că nu sunt conectate la el, după care va alege nodul $ 2$. Prin urmare, nu se poate obține o Clique de dimensiune $ 3$, în ciuda faptului că există una: {$ 2, 8, 9$}.
3. K Coloring
Pentru fiecare nod, se alege cea mai mică culoare disponibilă care nu este marcată de vecinii nodului curent. Spre exemplu, pentru următorul graf (presupunem $ K = 2$):
Avem $ 2$ culori disponibile, numerotate de la $1 $ la $ 2$. Inițial, $ [A → 0, B → 0, C → 0, D → 0, E → 0]$, adică niciun nod nu are asignată nicio culoare.
Pentru $ A$, vecinii săi nu au asignată nicio culoare. Îi asignăm lui A cea mai mică culoare disponibilă, adică $ 1$. $ [A → 1, B → 0, C → 0, D → 0, E → 0]$
Pentru $ B$, vecinii săi au asignat $ [1(A)]$ deci îi asignăm $ 2$……………………………………………………………$ [A → 1, B → 2, C → 0, D → 0, E → 0]$
Pentru $ C$, vecinii săi au asignat $ [1(A)]$ deci îi asignăm $ 2$……………………………………………………………$ [A → 1, B → 2, C → 2, D → 0, E → 0]$
Pentru $ D$, vecinii săi au asignat $ [2(B), 2(C)]$ deci îi asignăm $ 1$……………………………………………………$ [A → 1, B → 2, C → 2, D → 1, E → 0]$
Pentru $ E$, vecinii săi au asignat $ [1(D)]$ deci îi asignăm $ 2$……………………………………………………………$ [A → 1, B → 2, C → 2, D → 1, E → 2]$
Contraexemplu:
Acest contraexemplu poate fi acoperit dacă folosim o optimizare, și anume să asignăm culori nodurilor în ordinea dată de gradul lor, adică alegem mereu să asignăm culoare nodului de grad maxim. Dacă vom avea 2 noduri cu același grad, vom alege mai întâi nodul cu indexul mai mic. Intuitiv, optimizările nu fac altceva decât să mărească plaja de input-uri pentru care se obține un răspuns optim, dar, întotdeauna se vor găsi input-rui pentru care nu functionează. Spre exemplu, optimizarea propusă e bătută de următorul graf:
4. Hamilton Path + TSP
Pentru TSP, vom alege pe rând fiecare latura de cost minim și o luăm în considerare dacă adăugând-o la drumul format până acum, aceasta nu creează un ciclu sau un nod de grad $ 3$. Pentru Hamilton Path, pur și simplu nu vom mai ține cont de cost, luăm muchiile într-o ordine oarecare.
Contraexemplu:
În exemplul de față algoritmul de mai sus va genera calea $ A → B → C → D → E → F$ ce va avea costul total $ 29$, chiar dacă $ C → A → B → E → F → D$ are costul $ 28$.
5. K Cut
???
6. SAT
Există $ 2^{N}$ candidați pentru soluție, unde $ N = Numărul-de-variabile$.
Complexitatea generării tuturor candidaților va fi $ Θ(2^n)$.
Verificarea validității unui candidat:
function Check_Candidate(T) { înlocuiește fiecare literal al expresiei booleene cu T(literal) while (expresia nu e de forma „True” sau „False”) { găsește toate subexpresiile ce operează doar cu literali, evaluează-le și înlocuiește-le cu valoarea obținută } return valoarea la care s-a evaluat expresia }
Înlocuirea variabilelor cu valoarea lor de adevăr poate fi realizată într-un timp liniar în funcție de $ |ϕ|$; bucla while găsește expresii precum $ TRUE, FALSE ∧ TRUE$ și le rezolvă (bazat pe logica tabelelor de adevăr), înlocuindu-le cu o constantă booleană. La fiecare pas, dimensiunea expresiei rămase scade, astfel încât algoritmul va realiza un număr de $ O(|ϕ|)$ iterații.
7. CNF SAT
Pentru că este doar o variantă mai restrictivă a problemei SAT soluția de mai sus ar funcționa și pentru aceasta.
Cu toate acestea, se crede că nici CNF SAT nu are o soluție polinomială.
8. 3SAT
Putem arăta formal că 3SAT este “la fel de dificilă” ca SAT. Acest lucru implică că, dacă, așa cum se crede în mod larg, nu există o soluție polinomială pentru SAT, atunci nu există nici o soluție polinomială pentru 3SAT.
Cu toate acestea, restrângerea problemei chiar mai mult ne aduce în sfera certitudinii polinomiale: problema similară 2SAT a fost dovedită a fi în P!