Závěrečná zpráva
Jakub Holý: Řešení problému batohu hrubou silou a heuristikou
36PAA LS 2003
Úvod
Teoretický
úvod a vysvětlení
metody hrubé síly resp. heuristiky s dovolením vynechám, neboť jsou
obsaženy v zadání (pro zvědavé viz odkazy).
V následujících odstavcích porovnávám obě metody řešení podle rychlosti
výpočtu (je zde brán skutečný čas, což zdaleka není optimální, ale pro naše
účely to stačí) a podle optimality (metoda hrubé síly samozřejmě vždy najde
nejlepší řešení - bráno podle ceny obsahu - a otázka je pouze jak dobrá je
heuristika, která je nutně podoptimální).
Algoritmy
1. Hrubá síla
Algoritmus zkouší všechny možnosti, které nepřekračují nosnost batohu. Jinak
řečeno, prochází téměř celý stavový prostor, který lze reprezentovat jako
listy binárního stromu - cesta do daného listu určuje, které věci jsou v
batohu obsaženy (n-tý uzel má následující dva potomky: "n-tá věc je obsažena"
a "n-tá věc není obsažena"). Má implementace neužívá reprezentace celého
stromu (případně okleštěného o "řešení" nesplňující omezující podmínku),
ale místo toho pracuje s obrazem cesty v tomto grafu, počínající kořenem
a končící v listu. Tato cesta je měněna, až dokud nejsou vyzkoušeny všechny
přijatelné možnosti. Pro podrobnosti viz rozsáhlé komentáře ve zdrojovém
kódu.
2. Heuristika
V tomto způsobu řešení věci seřadíme podle poměru cena/váha a následně je
v tomto pořadí zkoušíme vložit do batohu; pokud by vložením nějaké věci došlo
k překročení maximální kapacity (nosnosti), tato věc vložena není a pokračuje
se s následující (tzn. algoritmus zde neskončí, ale pokračuje až k poslední
věci v řadě). Tato heuristika byla zvolena, protože z představených metod
je nejpropracovanější a zároveň je stále jednoduchá.
Porovnání rychlosti
Naměřené hodnoty jsou pouze orientační a slouží jen k hrubému porovnání
obou metod navzájem. Na jiném stroji či při použití lepšího překladače by
byly odlišné.
žlutá - heuristika
|
fialová - řešení hrubou silou
|
Z grafu jasně vidíme, že podle očekávání doba výpočtu pro metodu
hrubé síly s počtem věcí exponenciálně roste, zatímco doba výpočtu heuristickou
metodou je téměř konstantní (pomalejší řazení věcí a prodloužení času na
procházení seřazených věcí je zde zanedbatelné).
Porovnání úspěšnosti
1. Četnost dosažení nejoptimálnějších výsledků heuristikou
Následující graf ukazuje, jak často heuristický algoritmus dosáhl téhož
výsledku, jako metoda hrubé síly.
Zpočátku je heuristika skoro tak úspěšná, jako metoda hrubé síly, později
však procento případů, kdy dosáhla nejlepšího řešení, klesá. To souvisí
s rostoucí složitostí problému a tím i rostoucím množstvím těch lepších
řešení, která heuristice uniknou.
2. Průměrná odchylka od optimality
Podívejme se, jak moc se řešení heuristikou odchyluje od optimálního řešení.
Následující tabulka obsahuje pro každý počet věcí průměrnou odchylku od
optimálního výsledku spočtenou vždy jako průměr z padesáti relativních odchylek
pro jednotlivé instance. Odchylka pro instanci byla spočtena takto:
(optimální výsledek - výsledek heuristiky) / optimální výsledek
Odchylka od optimality
4 věci
|
10 věcí
|
15
|
20
|
22
|
25
|
27
|
30
|
32
|
35
|
37
|
40 věcí
|
1,9%
|
1,4%
|
0,3%
|
0,6%
|
0,5%
|
0,4%
|
0,7%
|
0,5%
|
0,5%
|
0,4%
|
0,4%
|
0,4%
|
Jsou-li výsledky správné, můžeme pozorovat jev, který jsem neočekával -
ač klesá množství případů, kdy bylo dosaženo nejlepšího výsledku (viz předchozí
graf), tak výsledky heuristiky se blíží výsledkům metody hrubé síly,
jinak řečeno, výsledky dosažené heuristikou se nezhoršují, ale zlepšují.
Příčinou nejspíše bude to, že v rostoucím množství věcí a tím i celkové ceny
obsahu batohu se pár ne zcela ideálně zvolených věcí lépe "ztratí".
Největší odchylka od optimálního řešení byla 0,25%, v absolutních číslech
222 oproti 295 (nastalo pro 4 věci).
Závěr
Heuristika se na daných instancích ukázala jako velmi dobrá, takže ji lze
použít i pro jednodušší problémy, které ještě v rozumném čase zvládne i
metoda hrubé síly. Pro problémy složitější nám nic jiného nezbude, vzhledem
k exponenciálnímu nárůstu spotřeby času u metody hrubé síly. Domnívám se,
že odchylka od optima je opravdu nízká, a není tedy třeba usilovat o nalezení
lepší heuristiky.
Přílohy
Zdrojové kódy programového řešení:
- zpracování soboru se vstupními daty (společné pro obě řešení):
ksack_in.hh.html a ksack_in.cc.html
- řešení hrubou silou:
hw1_force.hh.html a hw1_force.cc.html
- řešení heuristikou:
hw1_heuristic.hh.html a hw1_heuristic.cc.html