Reduceri polinomiale

În acest laborator veți explora un graf realist cu date despre toate aeroporturile din lume și rutele dintre ele și veți aplica diverși algoritmi *eficienți* pe acesta. Momentan, puteți considera termenul “eficient” să însemne “fără backtracking” (mai precis, ne referim la conceptul de polinomial, i.e. cu o complexitate descrisă de $ O(n^k)$, pentru un $ k$ natural; vom relua conceptul la curs).

Descărcați de aici arhiva cu datele de intrare: lab.zip

Aceasta conține în directorul res/ trei fișiere cu date despre aeroporturi și rute:

- airroutes.in - din lume
- eu-airroutes.in - din Europa
- ro-airroutes.in - din România

Fișierele descriu grafuri orientate, ale căror noduri au ID-uri întregi începând de la 0; respectă următorul format:

- pe prima linia, numărul de noduri N și numărul de muchii din graf, separate de un spațiu.
- pe următoarele N linii, informații despre un nod
- pe linia i (probabil indexată de la 1 în editorul de text), găsiți informații despre nodul cu ID i - 2:

  1. codul IATA al aeroporturlui
  2. toate rutele de la acel aeroport exprimate folosind trei numere: ID-ul aeroportului destinație, distanța zborului în kilometri, durata zborului în minute.
Fișierele sunt doar o versiune parser-friendly a datelor din acest JSON: https://github.com/Jonty/airline-route-data/blob/main/airline_routes.json

În tools/extract_c_friendly.py găsiți scriptul care a realizat extragerea.

Exerciții

BONUS: Aplicați backtracking naiv pentru a rezolva problema $ \texttt{MINIMAL COLORING}$ pe un graf primit ca input; i.e. găsiți numărul minim de culori distincte cu care putem colora nodurile din graf astfel încât să nu existe muchie între două noduri de aceeași culoare.

1. Aplicați backtracking naiv pentru a rezolva problema $ \texttt{COLORING}$ pe graful respectiv; va trebui să mai primiți un argument numeric $ k$ și să determinați dacă graful poate fi colorat cu $ k$ culori.

BONUS: implementați o soluție pentru $ \texttt{MINIMAL COLORING}$ care să folosească soluția pentru $ \texttt{COLORING}$ cu o cantitate minimală de cod adițional.

BONUS: implementați o soluție pentru $ \texttt{COLORING}$ care să folosească soluția pentru $ \texttt{MINIMAL COLORING}$ cu o cantitate minimală de cod adițional.

2. Implementați transformarea necesară pentru reducerea $ \texttt{COLORING} \le_P \texttt{CNF SAT}$:

- creați câte o variabilă $ x_{v, c}$ pentru fiecare pereche de nod și culoare $ (v, c)$
- fiecare nod trebuie să aibă cel puțin o culoare; adăugați pentru fiecare nod $ v$ clauza: $ (x_{v, 0} \lor x_{v, 1} \lor \ldots \lor x_{v, k - 1})$
- fiecare nod trebuie să aibă maxim o culoare; pentru fiecare nod $ v$ și pentru fiecare pereche de culori $ c1 < c2$ adăugați clauza: $ (\overline{x_{v, c1}} \lor \overline{x_{v, c2}})$
- două noduri adiacente nu pot avea aceeași culoare; pentru fiecare pereche de noduri $ (u, v)$ și pentru fiecare culoare $ c$ adăugați clauza: $ (\overline{x_{v, c}} \lor \overline{x_{u, c}})$

3. Implementați o soluție pentru a rezolva $ \texttt{CNF SAT}$ prin backtracking naiv.

4. Convertiți formula voastră in formatul DIMACS și rezolvați-o cu un SAT solver.

Ca SAT solver, vă recomandăm Z3 de la Microsoft Research. Acesta este de fapt un solver de $ \texttt{SMT}$ (Satisfiability Modulo Theories), o problemă mai generală, dar poate rezolva și $ \texttt{SAT}$. Cel mai probabil, distribuția voastră are Z3 disponibil ca pachet în repositories default. Dacă nu, instalați ultimul release.
Formatul DIMACS este un format standard pentru a descrie instanțe de probleme $ \texttt{CNF SAT}$.

În fiecare an are loc o conferință faimoasă pe tema problemelor de satisfiabilitate. Conferința are și o competiție de SAT solving asociată; puteți găsi aici submisiile pentru anul acesta; vă recomandăm să încercați să rulați și unul din aceste solvere, pe lângă Z3 (Z3 este un produs finisat și robust, pe o problemă mai generală; aceste solvere doar rezolvă instanțe de SAT; e posibil să fie mai rapide).