Úloha
Vašou úlohou je implementovať SAT solver v jazyku Python, ktorý:
- načíta formulu v tvare DIMACS CNF,
- rozhodne jej splniteľnosť,
- ak je splniteľná, vypíše SAT a model (priradenie premenných),
- ak nie je splniteľná, vypíše UNSAT,
- musí byť efektívny a zvládnuť testy do 500 premenných a 2000 klauzúl v rozumnom čase (60 sekúnd na test).
Technické požiadavky
Spustenie programu
Program musí byť spustiteľný z príkazového riadku:
python satsolver.py input.cnf output.txt
Program:
- načíta súbor z prvého argumentu príkazového riadku
- vypíše výsledok do súboru zadaného ako druhý argument príkazového riadku
Povolené a zakázané
Povolené
- Ľubovoľný algoritmus (DPLL, CDCL, backtracking, heuristiky, watched literals, clause learning, …),
- Ľubovoľné vlastné optimalizácie,
- Použitie štandardnej Python knižnice.
Zakázané
- Externé SAT knižnice,
- Použitie hotových solverov (MiniSAT, PySAT, Z3, atď.),
- Volanie externých programov,
- Použitie akýchkoľvek externých balíkov mimo štandardnej knižnice.
Porušenie pravidiel znamená hodnotenie 0 bodov.
Vstupný formát – DIMACS CNF
Vstupný súbor je v štandardnom DIMACS formáte, ktorý reprezentuje formulu v konjunktívnej normálnej forme (CNF).
Formát je nasledovný:
c komentár
p cnf <num_vars> <num_clauses>
<clause1>
<clause2>
...
Kde:
coznačuje komentárp cnfoznačuje začiatok problému a typ formátu<num_vars>je počet premenných<num_clauses>je počet klauzúl
Zároveň:
- Literály sú celé čísla
- Kladné číslo
iznamená premennú x_i - Záporné číslo
-iznamená negáciu ¬x_i - Každá klauzula končí číslom
0 - Premenné sú číslované od
1ponum_vars
Príklad vstupu
c Example
p cnf 3 2
1 -3 0
2 3 -1 0
reprezentuje formulu: $$(x_1 ∨ ¬x_3) ∧ (x_2 ∨ x_3 ∨ ¬x_1)$$
Výstupný formát
Ak je formula nesplniteľná:
UNSAT
Ak je formula splniteľná:
SAT
<l1> <l2> ... <ln> 0
kde:
lije celé číslo- kladné číslo znamená TRUE
- záporné číslo znamená FALSE
- každá premenná od
1ponum_varsmusí byť priradená - poradie literálov je ľubovoľné
- model musí končiť
0
Príklad výstupu
SAT
1 -2 3 0
alebo
UNSAT
Korektnosť
Pri hodnotení sa kontroluje:
- správnosť rozhodnutia (SAT / UNSAT)
- správnosť modelu (ak SAT):
- každá klauzula musí byť splnená
- každá premenná musí mať hodnotu
Nesprávny formát výstupu = test neúspešný.
Dátová sada vstupných formúl
Dátová sada bude obsahovat 35 formúl v DIMACS formáte rozdelených do 4 kategórií:
- Malé testy: 10 testov s 10-50 premennými a 20-200 klauzúl
- Stredné testy: 10 testov s 50-200 premennými a 200-1000 klauzúl
- Veľké testy: 10 testov s 200-500 premennými a 1000-2000 klauzúl
- Špeciálne testy: 5 testov s rôznymi štruktúrami (napr. ťažké vs. ľahké, rôzne pomery klauzúl k premenným, atď.)
Môžete použiť túto vzorovú dátovú sadu formulae.zip na testovanie a ladenie svojho solvera. Finálne hodnotenie bude založené na inom súbore testov, ktorý bude zverejnený až po odovzdaní riešení.
Formuly v tejto dátovej sade sú rôzneho charakteru, vrátane náhodných formúl, formúl s vysokou štruktúrou, a formúl z reálnych problémov. Niektoré testy môžu byť veľmi náročné, takže efektívnosť implementácie bude kľúčová.
Dátová sada bola generovaná pomocou nástroja CNFgen, ktorý umožňuje vytvárať formuly s rôznymi vlastnosťami a obtiažnosťou.
Výkonnostné požiadavky
Solver musí zvládnuť:
- formuly do 500 premenných,
- do 2000 klauzúl,
- časový limit: 60 sekúnd na test
Solver bude testovaný na rôznych sadách testov, vrátane malých, stredných a veľkých formúl. Brute force riešenie nebude postačovať.
Testy budú spustené na počítači s nasledujúcou konfiguráciou:
- CPU: 12th Gen Intel® Core™ i7-1260P (16 vlákien)
- RAM: 32.0 GiB
- GPU: Intel® Iris® Xe Graphics (ADL GT2)
- Operačný systém: Ubuntu 24.04.4 LTS
Hodnotenie
Za Solver je možné získať 15 bodov (časť skúšky) podľa nasledujúcich kritérií:
| Kritérium | Body |
|---|---|
| Malé testy (korektnosť) | 2 |
| Stredné testy (korektnosť) | 2 |
| Veľké testy (korektnosť) | 3 |
| Efektivita (čas) | 3 |
Bonus (max +5 bodov)
- Implementácia pokročilých techník (CDCL, clause learning, watched literals, atď.)
- Nadštandardná výkonnosť
Spolu: 15 bodov
Najlepšie riešenia
Tri najlepšie riešenia získajú skúšku!
Rebríček
Bude zverejnený rebríček podľa:
- počtu vyriešených testov
- celkového času
Odovzdanie
Odovzdanie v kurze Moodle musí obsahovat:
satsolver.py- krátky popis implementovaného algoritmu (max. 1 strana PDF)
Akademická integrita
- Riešenie musí byť samostatná práca.
- Bude použitá automatická kontrola podobnosti riešení.