Differences

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

Link to this comparison view

Both sides previous revision Previous revision
aa:lab:11 [2025/01/23 14:09]
dmihai
aa:lab:11 [2026/01/10 23:52] (current)
dmihai
Line 1: Line 1:
-===== Analiza amortizata ​=====+====== Reduceri polinomiale ======
  
-Utilizați metoda agregării, metoda contabilizării ​și metoda potențialelor pentru a găsi costul amortizat în situațiile prezentate ​mai jos.+Î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).
  
-$ \DeclareMathOperator{\push}{push\DeclareMathOperator{\pop}{pop} \DeclareMathOperator{\mpop}{mpop} \DeclareMathOperator{\key}{key} \DeclareMathOperator{\cost}{cost$+Descărcați de aici arhiva cu datele de intrare: ​{{:​aa:​lab:​lab.zip|}}
  
-=== 1. Stack ===+Aceasta conține în directorul ''​res/''​ trei fișiere cu date despre aeroporturi și rute:
  
-Presupunând că avem o implementare a unei stive care permite operațiile $ \pop O(1) $, $ \push O(1) $ si $ \mpop(k) - O(k) $,  + ''​airroutes.in'' ​din lume  ​\\ 
-demonstrați că pentru o secvență arbitrară $ S $ de $ n $ operatii, $ \cost(S) = O(n) $  + - ''​eu-airroutes.in''​ - din Europa  ​\
-și că fiecare operație are un cost amortizat $ \cost(op) = O(1) $.+ - ''​ro-airroutes.in''​ - din România
  
-**Exemplu:** $ \push, \pop, \push, \push, \push, \mpop(2), \push, \pop, \push $+Fișierele descriu grafuri orientate, ale căror noduri au ID-uri întregi începând de la 0; respectă următorul format:
  
-=== 2. Heap ===+ - 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'':​ \\ 
 +    - [[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.
  
-Un max-heap este un arbore binar aproape complet ​toate nivelurile, cu excepția ultimului, sunt complete, iar ultimul este completat de la stânga la dreaptaFiecare două noduri AA și BB, unde BB este fiu al lui AA, satisfac relația: +<​note>​ 
-$ \key(B) \leq \key(A) $+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
  
-Un max-heap se poate stoca sub formă de array, unde $ a[i] $ are  +În ''​tools/​extract_c_friendly.py''​ găsițscriptul care realizat extragerea. 
-copiii $ a[2i] $ si $ a[2i+1] $.+</​note>​
  
-Adăugarea unui element constă în următorii pași: +==== Exerciții ====
-  - adaugă un element în prima poziție liberă de pe ultimul nivelele +
-  - compară elementul adăugat cu părintele și interschimbă-i dacă e cazul +
-  - repetă pasul anterior până nodul respectă proprietatea în raport cu părintele lui sau a devenit rădăcina+
  
-Arătați că fiecare inserare are un cost agregat de $ \cost(op) = O(\log n) $.+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.
  
-=== 3Binary Counter ===+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.
  
-Presupunând că avem un contor binar implementat folosind ​listă de \( k \) biți, acesta permite doar operația \increment \)care adaugă ​\( 1 \) la contor. Această operație are complexitate temporală \O(k) \) în cel mai rău cazArătați însă că operația are un cost amortizat constant.+BONUS: implementați o soluție pentru $ \texttt{COLORING}$ care să folosească soluția pentru $ \texttt{MINIMAL COLORING}$ cu 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_{vc}$ pentru fiecare pereche de nod și culoare $ (vc)$ \
 + - 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}})$ 
 + 
 +3Implementaț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>​ <​note>​
-Soluțiile acestui laborator se găsesc [[https://ocw.cs.pub.ro/ppcarte/doku.php?​id=aa:​lab:sol:11|aici]]+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>​ </​note>​