Zadání
- Zvolte si heuristiku, kterou budete řešit problém vážené splnitelnosti booleovské formule (simulované ochlazování, simulovaná evoluce, tabu prohledávání)
- Tuto heuristiku použijte pro řešení problému batohu. Můžete použít dostupné instance problému (zde), anebo si vygenerujte své instance pomocí generátoru. Používejte instance s větším počtem věcí (>30).
- Hlavním cílem domácí práce je seznámit se s danou heuristikou, zejména se způsobem, jakým se nastavují její parametry (rozvrh ochlazování, selekční tlak, tabu lhůta...) a modifikace (zjištění počáteční teploty, mechanismus selekce, tabu atributy...). Není-li Vám cokoli jasné, prosíme ptejte se na cvičeních.
- Problém batohu není příliš obtížný, většinou budete mít k dispozici globální maxima (exaktní řešení) z předchozích prací, například z dynamického programování.
Implementace
Z pokročilých iterativních metod jsem si vybral algoritmus simulované ochlazování. Je popsán "vývojovými diagramy" na následujících obrázcích.
Zdrojové kódy
- SimAnneal.cs - Implementace algoritmu simulovaného ochlazování
- Batoh-SimAnneal.zip - Kód z minulých úloh použit pro testování (Greedy Proof, Dynamické programování)
Naměřené hodnoty a výsledky
Aby bylo možné správně nastavit parametry algoritmu je nutné experimentovat. Při experimentech jsem sledoval časovou náročnost a relativní chybu. Pro výpočet globálního maxima (pro výpočet relativní chyby) jsem použil dříve implementované dynamické programování. Algoritmus jsem srovnával s Greedy Proof (metodou nejrychlejšího vzestupu). Experimenty jsou shrnuty v následujících tabulkách a grafech.
Pro přehlednost jsem použil tyto zkratky:
SA = Simulated Annealing = simulované ochlazování
GP = Greedy Proof = metoda nejrychlejšího vzestupu
triv = použito triviální řešení pro inicializaci SA
init GP = použito GA pro inicializaci SA
T0 = počáteční teplota
Tf = teplota tuhnutí
dT = změna teploty
equ = equilibrium
Pokud není uvedeno jinak, experimentoval jsem na instancích o velikosti n = 40. SA bylo na každé instanci spuštěno 20x a výsledná relativní chyba a čas je průměr z výsledů algoritmu.
Měřil jsem na NTB s procesorem Centino 1.4GHz, nastavení max Performance při napájení z adaptéru. Použitý OS: Windows XP SP2 s .net Framework 2.
Nastavení změny teploty
Při tomto experimentu jsem nastavil T0 = (M * suma_cen_veci) / (n * suma_vah_veci), Tf = 10, equ = n a měnil dT v rozmezí 0,8 - 0,999.dT | relativní chyba | čas | ||||
---|---|---|---|---|---|---|
GP | SA triv | SA init GP | GP | SA triv | SA init GP | |
0,999 | 0,15% | 0,12% | 0,02% | 0,0625 | 278,731 | 642,995 |
0,995 | 0,42% | 0,07% | 58,154 | 128,795 | ||
0,99 | 0,64% | 0,09% | 27,17 | 66,054 | ||
0,98 | 1,14% | 0,12% | 13,159 | 32,717 | ||
0,975 | 1,29% | 0,13% | 10,525 | 24,725 | ||
0,95 | 2,01% | 0,14% | 5,358 | 12,509 | ||
0,9 | 3,26% | 0,14% | 2,644 | 6,039 | ||
0,8 | 5,50% | 0,15% | 1,271 | 2,944 |
Graf: Závislost relativní chyby na změně rychlosti ochlazování
Graf: Závislost časové složitosti na změně rychlosti ochlazování
Nastavení velikosti equilibria
Nastavení: T0 = (M * suma_cen_veci) / (n * suma_vah_veci), Tf = 10, dT = 0,9 a 0,98, měnil jsem equ v intervalu n / 5 až n * 5equ | relativní chyba | čas | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
GP | SA triv | SA init GP | GP | SA triv | SA init GP | |||||
dT = 0,98 | dT = 0,9 | dT = 0,98 | dT = 0,9 | dT = 0,98 | dT = 0,9 | dT = 0,98 | dT = 0,9 | |||
200 | 0,15% | 0,34% | 1,16% | 0,07% | 0,12% | 0,0625 | 65,663 | 13,23 | 153,191 | 30,184 |
160 | 0,39% | 1,31% | 0,07% | 0,13% | 54,198 | 10,345 | 123,097 | 23,945 | ||
120 | 0,52% | 1,53% | 0,09% | 0,13% | 39,346 | 7,922 | 92,753 | 17,866 | ||
80 | 0,72% | 2,06% | 0,10% | 0,14% | 26,067 | 5,438 | 61,899 | 11,907 | ||
40 | 1,13% | 3,20% | 0,12% | 0,15% | 13,149 | 2,664 | 30,694 | 5,988 | ||
20 | 1,76% | 5,85% | 0,13% | 0,14% | 6,84 | 1,332 | 15,35 | 3,074 | ||
13 | 2,26% | 8,18% | 0,14% | 0,15% | 4,376 | 0,981 | 10,385 | 2,013 | ||
10 | 2,83% | 10,06% | 0,14% | 0,15% | 3,435 | 0,701 | 7,771 | 1,652 | ||
8 | 3,45% | 12,09% | 0,15% | 0,15% | 2,724 | 0,581 | 6,239 | 1,312 |
Graf: Závislost relativní chyby na velikosti equilibria
Graf: Závislost časové složitosti na velikosti equilibria
Nastavení teploty tuhnutí
Nastavení: T0 = (M * suma_cen_veci) / (n * suma_vah_veci), dT = 0,98, equ = n, měnil jsem Tf v intervalu 1 až 10.Tf | relativní chyba | čas | ||||
---|---|---|---|---|---|---|
GP | SA triv | SA init GP | GP | SA triv | SA init GP | |
1 | 0,15% | 0,94% | 0,12% | 0,0625 | 27,539 | 30,604 |
2 | 0,94% | 0,12% | 23,254 | 25,857 | ||
3 | 0,99% | 0,12% | 20,659 | 22,893 | ||
5 | 0,96% | 0,12% | 17,325 | 18,837 | ||
7 | 0,99% | 0,12% | 15,433 | 17,745 | ||
10 | 1,08% | 0,13% | 13,229 | 14,521 |
Graf: Závislost relativní chyby na teplotě tuhnutí
Graf: Závislost časové složitosti na teplotě tuhnutí
Nastavení počáteční teploty
Nastavení: Tf = 1, dT = 0,98, equ = n, měnil jsem T0 v intervalu 35 až 200T0 | relativní chyba | čas | ||||
---|---|---|---|---|---|---|
GP | SA triv | SA init GP | GP | SA triv | SA init GP | |
200 | 0,15% | 0,98% | 0,12% | 0,0625 | 32,928 | 34,81 |
150 | 0,95% | 0,12% | 32,247 | 32,547 | ||
100 | 0,92% | 0,12% | 28,632 | 32,676 | ||
80 | 1,01% | 0,12% | 28,491 | 34,389 | ||
60 | 1,11% | 0,12% | 25,667 | 32,868 | ||
50 | 1,23% | 0,12% | 24,735 | 30,273 | ||
45 | 1,37% | 0,12% | 23,764 | 30,454 | ||
40 | 1,71% | 0,12% | 23,153 | 28,821 | ||
37 | 1,98% | 0,12% | 22,693 | 27,059 | ||
35 | 2,25% | 0,12% | 22,381 | 27,239 |
Graf: Závislost relativní chyby na počáteční teplotě
Graf: Závislost časové složitosti na počáteční teplotě
Závislost relativní chyby na velikosti instance
Jen tak pro zajímavost, srovnání průměrné relativní chyby pro různě velké instance. Nastavení parametrů: dT = 0,98, Tf = 5, equ = n, T0 = 67,31Graf: Závislost relativní chyby na velikosti instance
Ukázky průchodu algoritmu stavovým prostorem
Na následujících grafech je zobrazena velikost ceny v závislosti na prozkoumaných stavech pro různé parametry. Pro zvětšení klikněte na prosím na graf.Závěr
Algoritmus simulované ochlazování je poměrně snadný na implementaci. Z experimentů můžeme říct, že je časově náročnější než hladový algoritmus a při inicializaci triviální konfiguraci dává průměrně horší výsledky. Pokud inicializujeme SA hodnotou získanou GP algoritmem, v průměru vždy dojde ke zlepšení relativní chyby. Protože algoritmus si pomatuje nejlepší řešení, nemůže nikdy vyjít horší výsledek než u GP.U tohoto algoritmu (stejně jako u dynamického programování) dopředu známe počet iterací cyklu, tudíž můžeme odhadnout časovou náročnost. Proto je na první pohled trochu divné, řádově rozdílný čas při inicializaci triviálním řešením a řešením dodaným GP algoritmem. Skrytá časová závislost je v generování nového stavu. Ten generujeme tak, že změníme bit na náhodné pozici v současné konfiguraci, ale výsledná konfigurace musí být přípustným řešením. Proto pokud vyjdeme z triviální konfigurace je velká pravděpodobnost, že nový stav vygenerujeme na 1. pokus. U již nalezeného řešení např. algoritmem GP opakujeme generování poměrně dlouho, než dostaneme přípustnou konfiguraci.
Dále z provedených experimentů můžeme udělat tyto závěry:
- Čím blíže dT k 1 tím menší relativní chyba, ale větší časová náročnost.
- Počáteční teplotu je vhodné volit jako funkci velikosti instance. V experimentu dává nejlepší výsledky n * 2. Na dostuduj jsem našel tento vztah: M * suma(ceny) / (N * suma(váhy)), který dává podobné výsledky.
- Teplotu tuhnutí je nejlepší "vykoukat" z grafů pro závislost ceny na počtu prozkoumaných stavů. Pokud se cena nemění, mělo by dojít k zamrazení. To můžeme přímo ošetřit v programu a nemusíme tento parametr nastavovat.
- Velikost equilibria, čím větší tím menší relativní chyba, ale větší časová náročnost.