Table of Contents

Abordări practice pentru probleme NP-Complete

Problemele NP-Complete despre care am discutat până acum la curs și la laborator au două trăsături principale:

Trebuie deci să avem o strategie de a le aborda, nu putem să le evităm. În acest laborator vom studia o strategie puternică numită “kernelizare”. Kernelizarea are la bază ideea că backtrackingul este inevitabil; dar în loc să aplicăm backtracking pe întreaga instanță a problemei, putem încerca a priori să extragem miezul dificil al problemei. Această extragere constă în aplicarea unui algoritm determinist polinomial (deci eficient) care să reducă drastic dimensiunea problemei. Este similar cu o reducere polinomială; dar în loc să transformăm inputul unei probleme A într-un input pentru o altă problemă B, îl vom transofrma într-un input mai mic pentru aceeași problemă A.

Vertex Cover

Vom implementa un algoritm simplu de kernelizare pentru problema Vertex Cover pe graful $ G = (V, E)$ și dimensiunea căutată $ K$, care constă în următorii pași:

Pentru completitudine, trebuie să considerăm și situația $ K = 0$; în acest caz răspunsul e pozitiv dacă și numai dacă nu există muchii în graf.
Ca să păstrăm analogia cu reduceri polinomiale (în care transformarea trebuie neapărat să producă o instanță a problemei și nu direct un răspuns) putem la ultimul pas, în caz că sunt mai mult de $ K^2$ muchii, să aplicăm backtracking naiv pe orice instanță despre care știm că răspunsul e negativ: e.g. întoarcem un graf cu două noduri, muchie între ele și $ K = 0$.

Exerciții

1. Implementați o soluție prin backtracking naiv pentru problema $ \texttt{VERTEX COVER}$; trebuie ca punctul de intrare să fie o funcție solve_vertex_cover(<graph>, <k>).

2. Implementați pașii de preprocesare discutați mai sus. La final, aplicați funcția solve_vetex_cover pe graful și numărul obținut.

3. Implementați reducerea $ \texttt{CLIQUE} \le_P \texttt{VERTEX COVER}$; trebuie ca punctul de intrare să fie o funcție solve_clique(<graph>, <k>). După reducerea grafului, aplicați preprocesarea prin kernelizare descrisă la punctul 2.

Găsiți aici un exemplu de graf în următorul format:

Este un graf complet cu 29 de noduri; are acoperiri doar de 28 și de 29 de noduri.