Problémy a algoritmy
Řešení problému batohu
(1. úloha)


Zadání


Popis algoritmů

Řešení hrubou silou
Pro řešení hrubou silou jsem vytvořil dva algoritmy. První je čisté řešení hrubou silou, tedy vždy jsou zkoušeny všechny varianty.
Druhá varianta je malým zjednodušením, které spočívá v seřazení věcí dle hmotnosti od nejlehčí. To nám umožní ukončit větev výpočtu dříve, protože pokud se testovaná věc do batohu nevejde, nemá smysl zkoušet ani věci následující. Tato úprava by měla přinést malé zlepšení pro větší počet věcí (při malém počtu zabírá nějaký čas počáteční řazení věcí).
Oba algoritmy zkouší (skoro) všechny varianty uložení věcí do batohu, jejich složitost je tedy exponenciální - O(2n).

Řešení heuristikou
Tato varianta je zjednodušením algoritmu - nejsou zkoušeny všechny varianty, naopak se věci přidávají, dokud se do batohu ještě nějaká vejde. Tím samozřejmě nezískáme nejlepší řešení, ale při dobré volbě hodnotícího kritéria se mu můžeme přiblížit. Různé heuristiky se liší volbou pořadí přidávání věcí do batohu, v našem případě je kritériem poměr cena/váha věci.
Heuristické algoritmy mají samy o sobě lineární složitost, která je však zhoršena počátečním řazením (pokud se věci řadí). Proto je složitost algoritmů většinou O(n*log(n)), podle použitého řazení.


Výsledky měření

Srovnání časové složitosti
Pro srovnání časové složitosti jednotlivých algoritmů uvádím tabulku průměrné doby běhu algoritmu pro 50 instancí (zkušební data) v závislosti na počtu věcí. Je důležité upozornit, že hodnoty neuvádí přímo časovou složitost algoritmu, ale celkovou dobu běhu, přičemž není vždy možno zaručit algoritmu všechen čas procesoru - hodnoty mohou být ovlivněny swapováním OS. Neuvedené hodnoty byly příliš časově náročné pro měření.
Pro přehlednější srovnání je též uveden graf vytvořený z této tabulky.

počet věcí hrubá síla 1 hrubá síla 2 heuristika
4 < 1 < 1 < 1
10 1.0 3.2 < 1
15 129.6 129.8 1.2
20 3507.8 3058.4 < 1
22 14928.8 13989.4 2.2
25 107382.1 107952.8 < 1
27 531990.0   1.0
30     < 1
32     < 1
35     < 1
37     1.2
40     1.0

 

časová složitost algoritmů

 

Chyba heuristické metody
Jak již bylo uvedeno, pomocí heuristických metod nezískáme přesné řešení, ale řešení jemu "blízké" - ale radikálně snížíme složitost algoritmu.
Následující tabulka je srovnáním výsledků heuristické metody s optimálním řešením. Pro každý počet věcí byly otestovány výsledky algoritmu se všemi 50-ti instancemi.
Přesnost řešení je průměr "relativní přesnosti" - poměru cena_heuristika / cena_max. Počet přesných výsledků udává, pro kolik z 50-ti instancí byl výsledek heuristického algoritmu optimální (přesnost 100%). Maximální chyba je maximální relativní chyba ze všech instancí (1 - přesnost), ID max. chyby je ID instance, pro kterou byla chyba řešení maximální.

počet věcí přesnost řešení [%] počet přesných výsledků max. chyba [%] ID max. chyby
4 92.81 32 68.37 9002 
10 97.07 23 15.72 9079 
15 99.20 30 5.64 9100 
20 98.73 20 6.12 9184 
22 98.57 15 8.75 9211 
25 98.74 16 5.42 9272 
27 99.09 18 3.87 9320 
30 99.04 8 3.33 9355
32 99.31 14 3.61 9404
35 99.05 14 3.82 9480
37 99.39 16 2.20 9514
40 99.38 12 2.54 9558

 

Pokud by vás zajímaly podrobné výsledky měření, jsou zazipované ke stažení zde. V adresářích output se nachází výsledek algoritmu se stejným formátem jako originální výsledky, adresář table obsahuje "důležitá" data - ID zadání, čas běhu algoritmu v ms, dosažená cena, optimální (maximální) cena a relativní chyba řešení ((opt-max) / max) (není uvedena v procentech, i když jsou procenta za hodnotou uvedeny).


Závěr

Ověřili jsem exponenciální složitost řešení problému batohu hrubou silou a též praktickou neřešitenost problémů s takto velkou složitostí - pro poměrně malý počet věcí (30) je již doba běhu algoritmu nepřípustná (více jak 20min).
Srovnáním s heuristickou metodu jsme též ověřili značný rozdíl mezi polynomiální a exponenciální složitostí.
Též byl ověřen předpoklad kratšího běhu upravené metody hrubou silou (pro n = 25 nebyl test zcela přesný, u 1. metody byly z časových důvodů provedeny pouze tři měření. Toto zlepšení je však vzhledem k celkovému běhu algoritmu zanedbatelné.

Při kontrole chyb heuristické metody jsme dospěli k závěru, že pro větší počet věcí (>10) je toto řešení v průměru srovnatelné a v našich případech dokonce ani největší chyby nejsou nijak extrémně velké (to však nemusí platit obecně).