Úloha 4
Autor: Petr Chytil
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.
Poznámky k řešení
Měření
byla provedena pomocí knihovní funkce
System.nanoTime(), kterou jazyk Java poskytuje.
A to na stroji s
procesorem Core Duo 1.66GHz a operačním systémem
Windows XP 32bit.
Nebylo započítáváno
načítaní dat ze souboru ani jejich zapisování
na výstup.
U heuristiky byl započítán i čas
potřebný k seřazení pole prvků dle zvoleného
poměru cena/váha.
Změřené časy v nanosekundách jsou k nahlednutí v adresáři data.
Nepřehledné výpočty vedoucí k číslům v níže uvedených tabulkách jsou k nahlédnutí v souboru vypocty.
Každá změřená časová hodnota v tabulce je průměrem měření 50ti instancí.
Velikost instance
Graf
závislost časové náročnosti výpočtu na velikosti instance jsme si mohli ověřit již v úkolu 3 – zdrojová data těchto grafů jsou k nalezení tamtéž.
Stejně tak máme změřeny relativní odchylky heuristik pro různě velké instance.
Maximální váha věci
Tabulka
maxvaha |
bb |
brute |
heur |
heurmax |
dyn |
25 |
0,6687443 |
35,78205606 |
0,02905398 |
0,02113116 |
0,25756894 |
50 |
0,70529632 |
36,192287 |
0,03204322 |
0,02138816 |
0,42664628 |
75 |
0,8091308 |
36,34990478 |
0,02941158 |
0,02336614 |
0,77770798 |
100 |
0,6894395 |
36,20469082 |
0,02941714 |
0,0229582 |
0,99001974 |
125 |
0,76875136 |
36,21068044 |
0,0301547 |
0,02113672 |
1,67528564 |
Graf
Z tabulky je vidět, že maximální váha věci má vliv na časovou náročnost řešení hlavně u dynamického programování. Ta stoupá téměř lineárně s rostoucí maximální váhou věci. Jistá citlivost se projevuje také u metody branch & bounds.
Maximální cena věci
Tabulka
maxvaha |
bb |
brute |
heur |
heurmax |
dyn |
50 |
0,78106578 |
35,72374148 |
0,03092574 |
0,02075126 |
1,09870388 |
100 |
0,67355492 |
36,36305736 |
0,03133354 |
0,02194136 |
1,05600006 |
150 |
0,85983552 |
36,13141898 |
0,03140618 |
0,02189106 |
0,91227794 |
200 |
0,70424036 |
36,40982314 |
0,03007076 |
0,02179602 |
1,02647116 |
250 |
0,80039218 |
35,91893388 |
0,03001504 |
0,0212765 |
0,9978362 |
300 |
0,7770597 |
36,09652632 |
0,0298027 |
0,02194698 |
1,04241742 |
Graf
Z tabulky je vidět, že významější změny v naměřených hodnotách jsou jen u dynamického programování a u metody branch & bounds. Stejně jako tomu bylo u maximální hmotnosti věci. U maximalní ceny věci však nepozorujeme lineární závislost.
Poměr kapacity batohu k sumární váze
Tabulka
maxvaha |
bb |
brute |
heur |
heurmax |
dyn |
0,1 |
0,0659525 |
0,06952834 |
0,03099276 |
0,02137706 |
0,16095342 |
0,3 |
1,15791812 |
4,07783676 |
0,02966852 |
0,0206674 |
0,49691228 |
0,5 |
1,57920064 |
25,9738989 |
0,02961832 |
0,0210138 |
0,76613658 |
0,7 |
0,348547 |
40,9020867 |
0,0302385 |
0,02198048 |
1,24681196 |
0,9 |
0,1326426 |
42,18831722 |
0,03116036 |
0,0213938 |
2,52853916 |
Graf
U grafu je použito logaritmické měřítko.
Vlivu tohoto parametru se vyhly pouze heuristiky. Proto je neuvádím v grafu. Nejdramatičtější závislost je z pochopitelných důvodů u brute force. Ten ořezává jen v případě plného batohu a zvyšováním poměru se zvýší počet případů, kdy k téměř žádnému ořezání nedojde.
Zhodnocení a závěr
Rozhodl jsem se měřit časovou náročnost výpočtu jednotlivých algoritmů na těchto parametrech generátoru:
velikost instance
Nebýt tohoto parametru, tak si vystačíme s brute force algoritmem. Veškeré naše snažení vedlo právě ke zbavení se exponencíální závislosti na velikosti instance. U metody branch & bounds exponencielu trochu zmírníme za cenu citlivosti algoritmu na další parametry instance, u heuristik zase nedosahujeme optimálního řešení. Dynamické programování je pseudopolynomiální a závisí na mnoha parametrech instance (plyne z měření dalších parametrů generátoru instancí).
maximální váha
Zde se objevila jistá závislost u metody branch & bounds. Z naměřených hodnot není jasné, zda se jedná o náhodné výkyvy nebo o nějakou silnější závislost. Dynamické programování se lineárně zpomaluje s růstem tohoto parametru. Objev takto pěkné závislosti považuji za úspěch.
maximální cena
Na tento parametr byly opět citlivé metody branch & bounds a dynamické programování. Z grafu je však vidět, že závislost se pravděpodobně neřídí žádnou jednoduchou funkcí a tak si z grafu žádný objevný závěr neodneseme. Snad kromě toho, že nějaká ta citlivost na tento parametr u daných metod existuje.
poměr kapacity batohu k sumární váze
Brute force zde ukazuje silnou závislost na tomto parametru. Nedá se však mluvit o tom, že by závislost rostla nade všechny meze, protože je tento parametr shora omezen jedničkou. Vše nad jedničku se řeší prostým naskládáním všech předmětů do batohu a tak si brute force projde celý stavový prostor a dosahuje nejhorší možné časové náročnosti. Ukázalo se, že zde velmi pomáhá aplikace branch & bounds metody. Časy pro velikost parametru nad 0,5 začínají dokonce klesat a pro krajní hodnoty intervalu 0 až 1 dokonce předčí dynamické programování. Je to pochopitelné, protože listy binárního stromu, který vzniká rekurzí, zde nabývají podobných hodnot sumární ceny – do batohu se vejdou téměř všechny předměty. Porovnání se zbývající cenou předmětů, které mají být ještě vloženy nám tu pomáhá a stavový prostor se pěkně prořezává. Dynamické programování je na tomto parametru silně závislé. Vždyť počet řádků tabulky, kterou vytváří a následně musí propočítat je dán právě kapacitou batohu.
Citlivost chyb heuristik jsem měřil jen u prvního parametru (převzato z úlohy 3). U dalších parametrů jsem se omezil jen na časovou náročnost. A to z důvodu počtu instancí, které bylo třeba zpracovat (viz adresář data).