Je dána booleovská formule F proměnnných X=(x1,
x2, ... , xn) v konjunktivní normální formě
(tj. součin součtů). Dále jsou dány celočíselné kladné váhy W=(w1,
w2, ... , wn). Najděte ohodnocení Y=(y1,
y2, ... , yn) proměnných x1,
x2, ... , xn tak, aby F(Y)=1
a součet vah proměnných, které jsou ohodnoceny jedničkou, byl maximální.
Je přípustné se omezit na formule, v nichž má každá formule právě 3 literály
(problém 3 SAT). Takto omezený problém je stejně těžký, ale možná se lépe
programuje a lépe se posuzuje obtížnost instance.
Problém je velmi podobný problému batohu. Věc buď v batohu byla(1) nebo nebyla(0). V tomto problému se nastavuje, zda je proměnná ohodnocena true(1) nebo false(0). Proto jsem mohl do značné míry využít kódu z předchozí úlohy. Na rozdíl od problému batohu, kde řešením byly všechny stavy, kromě těch, kdy byl batoh přetížen, je tento problém komplikovanější, neboť řešením může být pouze stav, kdy jsou všechny klauzule(termy) true. Těchto řešení může být samozřejmě více, ale optimální je pouze jedno. Jelikož ale nemám k dispozici k testovaným instancím optimální řešení, nemám možnost, jak optimalitu ověřit, případně jak moc se řešení nalezené programem liší od optimálního. Proto se v této zprávě zaměřím na úspěšnost nalezení nějakého řešení.
Pro připomenutí znovu popíšu pseudokód algoritmu:
červeně zvýrazněný výpočet určuje pravďepodobnost, že dojde k použití stavu s horším ohodnocením.
Stejně jako v předchozí úloze, lze nastavit několik parametrů algoritmu. Jak jsem je nastavil ve své práci já, je uvedeno zde (parametry jsem určil pomocí exp. vyhodnocení):
1.
počáteční teplota
(počet_klauzulí)/(počet_proměných)
* (parametr počáteční teploty)
2.
zamrzající teplota
parametr zamrzající teploty
3.
konstanta equilibria
(počet proměnnćyh)*(parametr počtu testů)
4.
koeficient ochlazování
parametr ochlazování
Hlavním problémem řešení této úlohy pro mě byl způsob výpočtu ohodnocení
stavu. Použil jsem tento vzorec:
ohodnocení =
kde N je počet proměnných, M je počet klauzulí, wmax je
největší použitá váha.
Dalším problémem bylo určení jmenovatele do výpočtu exp(-d/jm).
Jako jmenovatel jsem nemohl použít hodnotu teploty, protože poté by šance na
využití stavu s horším ohodnoconím mohly být příliš malé.
Proto jsem se rozhodl, že se v řešení omezím na
instance, kde maximální váha proměnné je 50. Tím jsem docílil toho, že jsem
mohl určit přibližné rozdíly v cenách stavů, ve kterých je určitý rozdíl v
počtu splněných klauzulí. Poté jsem si stvořil tabulku
pravděpodobností, díky
které jsem dospěl k výslednému vztahu pro výpočet jmenovatele:
jmenovatel =
teplota*100*(parametr jmenovatele)
Parametr jsem použil proto, abych mohl pomocí experimentálního
vyhodnocení určit ideální hodnotu, kterou by se měla teplota násobit.
Na základě experimentálního vyhodnocení chci nastavit co nejlepší parametry pro můj algoritmus. Poté porovnám výsledky dosažené pomocí nastaveného a nenastaveného algoritmu. Nakonec se pokusím zjistit, zdali je algoritmus použitelný i pro instance s vyšším počtem proměnných než je 20.
Nastavení parametrů jsem dodržoval toto, pokud není nikde uvedeno jinak:
Počet |
Počet |
Parametr počáteční
teploty |
Zamrzající |
Ochlazovací konstanta |
Konstanta equilibria |
Parametr jmenovatele |
20 |
80 |
1 |
0.1 |
0.9 |
16 |
1.5 |
Nejprve jsem se pokusil určit, jak mám nastavit parametr jmenovatele. Změřil jsem tedy počty nalezených měření pro instance s 20 proměnnými. Pro každé měření jsem vygeneroval 5 instancí. Každou tuto instanci jsem testoval 20x. Každá hodnota je tedy průměr 100 hodnot získaných měřením.
V tabulkách udávám počet nalezených řešení a také poměr splněných klauzulí k počtu klauzulí dané instance.
Jelikož jsem volil mnoho možností, udávám samotnou tabulku.
|
Nulový stav |
Náhodný stav |
|||
Počet klauzulí |
Počet |
Počet nalezených řešení |
Kvalita řešení |
Počet nalezených řešení |
Kvalita řešení |
20 |
7040 |
2179,58 |
0,9995 |
2172,87 |
1,0000 |
30 |
8320 |
1559,03 |
1,0000 |
1567,08 |
1,0000 |
40 |
9280 |
749,66 |
1,0000 |
749,69 |
1,0000 |
50 |
9920 |
358,06 |
1,0000 |
353,85 |
1,0000 |
60 |
10560 |
82,75 |
0,9992 |
81,92 |
0,9997 |
70 |
10880 |
81,36 |
1,0000 |
81,37 |
0,9994 |
80 |
11520 |
10,17 |
0,9959 |
9,71 |
0,9959 |
Ochlazovací |
Počet |
Počet nalezených řešení |
Kvalita řešení |
0,8 |
4480 |
436,43 |
0,9950 |
0,85 |
6080 |
535,35 |
0,9955 |
0,9 |
9280 |
738,10 |
0,9960 |
0,95 |
18880 |
1154,83 |
0,9950 |
0,96 |
23680 |
1515,50 |
0,9981 |
0,97 |
31680 |
1795,56 |
0,9975 |
0,98 |
47680 |
2305,50 |
0,9970 |
0,99 |
95680 |
3149,81 |
0,9977 |
Se zvyšující se konstantou ochlazování stejně jako u batohu exponenciálně roste počet navštívených stavů. Kvalita řešení mírně roste, stejně tak počet nalezených řešení. Na základě naměřených hodnot jsem si vybral ochlazovací konstantu 0,95.
Konstanta equilibria |
Počet |
Počet nalezených řešení |
Kvalita řešení |
5 |
6,58 |
3600 |
0,9946 |
10 |
8,56 |
7200 |
0,9959 |
15 |
10,07 |
10800 |
0,9949 |
20 |
10,53 |
14400 |
0,9966 |
25 |
11,20 |
18000 |
0,9965 |
30 |
11,50 |
21600 |
0,9969 |
40 |
11,71 |
28800 |
0,9974 |
50 |
12,26 |
36000 |
0,9966 |
S rostoucí konstantou equilibria roste složitost algoritmu, ale tím také počet nalezených řešení. Kvalita řešení se nám jeví jako nejlepší u konstanty 40. V případě hodnoty 50 je nejvyšší počet nalezenćyh řešení.Jelikož nechci, aby výpočet trval neúměrně dlouho, tak volím hodnotu 20.
Násobící
konstanta |
Počet |
Počet nalezených řešení |
Kvalita řešení |
0,2 |
6400 |
9,45 |
0,995125 |
0,5 |
9280 |
10,56 |
0,996125 |
1 |
11520 |
10,39 |
0,996875 |
1,5 |
12480 |
10,48 |
0,99575 |
2 |
13440 |
10,08 |
0,996 |
3 |
14720 |
10,31 |
0,9955 |
4 |
15680 |
10,49 |
0,996875 |
S rostoucí konstantou mi logaritmicky roste počet navštívených stavů stavového prostoru. Počet nalezených řešení je spíše náhodný (pokud násobitel není velmi malý) – to si vysvětluji tím, že s nynějším nastavením ohodnocení stavu má algoritmus už tak v počátku svého běhu dostatek volnosti, takže navýšení úvodní teploty nemá na běh algoritmu příliš veliký vliv. Na kvalitu řešení parametr očividně také nemá žádný vliv. Vybírám si hodnotu 0,5.
Nyní
použiji vybrané konstanty a porovnám výpočty s neoptimalizovaným algoritmem. V
následující tabulce jsou uvedeny zvolené defaultní parametry simulovaného
ochlazování. Tabulky obsahují pouze nově naměřené hodnoty, v grafech je pak
srovnání s původním nastavením.
|
Počáteční |
Zamrzající |
Ochlazovací konstanta |
Konstanta equilibria |
Puvodní hodnoty: |
1 |
0.1 |
0.9 |
16 |
Vybrané hodnoty: |
0,5 |
0.1 |
0.95 |
20 |
|
Původní parametry |
Vybrané parametry |
||||
Počet klauzulí |
Počet |
Počet nalezených řešení |
Kvalita řešení |
Počet |
Počet nalezených řešení |
Kvalita řešení |
20 |
7040 |
2011,49 |
1,000 |
12800 |
3339,31 |
1,000 |
30 |
8320 |
1500,53 |
1,000 |
16000 |
2801,12 |
1,000 |
40 |
9280 |
714,68 |
1,000 |
18000 |
1328,72 |
1,000 |
50 |
9920 |
379,12 |
0,999 |
20000 |
663,15 |
1,000 |
60 |
10560 |
87,87 |
1,000 |
21200 |
124,39 |
1,000 |
70 |
10880 |
78,88 |
0,999 |
22400 |
107,08 |
1,000 |
80 |
11520 |
9,30 |
0,996 |
23600 |
11,79 |
0,996 |
Pozn: I
když jsem měření prováděl v závislosti na počtu navštívených stavů, zmíním zde
konfiguraci, na které jsem měření provádel. Měření probíhala na stroji s
procesorem Intel Core Duo 1.667 GHz, 512 MB RAM, Win Xp Home SP2, MSVC 7.1 v
debug módu.