Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
aa:lab:11 [2023/01/26 22:59]
alexandra.udrescu01
aa:lab:11 [2026/01/10 23:52] (current)
dmihai
Line 1: Line 1:
-====== ​ADTs și inducție structurală ​======+====== ​Reduceri polinomiale ​======
  
-<note important>​Solutii:​ https://​docs.google.com/​document/​d/​17AOXQdvTY_8GuC5lGnqfvegCs6BQMOc-21wYoHQDMJQ/​edit?​usp=drivesdk</​note>​ +Î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
-1. Definiți axiome pentru următorii operatori pe tipul ''​List'':​+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).
  
-  * ''​append''​ (concatenarea unei liste la o alta; ''​append(Cons(8,​ Cons(12, Empty)), Cons(3, Cons(6, Empty))) = Cons(8, Cons(12, Cons(3, Cons(6, Empty))))''​) +Descărcați de aici arhiva cu datele de intrare: {{:​aa:​lab:​lab.zip|}}
-  * ''​reverse''​ (inversează elementele dintr-o listă)+
  
-2. Definiți axiome pentru următorii operatori pe tipul ''​BTree'':​+Aceasta conține în directorul ​''​res/'' ​trei fișiere cu date despre aeroporturi și rute:
  
-  * ''​mirror : BTree → BTree'' ​(arborele oglindit pe verticală, i.e. pentru orice nod, copilul stâng devine copilul drept și vice-versa) + ​- ​''​airroutes.in''​ - din lume  \\ 
-  ​''​flatten : BTree → List'' ​(lista cu toate elementele ​din arbore; observați că există mai multe ordini posibile)+ - ''​eu-airroutes.in''​ - din Europa ​ \\ 
 + ​- ​''​ro-airroutes.in'' ​din România
  
-3. Definiți axiome pentru ​următorii operatori pe tipul ''​Map''​:+Fișierele descriu grafuri orientate, ale căror noduri au ID-uri întregi începând de la 0; respectă ​următorul format:
  
-  * ''​update : Map × K × V → Map'' ​(un Map cu o nouă asociere cheie:​element) + - pe prima linia, numărul de noduri ​''​N'' ​și numărul de muchii din graf, separate de un spațiu. \\ 
-  ​''​delete : Map × K → Map''​ (șterge cheia și valoarea asociată)+ - 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'':​ \\ 
 +    - [[https://​www.iata.org/​en/​publications/​directories/​code-search/​|codul IATA]] al aeroporturlui \\ 
 +    - toate rutele de la acel aeroport exprimate folosind trei numere: ID-ul aeroportului destinație,​ distanța zborului în kilometri, durata zborului în minute.
  
-4. Demonstrați următoarele propoziții,​ folosind inducție structurală:+<​note>​ 
 +Fișierele sunt doar o versiune parser-friendly a datelor din acest JSONhttps://​github.com/​Jonty/​airline-route-data/​blob/​main/​airline_routes.json
  
-  * $math[\forall t \in \texttt{BTree}size(t) = size(mirror(t))] +În ''​tools/​extract_c_friendly.py''​ găsiți scriptul care a realizat extragerea
-  * $math[\forall t \in \texttt{BTree}size(t) = length(flatten(t))] +</​note>​
-  * $math[\forall l \in \texttt{List}. append(l, Empty) = l] +
-  * $math[\forall l_1, l_2, l_3 \in \texttt{List}. append(l_1, append(l_2, l_3)) = append(append(l_1,​ l_2), l_3))] +
-  * $math[\forall l_1, l_2 \in \texttt{List}. length(append(l_1,​ l_2)) = length(append(l_2,​ l_1))] +
-  * $math[\forall l_1, l_2 \in \texttt{List}. reverse(append(l_1,​ l_2)) = append(reverse(l_2),​ reverse(l_1))].+
  
 +==== 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 [[https://​jix.github.io/​varisat/​manual/​0.2.0/​formats/​dimacs.html|DIMACS]] și rezolvați-o cu un SAT solver.
 +
 +<​note>​
 +Ca SAT solver, vă recomandăm [[https://​github.com/​Z3Prover/​z3|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 [[https://​github.com/​Z3Prover/​z3/​releases|ultimul release]].
 +</​note>​
 +
 +<​note>​
 +Formatul DIMACS este un format standard pentru a descrie instanțe de probleme $ \texttt{CNF SAT}$.
 +
 +În fiecare an are loc o [[https://​satisfiability.org/​SAT26/​|conferință faimoasă]] pe tema problemelor de satisfiabilitate.
 +Conferința are și o competiție de SAT solving asociată; puteți găsi [[https://​satcompetition.github.io/​2025/​downloads.html|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).
 +</​note>​