Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
aa:lab:11 [2020/12/15 17:49] roxana_elena.stiuca lab number didn't correspond |
aa:lab:11 [2026/01/10 23:52] (current) dmihai |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Lab 11: SAT ====== | + | ====== 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). | ||
| - | === 0. Recap Conjunctive Normal === | + | Descărcați de aici arhiva cu datele de intrare: {{:aa:lab:lab.zip|}} |
| + | Aceasta conține în directorul ''res/'' trei fișiere cu date despre aeroporturi și rute: | ||
| - | **CNF** is a form of boolean logic formulae that consists of a **conjunction** of one or more **clauses**. A **clause** is a **disjunction** of **literals**. | + | - ''airroutes.in'' - din lume \\ |
| + | - ''eu-airroutes.in'' - din Europa \\ | ||
| + | - ''ro-airroutes.in'' - din România | ||
| - | A good analogy for **conjunction** is **product** and for **disjunction** is **sum**. Thus, a formula in **CNF** can be seen as a product of sums. | + | 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'': \\ | ||
| + | - [[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. | ||
| - | Examples of **terminals**: | + | <note> |
| + | 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 | ||
| - | * $math[X, Y, Z, a, b, X_{1}, X_{2}, ..., X_{n}] | + | În ''tools/extract_c_friendly.py'' găsiți scriptul care a realizat extragerea. |
| + | </note> | ||
| - | Examples of **disjunctions**: | + | ==== Exerciții ==== |
| - | * $math[X\vee Y\vee Z] | + | 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. |
| - | * $math[a\vee b] | + | |
| - | * $math[X_{1}\vee X_{2}\vee X_{3}\vee ... \vee X_{n - 1}\vee X_{n}] | + | |
| - | Examples of **conjunctions**: | + | 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. |
| - | * $math[a\wedge b\wedge c] | + | 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. |
| - | * $math[X\wedge Z] | + | |
| - | Examples of **CNF**: | + | 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. |
| - | * $math[a\wedge (b\vee c)\wedge d] | ||
| - | * $math[(X_{1}\vee X_{2})\wedge (Y_{1}\vee Y_{2})\wedge (Z_{1}\vee Z_{2})] | ||
| - | * $math[(X\vee Y)\wedge (Y\vee Z)\wedge (Z\vee X)] | ||
| - | \\ | + | 2. Implementați transformarea necesară pentru reducerea $ \texttt{COLORING} \le_P \texttt{CNF SAT}$: |
| - | ** 1. Conjunctive Normal Form ** | + | - 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. | ||
| - | Rewrite the following formulae in Conjunctive Normal Form: | + | 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. |
| - | ** 1.1. ** $math[\neg (a\leftrightarrow b)\wedge (b\vee c)] | + | <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}$. | ||
| - | ** 1.2. ** $math[\neg ((a\vee c)\to (b \wedge \neg (a\vee c)))] | + | Î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> |
| - | + | ||
| - | ** 2. Interpretations ** | + | |
| - | + | ||
| - | ** 2.1. ** Write an interpretation which makes each of the previous formulae: | + | |
| - | * true | + | |
| - | * false | + | |
| - | + | ||
| - | \\ | + | |
| - | + | ||
| - | ** 3. Satisfiability and validity ** | + | |
| - | + | ||
| - | Write down a formula with 3 variables which is: | + | |
| - | * valid | + | |
| - | * satisfiable | + | |
| - | * invalid | + | |
| - | + | ||
| - | \\ | + | |
| - | + | ||
| - | ** 4. Binary Decision Diagrams ** | + | |
| - | + | ||
| - | Write binary decision diagrams for the formulae at 1. | + | |
| - | + | ||
| - | \\ | + | |
| - | + | ||
| - | ** 5. Encodings ** | + | |
| - | + | ||
| - | + | ||
| - | ** 5.1. ** Express the following as ** CNF SAT ** formulae: | + | |
| - | + | ||
| - | * $math[a\oplus b] (xor) | + | |
| - | + | ||
| - | * if c then t else p | + | |
| - | + | ||
| - | * exactly one of $math[{X_{1}, X_{2}, ..., X_{n}}] is true. | + | |
| - | + | ||
| - | + | ||
| - | ** 5.2. ** Encode the n-queens problem as a ** SAT ** formula. In the n-queens problem, we have a n x n board and we need to find a position for each n queens such that no queen is attacking another. | + | |
| - | + | ||
| - | + | ||
| - | ** 5.3. ** What is ** 3SAT **? Construct a transformation that takes a ** SAT ** formula and builds a ** 3SAT ** formula. Motivation: a lot of ** SAT ** solvers use as input ** 3SAT **. | + | |