Problem Batohu - Reseni Hrubou Silou a Greedy Algoritmem

PAA 2007-2008, Petr Maj (majp1)

Zadani ukolu

Naprogramujte řešení 0/1 problému batohu hrubou silou. Pozorujte závislost výpočetního času na n.

Naprogramujte řešení 0/1 problému batohu heuristikou podle poměru cena/váha. Pozorujte:

závislost výpočetního času na n
průměrné zhoršení proti exaktní metodě
maximální relativní chybu.
úplné zadání úlohy

Reseni Hrubou Silou

Reseni hrubou silou spociva v postupnem projiti vsech stavu reseni (stavy reseni jsou bitove vektory stejne delky jako pocet veci ktere muzeme do batohu dat) , kterych je 2^n a jedna se tedy o exponencialni slozitost. Diky tomu byla data pocitana pouze pro instance delky 4, 10 a 15, pro vetsi instance jiz byla celkova doba vypoctu neunosna.

Algoritmus provadi jednoduchou kontrolu pripustnosti reseni, kdy se netestuji potomci stavu, ktery jiz sam neni pripustny (vaha veci jiz obsazenych v batohu je vetsi nez maximalni povolena mez). Jak vyplyva z tabulky, toto "vylepseni" vsak nema na exponencialni slozitost algoritmu samozrejme zadny vliv.

Optimalni reseni je timto algoritmem nalezeno vzdy. V tabulce jsou zaznamenany minima, maxima a prumery pro celkovy cas straveny na procesoru (bezrozmerne diky vicenasobnemu pocitani instance v pripade nulovych casu), pocet navstvivenych stavu a presnost reseni, ktera je pocitana jako nalezene reseni/optimalni reseni. (samozrejme u brute force algoritmu vzdy rovna 1.0).

Instance Size Tested Instances Maximal Time Minimal Time Average Time Maximal Visited States Minimal Visited States Average Visited States Maximal Accuracy Minimal Accuracy Average Accuracy
4150.180.020.096231419.01.01.01.0
10152.00.271.1715355891141.01.01.01.0
151572.063.070.3333333333491514401848382.01.01.01.0
Tabulka hodnot namerenych pro algoritmus bruteforce

Reseni Greedy Algoritmem

Greedy algoritmus ktery byl pouzit srovna vsechny polozky podle pomeru cena/vaha od nejlepsi k nejhorsi a pote je pridava od nejlepsi do batohu. Pokud nemuze danou polozku vlozit, pokracuje na dalsi az do konce.

Slozitost tohoto reseni je zavisla na pouzitem algoritmu trideni (jelikoz byla pouzita standardni funkce sort pro seznamy v jazyce Python, da se ocekavat ze bude optimalni a tedy slozitost v prumernem pripade blizka n log n + n, kde +n je za projiti setrideneho pole a pridani polozek do batohu. V pripade pouziti quicksort muze byt samozrejme slozitost az n^2 v nejhorsich pripadech.

Instance Size Tested Instances Maximal Time Minimal Time Average Time Maximal Visited States Minimal Visited States Average Visited States Maximal Accuracy Minimal Accuracy Average Accuracy
4150.230.190.210666666667444.01.00.8877551020410.987825171189
10152.241.02.11466666667101010.01.00.9090909090910.988862892612
151512.9512.812.874151515.01.00.9843087362170.997162655518
201513.1712.9713.0713333333202020.01.00.9592070148680.993517558585
221513.4213.213.3093333333222222.01.00.9807534807530.995230765361
251513.7113.4513.5766666667252525.01.00.991918482080.997338311012
271514.01.013.012272727.01.00.9836503169840.996990476767
301514.3414.0314.1853333333303030.01.00.9825088822080.996239878563
321514.691.013.632323232.01.00.9665924276170.995675118694
351515.114.7314.92353535.01.00.9539078156310.994491508582
371515.521.014.3786666667373737.01.00.9882403249950.997992994075
401516.0115.5715.788404040.01.00.9916835243880.998626875885
Tabulka hodnot pro greedy algoritmus

Vysledne grafy

Popis implementace a Zaver

Celou ulohu (tedy G i BF algoritmus) jsem implementoval v jazyce python jako skript ktery precte instance, vypocita je a pote automaticky vygeneruje vsechny vysledky (grafy, data, tabulky, atd).

zdrojovy kod

Diky chybe v programu, kde se stav pricita na dvou mistech je potreba hodnoty navstvivenych stavu vydelit dvema a odecist jednicku pro dosazeni spravneho vysledku. Cas je v poradku.

Zaver

V pripade BF se zadne prekvapeni nekonalo, tedy krome toho ze uz pro hodnotu 20 bylo dost nerealne cekat na vysledek vypoctu. Co se greedy algoritmu tyce, byl jsem osobne velice prekvapen tim, jak mala je jeho chyba v porovnani k optimu. Cim vice polozek v batohu, tim byla chyba mensi a hranice chyby jedno procento byla prekracovana jen vyjimecne. To muze byt samozrejme dano idealnimi daty, ale predpokladal bych ze zadana data byla prumerem. V nejhorsim moznem pripade by byla jeho uspesnost rozhodne mensi.

Zajimavy je skok v grafu casove zavislosti vypoctu greedy algoritmu, tedy skok na pocatku grafu. Mym vysvetlenim je ze se muze jednat o nejake vnitrni zalezitosti implementace Pythonu, kde na takove urovni velikosti datove struktury naporiklad dochazi k jejimu kopirovani do vetsiho pole, nebo jina zaludnost. Od velikosti 15 jiz krivka odpovida ocekavani n log n.