ČVUT FEL X36PAA - Problémy a algoritmy 5. úloha - Seznámení se se zvolenou pokročilou iterativní metodou na problému batohu Jméno: Marek Handl Datum: 4. 2. 2009 Cvičení: Pondělí 9:00 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 slekce, 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í. Simulované ochlazování Použitého algoritmus lze popsat následujícím pseudokódem. temperature = initialtempfactor * bestprice / log(2); // set initial temperature to a factor of best valued item that fits in the sack state = putfirstpossibleiteminsack(); while (temperature > mintemperature) { // i.e. while not frozen steps = 0; while (steps < stepscount*count) { // i.e. while not equilibrium ++steps; state = changestate(state); if (state.getprice() > best.getprice()) { // find a new state or keep the same best = state; temperature *= cooldownfactor; // i.e. cool down statestested += steps; changestate(state) { newstate = getrandomneighbor(state); if (newstate.getprice() > state.getprice()) { return newstate; delta = state.getprice() newstate.getprice(); if (random() < exp(-delta/temperature)) { return newstate; return state; // keep the old state getrandomneighbor(state) { index = randomitemnumber(); if (index not in state sack) { state = additemtosack(index, state); else { state = removeitemfromsack(index, state);
return state; Chování algoritmu je možné ovlivňovat nastavením hodnot parametrů: o initialtempfactor určuje velikost prvotní teploty (v násobcích hodnoty nejcennější věci, která se vejde do batohu) o mintemperature určuje minimální teplotu, pro nižší teplotu se algoritmus ukončí o stepscount určuje počet průchodů vnořeného while-cyklu v násobcích počtu věcí o cooldownfactor určuje ochlazovací faktor Měření Byla provedena měření sledující vliv jednotlivých parametrů na chování a výsledky výpočtu. Je sledován počet stavů, které se při výpočtu projdou a relativní odchylka výsledku vzhledem k optimálnímu řešení. K výpočtu odchylky se používá vzorec: chyba = (cenaoptimum cenaheuristika) / cenaoptimum. U grafů odchylek je zobrazen i trend vypočtený standardní funkcionalitou MS Excel 2003 Power Trendline. Jeho vzorec následuje. Equation: y=c*x^b c: =EXP(INDEX(LINEST(LN(y),LN(x),,),1,2)) b: =INDEX(LINEST(LN(y),LN(x),,),1) Každé měření bylo prováděno na 40 různých instancích a výsledky zprůměrovány. Ve všech provedených měřeních vždy měníme pouze jeden parametr, ostatní zůstavají fixní. V následující tabulce jsou uvedeny standardní hodnoty parametrů. initialtemp mintemperature stepscount cooldownfactor 1 0,01 2 0,9 Tab 1 standardní hodnoty parametrů algoritmu
Počáteční teplota - initialtempfactor 2,90 Po čet stavů 4500 4000 3500 2,70 2,30 2,10 1,90 1,70 Prům ěrná chyba (% ) Pow er () 3000 0,0 1,0 2,0 3,0 4,0 5,0 6,0 Počáteční teplota Graf 1 počet stavů prošlých při výpočtu a průměrná odchylka řešení od optima vzhledem k hodnotě počáteční teploty Zvyšováním počáteční teploty dáváme algoritmu větší šanci opustit oblast lokálního minima. Je zřejmé, že počet prozkoumaných stavů s vyšší počáteční teplotou roste, ale snižování průměrné chyby tak přesvědčivé není. Je patrný klesající trend, takže lze tvrdit, že zvyšováním původní teploty dosahujeme lepších výsledků, ale je nutné počítat s výkyvy výkonnosti.
Minimální teplota - mintemperature 3,10 2,90 4500 2,70 4000 3500 2,30 2,10 1,90 Průměrná chyba (% ) Pow er () 1,70 3000 0,000 0,010 0,020 0,030 0,040 0,050 Minimální teplota Graf 2 počet stavů prošlých při výpočtu a průměrná odchylka řešení od optima vzhledem k hodnotě teploty, kdy se algoritmus ukončuje Zvyšováním minimální teploty zastavíme algoritmus dříve. Dosáhneme tak zkrácení výpočtu. Z měření vyplývá, že ve zkoumaném rozmezí nemá minimální teplota vliv na kvalitu výsledku. Dokonce se zdá, že průměrná chyba klesá společně s nárůstem minimální teploty, což je přesně opak očekávaného chování.
Počet průchodů - stepscount 2 4,50 4,00 P očet stavů 20000 1 10000 0 0 2 4 6 8 10 12 Počet průchodů 3,50 3,00 2,00 1,00 0,50 0,00 Pow er () Graf 3 počet stavů prošlých při výpočtu a průměrná odchylka řešení od optima vzhledem k faktoru, který ovlivňuje kolikrát se provede vnitřní cyklus algoritmu před ochlazením, které se při výpočtu prozkoumají lineárně roste s počtem provedení vnitřního cyklu (než se dosáhne equilibria). Tato závislost je přirozená. Je patrné, že tento parametr má značný vliv na průměrnou chybu řešení. Pro hodnoty 1 až 4 klesá chyba velmi znatelně.
Parametr ochlazování cooldownfactor 2 5,00 4,50 20000 4,00 P očet stavů 1 10000 3,50 3,00 2,00 Prům ěrná chyba (%) Pow er () 1,00 0,50 0 0,00 0,77 0,87 0,97 Parametr ochlazování Graf 4 počet stavů prošlých při výpočtu a průměrná odchylka řešení od optima vzhledem k rychlosti ochlazování Nárůst počtu zkoumaných stavů vzhledem k hodnotě parametru ochlazování má polynomiální průběh. Pro hodnoty velmi blízké 1 je ale nárůst počtu stavů enormní. Souběžně s tím klesá průměrná chyba výsledku, zdá se že lineárně. Závěr Z provedených měření lze vidět vliv parametrů algoritmu na výpočetní čas a na kvalitu nalezeného řešení. Ukázalo se, že nemá cenu nastavovat příliš vysokou počáteční teplotu. Taková hodnota pouze vede k prodlužování výpočtu s minimálním pozitivním vlivem na kvalitu výsledku. Jako vhodná hodnota se jeví číslo 2. Parametr minimální teploty, se zdá, také nemá cenu nastavovat příliš nízko. Hodnota 0,04 vedla k rychlému výpočtu s malou chybou. Další dva parametry se ukázaly jako důležitější. Je nutné zvolit kompromis mezi časem výpočtu a požadovanou kvalitou. Jako vhodné se jeví hodnoty 6 pro počet provedení vnitřního cyklu a 0,96 pro parametr ochlazování. Výpočetní sestava Výpočty byly prováděny v prostředí Windows Vista Business 32bit na stroji s procesorem Intel Core 2 Duo T7700 2,4 GHz a 3GB paměti.
Podpůrné programy Programy byly napsány v jazyce C++, kompilovány ve Visual C++ 2005. Zdrojové kódy annealing.cpp knapsackcompare.cpp řešení - pomocný program pro porovnání heuristických a optimálních annealing: Použití: program.exe annealing.exe input_file initial_temperature min_temperature steps_count cooldown_factor Formát input_file: každá instance na jednom řádku, na řádku jen celá čísla v tomto formátu ID n M váha cena váha cena... Formát output_file: každá instance na jednom řádku, na řádku jen celá čísla ID n cena řešení 0/1 0/1... Program zpracovává input_file, řešení zaznamenává do v_ +input_file a na standardní výstup vypíše počet prošlých stavů. knapsackcompare.cpp: Použití: knapsackcompare.exe input_optimal input_heuristic Formáty vstupních souborů viz výše. Program vypíše na standardní výstup průměrnou a relativní chybu heuristiky.