Tato stránka vyžaduje podporu CSS stylů
3. domácí úloha z předmětu PAA
Řešení problému batohu metodou větví a hranic, dynamickým programováním a heuristikou podle poměru cena/váha s testem nejdražší věci
Oto Válek
FEL ČVUT, letní semestr 2001/2002, cvičení St 12:45
1. Specifikace úlohy
Problém
batohu
je řešen metodou větví a hranic, dynamickým programovním a heuristikou podle poměru cena/váha s testem nejdražší věci.
Byly použity připravené
instance
problému pro n = 4, 10, 15, 22, 25, 27, 30, 32, 35, 37, 40.
Do srovnání byly zahrnuty i výsledky algoritmů hrubé síly a jednoduché
heuristiky cena/váha z
1.úlohy.
Čítač kroků řešení byl zvyšován na vhodném místě v hlavní rekurzivní funkci algoritmu.
U heuristik vybírajících nejvyšší poměr cena/váha byl navíc umístěn do cyklu
příslušné funkce, aby se projevila O(n) složitost pro každý navštívený stav.
U metody hrubé síly, dyn. programování a metody větví a hranic však počet kroků
zhruba odpovídá počtu navštívených stavů stavového prostoru.
Čas byl měřen funkcí ftime() ze std. C knihovny v prostředí WinNT.
Byl použit kompilátor z MS VC 5.0 s defaultním nastavením a procesor Intel Pentium 100 Mhz.
2. Řešení metodou větví a hranic
Metoda větví a hranic je rozšířením řešení hrubou silou.
Kromě podmínky testující přetížení batohu je sestup stromem stavového prostoru
omezen podle ceny (tedy optimalizačního kritéria).
Rekurzívní procedura Dalsi(vec, potencionalni_cena)
je rozšířena o parametr potencionalni_cena, max. cenu,
které je ještě možno v této větvi dosáhnout. Na počátku je roven součtu cen
všech věcí, jakmile se nějaká věc do batohu NEPŘIDÁ, je snížen o její cenu.
Pokud tento parametr klesne pod dosud nejvyšší nalezenou celkovou cenu,
v dalším sestupu se nepokračuje.
3. Řešení dynamickým programováním
Dynamické programování skládá řešení z výsledků menších podúloh.
Zde je touto úlohou funkce MaxCena(vec,limit),
vracející nejlepší řešení úlohy omezené na věci s indexem
0..vec (tedy prvních vec+1
věcí) a váhový limit limit.
Funkce MaxCena(vec,limit)
zkusí věc vec do batohu nepřidat
(voláním MaxCena(vec-1,limit)) i přidat
(voláním MaxCena(vec-1,limit-instance.Vaha(vec))
a Pridej(vec), pokud se do batohu ještě vejde).
Z obou konfigurací vybere a vrátí tu s vyšší cenou.
Tento postup by měl však složitost metody hrubé síly, hlavní úspory se dosáhne
zavedením dvourozměrného pole cache, do kterého se
ukládají již vypočítané výsledky funkce. Pole má rozměry n·M,
kde n je počet věcí a M je hmotnostní limit batohu. V každém
prvku navíc může být uložena konfigurace o velikosti n, takže paměťová
složitost je O(n2·M).
4. Řešení heuristikou podle poměru cena/váha s testem nejdražší věci
Je jednoduchým rozšířením heuristiky. Přidá O(n) test řešení skládající
se z jedné nejdražší věci. Tato úprava zaručí alespoň 50% ceny optimálního řešení.
5. Naměřené výsledky
Uvedeny jsou průměrné hodnoty z 50 instancí pro každé n.
U metody hrubé síly byl test ukončen u n=22.
Kroků řešení |
| 4 | 10 | 15 | 20 | 22 | 25 | 27 | 30 | 32 | 35 | 37 | 40 |
Hrubá síla | 13 | 766 | 32373 | 1006452 | 3757364 |
Heuristika cena/váha | 16 | 90 | 225 | 350 | 398 | 513 | 612 | 737 | 838 | 984 | 1100 | 1258 |
Větve a hranice | 7 | 74 | 90 | 1746 | 6378 | 16613 | 19316 | 92146 | 131539 | 338640 | 360812 | 4288130 |
Dynamické programování | 23 | 626 | 2658 | 5526 | 6495 | 9074 | 11627 | 15121 | 18264 | 22612 | 26389 | 31959 |
Cena/váha + nejdražší | 20 | 100 | 240 | 370 | 420 | 538 | 639 | 767 | 870 | 1019 | 1137 | 1298 |
Zhoršení proti nejlepší nalezené ceně |
| 4 | 10 | 15 | 20 | 22 | 25 | 27 | 30 | 32 | 35 | 37 | 40 |
Hrubá síla | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% |
Heuristika cena/váha | 7,19% | 2,93% | 0,80% | 1,27% | 1,43% | 1,26% | 0,91% | 0,96% | 0,69% | 0,95% | 0,61% | 0,62% |
Větve a hranice | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% |
Dynamické programování | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% |
Cena/váha + nejdražší | 4,26% | 2,93% | 0,80% | 1,27% | 1,43% | 1,26% | 0,91% | 0,96% | 0,69% | 0,95% | 0,61% | 0,62% |
Čas řešení [ms] |
| 4 | 10 | 15 | 20 | 22 | 25 | 27 | 30 | 32 | 35 | 37 | 40 |
Hrubá síla | 0 | 4 | 223 | 5971 | 21687 |
Heuristika cena/váha | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 |
Větve a hranice | 0 | 1 | 0 | 16 | 47 | 145 | 135 | 646 | 911 | 2349 | 2502 | 29713 |
Dynamické programování | 2 | 26 | 128 | 285 | 349 | 583 | 722 | 1017 | 1256 | 1663 | 2111 | 2616 |
Cena/váha + nejdražší | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 2 | 2 | 3 | 2 |
6. Závěr
Metoda větví a hranic, ač přidává ke hrubé síle jen jednoduchou podmínku,
dosahuje značného snížení počtu kroků, bez ztráty optimálnosti výsledku.
Závislost počtu kroků na n je však poměrně nepravidelná a není
zdaleka lineární. Značné rozdíly jsou i mezi jednotlivými instancemi stejné
velikosti ( u n=40 způsobila velký výkyv instance 9557, u které byl
nutno projít téměř 120 000 000 stavů ).
Tato metoda navíc předpokládá, že dokážeme u daného problému během
prohledávání stavového prostoru určovat, jaké maximální hodnoty
optimalizačního kritéria lze ještě dosáhnout.
Metoda dynamického programování se ukázala pro řešení 0/1 problému batohu
nejvýhodnější. S rostoucím n se počet kroků blíží lineární závislosti
(podle naměřených výsledků) a výsledky jsou vždy optimální.
Podmínkou využití je však to, že dokážeme rozumně ukládat výsledky vyřešených
podproblémů, což tento problém splňuje. Možných kombinací parametrů rekurzivní
funkce zde není příliš mnoho.
Přidání testu nejdražší věci má teoretický význam, protože zaručuje heuristice
podle poměru cena/váha maximální chybu 50%. Zde však ke zlepšení došlo jen u
10% případů pro n=4. Mezi větším počtem věcí už tedy jedna nejdražší věc
není významná. Průměrné zhoršení proti optimální ceně dosahovalo výrazně
nižších hodnot než zmíněná zaručená přesnost 50% a navíc s rostoucím n
klesalo.
7. Soubory
3batoh.zip - ZIP archiv zdrojových souborů v C++,
zadaných a naměřených hodnot, tohoto dokumentu a Excel. tabulky s analýzou dat.