36PAA - Batoh 2

Zadání

Definice problému

Implementace

Úlohu jsem implementoval v Jazyce C# jako konzolovou aplikaci. Název souboru se vstupními daty je první argument a je povinný. Druhý argument je nepovinný a udává počet opakování výpočtu jedné instance (Důležité pouze při měření času).
Maximálně jsem recykloval úlohu "batoh 1" (virtuální třída batoh a třídu program, kde je implementováno měření času)

Naměřené hodnoty a výsledky

Měřil jsem na NTB s procesorem Centino 1.4GHz, nastavení max Performance při napájení z adaptéru. Použitý OS: Windows XP SP2 s .net Framework 2.

Tabulka: Srovnání výpočetních časů

Protože rozlišení čítače (Environment.TickCount) je 16 ms, je nutné instance spočítat vícekrát a výsledný čas získat vydělením počtem opakování. Počet opakování jsem nastavoval experimentálně, tak aby bylo rozlišení času dostatečné).

nhrubá síla [ms]heuristika [ms] kombinovaná heuristika [ms]Dynamické programování [ms]B&B [ms]
40,0080,0070,0070,0270,007
100,0440,0150,0140,0630,033
151,2300,0210,0200,1680,13
2036,870,0270,0260,2683,43
22136,740,0300,0300,29214,24
251140,040,0340,0350,393101,33
274803,900,0360,0360,490400,76
3038723,100,0410,0390,6263371,26

Tabulka: Průměrná chyba heuristik

n410152022252730
jednoduchá heuristika2,17%1,29%0,48%0,60%0,69%0,50%0,50%0,49%
kombinovaná heuristika1,33%1,10%0,31%0,43%0,54%0,42%0,29%0,38%

Tabulka: Maximální chyba heuristik

n410152022252730
jednoduchá heuristika36,36%11,48%8,54%8,43%7,23%3,68%10,60%5,51%
kombinovaná heuristika24,75%11,48%2,77%4,08%3,02%2,59%1,85%1,75%

Graf: Časová závislost

časová složitost

Graf: Závislost průměrné chyby na velikosti instance

Závislost průměrné chyby na velikosti instance

Graf: Závislost maximální chyby na velikosti instance

Závislost maximální chyby na velikosti instance

Závěr

Oproti "jednoduchým" metodám řešení, použitých v úloze batoh 1, je z grafů dobře patrné velké snížení časové náročnosti. Metoda větví a hranic (B&B) přináší zlepšení o jeden řád oproti DFS. Přitom se jedná o přidání jedné podmínky.
Ještě mnohem lepších výsledků dosahuje metoda dynamického programovaní. Sice v porovnání s heuristikou (greedyProof) je o řád pomalejší, ale oproti ní poskytuje vždy optimální řešení. Pouze si musíme uvědomit paměťovou složitost, která je dána 2D polem, v tomto případě M.n. Přidáním testu nejcennější věci do heuristiky se snížila průměrná a maximální chyba.