Pràctica 1: SAT solver¶
Modifica el SAT solver
SAT-alumnes.cpp
per a tractar de la
manera més eficient que puguis els exemples de
random3SAT.tar.gz
. Teniu una presentació
descrivint l’algorisme aquí
, amb
l'exemple
representat en format DIMACS pel SAT solver.Per a aconseguir això, millora l’heurística de decisió i la
velocitat de propagació:
Propagació.A cada volta del bucle depropagateGivesConflict
, cal propagar quemodelStack[indexOfNextLiteralToPropagate]
s’ha tornat cert.Per fer-ho, podeu fer servir occur lists: per cada literall
, tenim una llistaoccurList[l]
que conté els índexs de les clàusules on apareixl
.Quan cal propagar que un literall
és cert, el que fem és visitar les clàusules deoccurList[-l]
i mirem si n’hi ha cap que s’hagi tornat falsa (conflicte!) o unitària (propagació!). Heurística de decisió.
Tenim, per cada variable, un comptador del nombre de clàusules on apareix.EngetNextDecisionLiteral
, quan hem de decidir, escollim la variable indefinida amb aquest comptador més alt. Tenim, per cada variable, un comptador del nombre de conflictes en què ha aparegut. Quan hem de decidir, escollim la variable indefinida amb aquest comptador més alt.Una millora que es pot fer és donar més pes als conflictes recents. Per exemple, cada X conflictes, dividim els comptadors per la meitat.
Adjuntem un
script
que compara l’eficiència
del teu solver amb un altre, kissat, executant tots dos en la
mateixa màquina. Sobre els problemes insatisfactibles de 300
variables, kissat mai hauria de ser més de 20 vegades més ràpid
que el teu solver, i és perfectament possible aconseguir ràtios de
10 vegades, 5 vegades, o fins i tot millors (fes make usant el
Makefile
per a
compilar).IMPORTANT:
Has de lliurar DOS fitxers: SAT-alumnes.cpp, i temps.txt, la sortida que genera l’script.