Pobierz
Transkrypt
Pobierz
OSTASZEWSKI PAWLICKI Piotr Paweł (55566) (55567) Algorytmy i Struktury Danych – PIŁA 18.12.2002 PROGRAMOWANIE DYNAMICZNE 1 ROZWIĄZANIE PROBLEMU PLECAKOWEGO (zmienna liczba elementów) 100000 10000 1000 100 czas [ms] 10 1 0,1 0,01 0,001 5 10 15 20 25 30 35 40 45 50 liczba elementów [n] Algorytm Dynamiczny - MACIERZ 5 10 Algorytm Wyczerpujący - DRZEWO DECYZYJNE 15 20 25 30 35 40 45 50 Algorytm Dynamiczny - MACIERZ 0,00918273 0,01187581 0,02021485 0,02149993 0,03192025 0,02957638 0,03994083 0,04233498 0,0487967 0,04827708 Algorytm Wyczerpujący - DRZEWO DECYZYJNE 0,00921904 0,18214605 0,31372702 0,25170796 2,72660352 7,6272263 10,61336007 245,6524502 22,7892092 37251,5884 2 ROZWIĄZANIE PROBLEMU PLECAKOWEGO (zmienna ładowność plecaka) 100 10 czas [ms] 1 0,1 0,01 100 300 500 700 900 2500 6000 10000 30000 50000 70000 90000 pojemność MS KONTENER [b] Algorytm Dynamiczny - MACIERZ Algorytm Wyczerpujący - DRZEWO DECYZYJNE 3 100 200 300 400 500 600 700 800 900 1000 2500 4000 6000 8000 10000 20000 30000 40000 50000 60000 70000 80000 90000 100000 Algorytm Dynamiczny MACIERZ 0,049716 0,087148 0,1267 0,16477 0,192295 0,218405 0,258198 0,289475 0,317887 0,349952 0,877279 1,449522 2,082321 2,798185 3,491857 6,766301 10,56595 13,80992 17,5316 22,13232 22,11414 22,24517 32,29419 34,91891 Algorytm Wyczerpujący DRZEWO DECYZYJNE 8,423696 6,824052 1,970083 3,303772 8,002414 1,234514 2,032381 3,439823 2,756496 2,711518 6,084293 5,276369 2,378235 2,26174 2,729397 0,82273 3,195378 2,035454 2,151949 8,942198 8,986896 9,015671 3,139505 1,769778 WNIOSKI: Celem ćwiczenia było rozwiązanie dyskretnego problemu plecakowego. Algorytmy, którymi się posłużyliśmy to algorytm dynamiczny (MACIERZ) oraz algorytm dokładny - przeszukiwania wyczerpującego (DRZEWO DECYZYJNE). Po przeanalizowaniu algorytmów oraz uporaniu się implementacją, doszliśmy do całkiem ciekawych wniosków. Struktury danych, których użyliśmy i które zostały porównywane to tablica dwuwymiarowa oraz drzewo decyzyjne. W przypadku kiedy badaliśmy wpływ zmiennej ilości elementów (przy stałej pojemności kontenera) na czas wykonywania obliczeń, macierz okazała się o wiele szybsza od drzewa decyzyjnego. W przypadku macierzy możemy zauważyć, że czas obliczeń jest proporcjonalny do ilości elementów, jeżeli chodzi o drzewo decyzyjne, to wyniki były dość zaskakujące. Dla małej ilości elementów prędkość wykonywania obydwu algorytmów jest porównywalna, ale kiedy w grę wchodzi większa ich ilość, to wyniki różnią się dość znacznie. Należy również nadmienić, iż algorytm wyczerpujący 4 zachowuję się dość niestabilnie. Może to być wynikiem losowego generowania rozmiaru, wartości elementów oraz elementu obcinania gałęzi (który różnie zachowuje się w przypadku losowej tablicy wejściowej. Najważniejszym elementem, który przemawia na korzyść macierzy jest objętość pamięciowa, którą zajmują dane wykorzystywane, dla algorytmu dynamicznego możliwe było rozwiązanie problemu plecakowego dla nawet 70000 elementów (zależy od pojemności statków), ale niestety dla drzewa decyzyjnego 50 elementów wywołuje spustoszenie w systemie, plik stronicowania pamięci (swap), dla tej ilości elementów zajmował ok. 1,1 GB, a przy większej ilości elementów tj. 75 program powodował błąd braku pamięci i bardzo niestabilną pracę systemu operacyjnego. Podczas badania zachowania się elementów, przy stałej liczbie elementów, a zmiennej pojemności, wyniki nie były już tak rozbieżne jak w przypadku poprzednim, drzewo decyzyjne osiągało czasy wykonywania obliczeń porównywalne z macierzą. Bardzo dobrze widać to przy większej pojemności „plecaka” a w przypadku naszego ćwiczenia MS KONTENER. Związane jest to z faktem iż w przypadku macierzy następuje n*b przebiegów w czasie stałym. złożoność momencie gdy parametr złożoność jest bardzo duży czas algorytmu bardzo się powiększa, złożoność rozmiar instancji zwiększa się minimalnie, złożoność czasowa zdecydowanie nie zależy wielomianowo od rozmiaru instancji. Drzewo decyzyjne radzi sobie szybciej, ponieważ mechanizm obcinania gałęzi w tym przypadku jest bardzo efektywny; choć również należy nadmienić, że zachowanie tego algorytmu jest również niestabilne. Zestawiając ze sobą obydwa algorytmy, doszliśmy do wniosku, że nie można jednoznacznie określić, który z nich jest efektywniejszy. W zależności od zadanego problemu, każdy z nich się różnie zachowuje, po stronie macierzy przemawia fakt stabilności. Algorytm dynamiczny możemy zaliczyć to klasy algorytmów o złożoności O(nb), natomiast algorytm wyczerpujący do klasy algorytmów o złożoności obliczeniowej O(2N). 5