====== Experimentální hodnocení kvality algoritmů ======
* CTU Prague, MI-PAA, ZS 2011
* Autor: **Tomáš Borovička (borovto1)**
**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
* Pozorujte zejména závislosti výpočetního času (B&B, DP, heuristika) a rel. chyby (heuristika) na:
* maximální váze věcí
* maximální ceně věcí
* poměru kapacity batohu k sumární váze
* granularitě (pozor - zde si uvědomte smysl exponentu granularity)
* Doporučuje se zafixovat všechny parametry na konstantní hodnotu a vždy plynule měnit jeden parametr
===== Popis problému =====
Úkolem je zhodnotit kvalitu řešení a výpočetní náročnost implementovaných algoritmů pro problém batohu v závislosti na parametrech řešených instancí.
===== Řešení =====
V práci hodnotím výpočetní náročnost a kvalitu v závislosti na parametrech řešených instancí u následujícíh algoritmů pro řešení problému batohu:
* B&B branch and bound
* Heuristika (cena/váha)
* Dynamické programování
* FTPAS
==== Chování vzhledem k maximální váze věcí ====
=== Kód pro generování instancí ===
#!/bin/bash
for i in 40 60 80 100 150 200 300 400 500
do
./knapgen -n 25 -N 40 -m 0.5 -W $i -C 200 -k 1 -d 0 >> instances/W/knap_W$i.inst.dat
done
=== Závislost výpočetního času ===
Závislost výpočetního času můžeme pozorovat u všech algoritmů krom heuristiky, kde je vliv jen minimální. U ostatních je vidět rostoucí tendence výpočetního času s maximální vahou.
{{:school:fit:mipaa:zavislostcasuvypotunavaze.png|}}
=== Relativní chyba ===
S rostoucí vahou výrazně roste průměrná chyba u řešení pomocí heuristiky (cena/váha). Naopak při řešení FPTAS průměrná chyba klasá - což je logické, víme-li, že u FPTAS dekomponujeme podle váhy věcí, neboli "zaokrouhluje" posledních x (2) bitů. Chyba u FTPAS klesala od 5% pri maximální váze 40 až pod 0,5% při maximální váze 500. Naopak relativní chyba u řešení pomocí heuristiky rostla s maximální vahou od 1,3% při maximální váze 40 až k 20% při maximální váze 500.
{{:school:fit:mipaa:relativnichybavaha.png|}}
==== Chování vzhledem k maximální ceně věcí ====
=== Kód pro generování instancí ===
#!/bin/bash
for i in 40 60 80 100 150 200 300 400 500
do
./knapgen -n 25 -N 40 -m 0.5 -W 100 -C $i -k 1 -d 0 >> instances/C/knap_C$i.inst.dat
done
=== Závislost výpočetního času ===
Z grafu lze vypozorovat snižující se tendence při rostoucí maximální ceně. Tento trend lze pozorovat u šech algoritmů. Nejméně výrazný je opět u heuristiky, kde je na hranici signifikance.
{{:school:fit:mipaa:zavislostcasuvypoctunacene.png|}}
=== Relativní chyba ===
S grafu je vidět výrazné relativní chyba heuristiky, která se snižuje s rostoucí maximální cenou. To je opět očekávaný trend, vzhledem k logice heuristiky cena/váha. Naopak algoritmus založený na FTPAS není ovlivněn vůbec, jelikož je problém dekomponován podle váhy věcí.
{{:school:fit:mipaa:relativnichybacena.png|}}
==== Chování vzhledem k poměru kapacity batohu k sumární váze ====
=== Kód pro generování instancí ===
#!/bin/bash
for i in 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
do
./knapgen -n 25 -N 40 -m $i -W 100 -C 200 -k 1 -d 0 >> instances/m/knap_m$i.inst.dat
done
=== Závislost výpočetního času ===
U všech algoritmů, opět kromě heuristiky, je vidět výrazná závislost výpočetního času na poměru kapacity batuhu k sumární váze. U Dynamického programování a FTPAS je rostoucí trend výpočetního času s rostoucím poměrem. U řešení branch and bound můžeme pozorovat největší výpočetní složitost při poměru 0.5, při ostatních poměrech, když se sumární váha blíží kapacitě batohu, nebo je výrazně větší, dokáže B&B velice efektivně ořezat stavový prostor.
{{:school:fit:mipaa:zavislostcasuvypoctunapomerukapacityavaze.png|}}
=== Relativní chyba ===
Relativní chyba heuristiky je nejvyšší při poměru 0.5. Chyba FTPAS klesá s rostoucím poměrem, neboli klesající sumární váhou.
{{:school:fit:mipaa:relativnichybapomerkapacitavaha.png|}}
==== Chování vzhledem k granularitě ====
=== Kód pro generování instancí ===
#!/bin/bash
for i in 0.1 0.2 0.5 0.8 1 2 5 8
do
./knapgen -n 25 -N 40 -m 0.5 -W 100 -C 200 -k $i -d 0 >> instances/k/knap_k$i.inst.dat
done
=== Závislost výpočetního času ===
Závislost výpočetního času na granularitě je na hranici signifikance, spíše můžeme řici, že při nastavených parametrech neměla granularita vliv na výpočetní čas a to u všech testovaných algoritmů.
{{:school:fit:mipaa:zavislostcasuvypoctunagranularite.png|}}
=== Relativní chyba ===
Stejně jako výpočetní čas, ani relativní chyba při nastavených parametrech nekoreluje s granularitou testovaných instancí.
{{:school:fit:mipaa:relativnichybagranularita.png|}}
===== Závěr =====
Experimentálně jsem zkoumal chování čtyř implementovaných algoritmů v závislosti na parametrech řešených instancí a zhodnotil jejich kvalitu a závislost výpočetního času na těchto parametech.
===== Source code =====
===== References =====
* [[:school:fit:mipaa:ukol1|Úkol 1 - problém batohu]]
* [[:school:fit:mipaa:ukol3|Úkol 3 - problému batohu 2: dynamické programování, metoda větví a hranic a aproximativní algoritmus ]]