ČVUT FEL X36PAA - Problémy a algoritmy 4. úloha - Experimentální hodnocení algoritmů pro řešení problému batohu Jméno: Marek Handl Datum: 3. 2. 29 Cvičení: Pondělí 9: Zadání Prozkoumejte citlivost metod řešení problému batohu na parametry instancí generovaných generátorem náhodných instancí. Máte-li podezření na další závislosti, modifikujte zdrojový tvar generátoru. Na základě zjištění navrhněte a proveďte experimentální vyhodnocení kvality řešení a výpočetní náročnosti. Pokud možno, prezentujte algoritmy jako body v ploše, jejíž souřadnice jsou výše uvedená kritéria. Úvod Ve všech provedených měřeních vždy pozorujeme vztah jedné veličiny k počtu stavů, které je nutné projít pro výpočet. Všechny ostatní možnosti nastavení generátoru instancí zůstavají fixní. Velikost instance Počet instancí Maximální hmotnost věci Maximální cena věci Poměr kapacity k hmotnosti Granularita 2 4 1 25,6 nerozlišovat Tab 1 standardní nastavení generátoru instancí Jsou porovnávány tři algoritmy výpočtu problému: metoda větví a hranic, dynamické programování a heuristika podle poměru cena/hmotnost s testem nejcennější věci. Heuristika obecně nenalézá optimální řešení, a proto také sledujeme průměrnou odchylku heuristického řešení od optimálního. K výpočtu odchylky se používá vzorec: chyba = (cenaoptimum cenaheuristika) / cenaoptimum. Metoda větví a hranic se chová obdobně jako hrubá síla, jen s tím rozdílem, že se počítají pouze stavy, které mají naději zlepšit dosavadní nejlepší nalezené řešení. Počet stavů, které bude nutné pro výpočet projít, se nedá odhadnout. V nejhorším případě se z toho stane hrubá síla. Dynamické programování těží z faktu, že existuje značně omezené množství možných součtů cen věcí, které jsou do batohu dávány. Tímto přístupem je možné si ukládat již zjištěné výsledky a neopakovat některé výsledky. Počet stavů je tedy v tomto případě roven počtu věcí násobeno součtem cen věcí. Heuristika nejprve seřadí věci podle poměru cena/hmotnost a pak přidává nejvýhodnější věci do batohu, dokud se tam hmotnostně vejdou. Na závěr se ještě řešení porovná se situací, kdy se do batohu vloží jen ta nejcennější věc, a vezme se lepší řešení. Výpočetně nejnáročnější je v tomto případě seřazení věcí. Počet stavů je tedy roven N*log(N)+X+1, kde N je počet věcí, X je počet věcí které do batohu opravdu dáme a jednička symbolizuje porovnání s nejcennější věcí. Maximální hmotnost Toto měření zkoumá vliv maximální možné hmotnosti věci na počet stavů, které se projdou při výpočtu, a na kvalitu řešení dosaženého heuristikou. Max hmotnost Větve a hranice Dynamické programování Heuristika 5 5624 49319 11 1 5391 5382 11 15 5382 51112 11 2 4444 49889 11 25 5836 5993 11
3 5332 51177 11 35 7237 5263 11 4 4827 5171 11 45 6886 51679 11 5 6696 5112 11 Tab 2 počet stavů prošlých při výpočtu v závislosti na maximální hmotnosti věci 6 5 Počet stavů 4 3 2 Větve a hranice Dynamické programování Heuristika 1 1 2 3 4 5 6 Maximální hmotnost Graf 1 počet stavů prošlých při výpočtu v závislosti na maximální hmotnosti věci 2,5 2 2,1 1,95 1,83 Průměrná chyba (%) 1,5 1 1,52 1,62 1,51 1,36 1,39 1,53 1,59,5 1 2 3 4 5 6 Maximální hmotnost Graf 2 procentní průměrná chyba heuristického řešení vzhledem k optimálnímu Zhodnocení V tomto měření se nepodařilo vypozorovat žádnou závislost mezi maximální hmotností věcí a počtem propočítaných stavů. U heuristického řešení a u dynamického programování ani nelze předpokládat, že
by se nějaká závislost projevila, jelikož jsou tyto metody na maximální hmotnosti nezávislé. U průměrné chyby heuristického řešení je zřejmé, že chyba kolísá mezi 1,3% a 2%, ale nelze vypozorovat žádný trend. Maximální cena Měření zkoumá vliv maximální možné ceny věci na počet stavů prošlých při výpočtu a na kvalitu řešení dosaženého heuristikou. Max cena Větve a hranice Dynamické programování Heuristika 5 545 1436 11 1 5852 1986 11 15 5276 388 11 2 5681 39531 11 25 534 5141 11 3 5169 577 11 35 4338 68111 11 4 566 79684 11 45 5442 87514 11 5 386 99539 11 Tab 3 počet stavů prošlých při výpočtu v závislosti na maximální ceně věci 12 1 Počet stavů 8 6 4 Větve a hranice Dynamické programování Heuristika 2 1 2 3 4 5 6 Maximální cena Graf 3 procentní průměrná chyba heuristického řešení vzhledem k optimálnímu
2,5 2, 2,1 2,3 Průměrná chyba (%) 1,5 1,,5 1,56,98 1,75 1,88 1,52 1,41 1,67 1,4, 1 2 3 4 5 6 Maximální cena Graf 4 procentní průměrná chyba heuristického řešení vzhledem k optimálnímu Zhodnocení Z grafu 3 je zřejmé, jak je metoda dynamického programování lineárně závislá na součtu cen věcí, resp. na maximální ceně věci. U průměrné chyby heuristického řešení není vidět žádný trend. Více malých (lehkých) věcí Měření zkoumá vliv převažujícího výskytu lehkých věcí na počet stavů potřebných pro výpočet a na kvalitu řešení dosaženého heuristikou. Pravděpodobnost výskytu věci s hmotností w je (1/w)^koef. Koeficient Větve a hranice Dynamické programování Heuristika,5 3196 5754 12 1, 125 49865 14 1,5 1261 52118 15 2, 1535 4885 14 2,5 4155 5194 12 3, 1263 5264 11 3,5 1433 5666 1 4, 1942 49454 1 4,5 13682 5194 1 5, 1234 5293 1 Tab 4 počet stavů prošlých při výpočtu v závislosti na tom, jak moc převažují věci s nižší váhou
6 5 Počet stavů 4 3 2 1 Větve a hranice Dynamické programování Heuristika, 1, 2, 3, 4, 5, 6, Hmotnost Graf 5 procentní průměrná chyba heuristického řešení vzhledem k optimálnímu 1,8 Průměrná chyba (%) 1,6 1,54 1,4 1,2 1,29 1,38 1,28 1,36 1,32 1,8,73,6,55,4,2,19,7, 1, 2, 3, 4, 5, 6, Koeficient Graf 6 procentní průměrná chyba heuristického řešení vzhledem k optimálnímu Zhodnocení Z měření se zdá, že metoda větví a hranic je na koeficientu zastoupení lehkých věcí závislá. S větším koeficientem roste počet prošlých stavů. Největší nárůst je patrný pro rozmezí hodnot koeficientu 2 a 3. Průměrná chyba heuristického řešení značně klesá se vzrůstajícím koeficientem. Pro koeficient s hodnoutou 5, je chyba již pouhých 7 setin procenta, tedy řešení je velmi blízké k optimu. Více velkých (těžkých) věcí Měření zkoumá vliv převažujícího výskytu těžkých věcí na počet stavů potřebných pro výpočet a na kvalitu řešení dosaženého heuristikou. Pravděpodobnost výskytu věci s hmotností w je (1/(wmaxw))^koef.
Koeficient Větve a hranice Dynamické programování Heuristika,5 779 49316 1 1, 1358 5113 1 1,5 13718 52159 99 2, 12969 5117 99 2,5 16149 53626 99 3, 13934 51272 99 3,5 115 49787 99 4, 11595 48824 99 4,5 1258 5317 99 5, 12974 49848 99 Tab 5 počet stavů prošlých při výpočtu v závislosti na tom, jak moc převažují věci s vyšší váhou 6 5 Počet stavů 4 3 2 Větve a hranice Dynamické programování Heuristika 1, 1, 2, 3, 4, 5, 6, Hm otnost Graf 7 procentní průměrná chyba heuristického řešení vzhledem k optimálnímu
1,6 1,4 1,4 Průměrná chyba (%) 1,2 1,,8,6,4,2,81,68,85 1,1 1,25 1,2,58,97,34,, 1, 2, 3, 4, 5, 6, Koeficient Graf 8 procentní průměrná chyba heuristického řešení vzhledem k optimálnímu Zhodnocení Metoda větví a hranic vykazuje mírně rostoucí trend počtu propočítaných stavů pro zvyšující se hodnotu koeficientu. Průměrná chyba má složitější průběh, ale zdá se, že celkově má klesající trend. Závěr Z provedených měření se podařilo vypozorovat náznaky některých závislostí. Zcela jasná je závislost metody dynamického programování na maximální ceně, ale to byl očekáváný výsledek jelikož vyplývá z povahy metody. Ostatní závislosti již nejsou tak zřejmé, ale o to jsou zajímavější. Pozoruhodné jsou výsledky vlivu granularity. Měření ukazují, že pokud se zvyšuje koeficient ovlivňující zastoupení lehkých (resp. těžkých) věcí, průměrná chyba heuristického řešení znatelně klesá. Přitom heuristické řešení je v porovnání s ostatními metodami rychlejší o několik řádů. 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 T77 2,4 GHz a 3GB paměti. Podpůrné programy Programy byly napsány v jazyce C++, kompilovány ve Visual C++ 25. Zdrojové kódy knapsack_bb.cpp - branch&bound knapsack_dynamic.cpp - dynamické programování knapsack_mostvalued.cpp - heuristika s testem nejcennější věci knapsackcompare.cpp - pomocný program pro porovnání heuristických řešení a hrubé síly knapsack, knapsack_bb, knapsack_dynamic, knapsack_mostvalued: Použití: program.exe input_file [output_file1 [output_file2] 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í /1 /1... Program zpracovává input_file, řešení zaznamenává do output_file a na standardní výstup vypíše časy výpočtu, maximální a průměrnou relativní chybu heuristiky. 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.