← Natrag Repo →

Rješavanje 3-SAT problema: od iscrpnog pretraživanja do lokalnih heuristika (GSAT, WalkSAT, ILS)

3-SATlokalna pretragaheuristikeGSATWalkSAT

TLDR


Motivacija

3-SAT je jedan od klasičnih problema kombinatorne optimizacije: jednostavan za objasniti, a brzo postane računalno težak. Super mi je kao poligon za testiranje različitih strategija pretraživanja:

Ovaj projekt mi je bio praktičan način da spojim teoriju (NP-potpunost, pretraživanje prostora) s implementacijom i eksperimentiranjem.


Problem

U 3-SAT imamo booleove varijable i skup klauzula, gdje je svaka klauzula disjunkcija točno tri literala (npr. (x1 ∨ ¬x4 ∨ x7)).

Cilj: naći dodjelu varijabli x ∈ {0,1}^n takvu da su sve klauzule zadovoljene.

Ovo je NP-potpun problem => iscrpno pretraživanje radi kao baseline za male instance, ali skaliranje brzo postane nemoguće.


Format ulaza i evaluacija

Ulazne instance su u DIMACS CNF formatu (npr. uf20-01.cnf).

Interno sam klauzule parsirao u listu literala oblika (indeks_varijable, trazena_vrijednost), gdje:

Fitness (dobrota) u većini algoritama je:


Pristup i algoritmi

1) Iscrpno pretraživanje (baseline)

Prođe kroz sve dodjele varijabli 2^n i provjeri zadovoljava li formula sve klauzule. Kao što samo ime kaže, ovo je iscrpno i eksponencijalno. Primjer kada egzaktna metoda nema smisla (za n=20 već ima preko milijun mogućnosti) te se moramo okrenuti heuristikama.

Koristio sam ga kao referencu i sanity-check za male instance.


2) Pohlepni uspon na vrh (hill climbing)

Krenem od nasumične dodjele i gledam susjedstvo dobiveno flipanjem jedne varijable.

Ovaj pristup zna biti brz, ali je osjetljiv na lokalne optimume.


3) “Ponderirani” hill climbing (dinamičko fokusiranje na teške klauzule)

Ovo je varijanta hill-climbinga u kojoj fitness nije samo “broj zadovoljenih klauzula”, nego uključuje i korekciju koja favorizira zadovoljavanje klauzula koje su često problematične.

Intuicija:


4) GSAT

Klasičan lokalni SAT algoritam:

GSAT je često dobar kompromis: jednostavan, ali znatno robusniji od čistog hill-climbinga.


5) WalkSAT (random walk + greedy)

Ovo mi je jedna od dražih heuristika jer jako jasno pokazuje zašto “malo šuma” pomaže:

Time algoritam ima mehanizam za izlazak iz lokalnih optimuma bez kompliciranja.


6) Iterated Local Search (ILS)

Ideja:

  1. pokrenem lokalnu pretragu (hill climbing) → dobijem lokalno dobro rješenje
  2. napravim perturbaciju (flippam dio varijabli)
  3. opet lokalna pretraga
  4. ako je novo bolje, prihvati (ili zadrži najbolje)

Ovo je praktično hill climbing + kontrolirani reset i često radi iznenađujuće dobro.


Rezultati (uf50-010)

Svaki algoritam sam pokrenuo 20 puta (različiti slučajni startovi). U tablici je wall-clock vrijeme jedne izvedbe.

AlgoritamUspjehMedijan (s)Prosjek (s)Min-Max (s)
Hill climbing6/2030.0537.540.37-92.29
Weighted hill20/2013.2116.680.22-64.04
GSAT20/2018.6825.790.97-96.67
WalkSAT20/201.472.500.09-13.05
ILS20/208.6442.641.02-246.29

*Napomena za Hil climbing: kad uspije, medijan je 4.56 s; kad ne uspije, medijan je 56.51 s.

Opažanja

Dodatna zanimljivost: pronađene dodjele su različite (postoji više zadovoljavajućih rješenja), što je vidljivo po različitim 50-bitnim izlazima među pokretanjima.


Zaključak

Za ovu instancu i ovu implementaciju, WalkSAT mi je najpraktičniji izbor: brz je i stabilan kroz ponavljanja. Hill climbing bez mehanizma bijega iz lokalnih optimuma nije dovoljno pouzdan, dok ILS može biti odličan, ali traži tunanje kako bi se izbjegli ekstremni “spori” slučajevi.

Ako ovo budem dalje širio, sljedeći koraci bi mi bili:

← Natrag Repo →