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