Algorytmy i Struktury Danych Sprawozdanie nr 5 – Programowanie
Transkrypt
Algorytmy i Struktury Danych Sprawozdanie nr 5 – Programowanie
Algorytmy i Struktury Danych Sprawozdanie nr 5 – Programowanie dynamiczne i algorytmy zachłanne. Rok akademicki Grupa Autorzy: Dominik Głodek Piotr Majewski 2013/2014 I5.1 117309 117315 Cel badania Badanie ma na celu sprawdzenie wydajności trzech algorytmów rozwiązywania problemu plecakowego – brute force, algorytmu zachłannego oraz dynamicznego. Metoda przeprowadzenia badania i środowisko testowe Algorytmy zostały zaimplementowane w języku C++. Środowisko testowe to Windows 7, Code::Blocks, kompilator gcc. Program był odpalany na komputerze z procesorem i5-430M, 4GB RAM. Czas wykonywania był mierzony za pomocą funkcji dostępnej w bibliotece windows.h – QueryPerformanceCounter, poprzez zmierzenie ilości taktów zegara procesora potrzebnych do wykonania algorytmów. Wszystkie pomiary były wykonywane 3-krotnie. Wynikiem jest średnia tychże 3 pomiarów. Wykresy Z racji, że liczba przedmiotów jest zawsze liczbą całkowitą wyniki powinny byd przedstawione na wykresach w postaci punktów. Jednak dla większej przejrzystości zostały narysowane linie trendu. Wykresy porównujące algorytmy nie są zbyt czytelne, ponieważ szybko rosnący brute force zawyża skalę na tyle, że pozostałe dwa wykresy są niewidoczne. Dlatego postanowiliśmy zrobid dodatkowe 3 wykresy przedstawiające tylko 2 algorytmy – zachłanny i dynamiczny. Algorytm zachłanny Rozmiar plecaka: 50 100 150 0,035 0,030 Czas wykonywania [ms] 0,025 0,020 0,015 0,010 0,005 0,000 15 16 17 18 19 20 21 22 23 24 25 22 23 24 25 Liczba przedmiotów Algorytm brute force Rozmiar plecaka: 50 100 150 12 000 Czas wykonywania [ms] 10 000 8 000 6 000 4 000 2 000 0 15 16 17 18 19 20 21 Liczba przedmiotów Algorytm dynamiczny Rozmiar plecaka: 50 100 150 0,250 Czas wykonywania [ms] 0,200 0,150 0,100 0,050 0,000 15 16 17 18 19 20 21 22 23 24 23 24 Liczba przedmiotów Rozmiar plecaka - 50 Algorytm: Zachłanny Brute Force Dynamiczny 12 000 Czas wykonywania [ms] 10 000 8 000 6 000 4 000 2 000 0 15 16 17 18 19 20 21 Liczba przedmiotów 22 25 Rozmiar plecaka - 100 Algorytm: Zachłanny Brute Force Dynamiczny 10 000 9 000 8 000 Czas wykonywania [ms] 7 000 6 000 5 000 4 000 3 000 2 000 1 000 0 15 16 17 18 19 20 21 22 23 24 23 24 Liczba przedmiotów Rozmiar plecaka - 150 Algorytm: Zachłanny Brute Force Dynamiczny 10 000 9 000 Czas wykonywania [ms] 8 000 7 000 6 000 5 000 4 000 3 000 2 000 1 000 0 15 16 17 18 19 20 21 Liczba przedmiotów 22 Rozmiar plecaka - 50 Algorytm: Zachłanny Dynamiczny 0,120 Czas wykonywania [ms] 0,100 0,080 0,060 0,040 0,020 0,000 15 16 17 18 19 20 21 22 23 24 Liczba przedmiotów Rozmiar plecaka - 100 Algorytm: Zachłanny Dynamiczny 0,160 0,140 Czas wykonywania [ms] 0,120 0,100 0,080 0,060 0,040 0,020 0,000 15 16 17 18 19 20 21 Liczba przedmiotów 22 23 24 Rozmiar plecaka - 150 Algorytm: Zachłanny Dynamiczny 0,250 Czas wykonywania [ms] 0,200 0,150 0,100 0,050 0,000 15 16 17 18 19 20 21 Liczba przedmiotów 22 23 24 Tabela wyników Tabela poniżej przedstawia wyniki poszczególnych algorytmów oraz procentową różnicę pomiędzy wynikiem algorytmu zachłannego, a rozwiązaniem optymalnym. n W Zachłanny 15 50 112 127 127 16 17 18 19 20 21 50 50 50 50 50 50 78 74 77 47 108 71 78 95 84 69 108 88 78 95 84 69 108 88 22 23 24 25 15 16 17 50 50 50 50 100 100 100 90 85 95 82 111 98 173 93 98 95 88 129 115 173 93 98 95 88 129 115 173 18 19 20 21 22 23 100 100 100 100 100 100 131 171 116 191 157 120 131 177 145 203 192 126 131 177 145 203 192 126 24 25 15 16 17 18 100 100 150 150 150 150 112 141 157 151 156 215 152 172 163 151 158 215 152 172 163 151 158 215 19 20 21 22 23 24 25 150 150 150 150 150 150 150 185 213 207 206 164 155 195 200 232 207 206 177 174 208 200 232 207 206 177 174 208 Strata minimalna: Strata maksymalna: Strata średnia: Brute force Dynamiczny Strata 13% 0% 28% 9% 47% 0% 24% 3% 15% 0% 7% 16% 17% 0% 0% 4% 25% 6% 22% 5% 36% 22% 4% 0% 1% 0% 8% 9% 0% 0% 8% 12% 7% 0% 47% 11% Analiza wyników i wnioski Współczynnik zmienności Współczynnik zmienności wynosił 0-11% dla algorytmu zachłannego, 0-9% dla brute force oraz 0-8% dla algorytmu. Dodatkowe pomiary zostały uznane za zbędne. Algorytm zachłanny Algorytm zachłanny nie znajduje najbardziej optymalnego rozwiązania problemu, ale w zamian za to jest najszybszy. Jego złożonośd obliczeniowa to 𝑂(𝑛 ∗ 𝑙𝑜𝑔 𝑛). Jest ona spowodowana złożonością użytego sortowania (quicksort). Brute force Rozwiązanie problemu plecakowego za pomocą metody brute force jest skuteczne, aczkolwiek bardzo czasochłonne. Polega ona na sprawdzeniu wszystkich możliwych kombinacji włożenia przedmiotów do plecaka i znalezienie najlepszego rozwiązania. Jego złożonośd obliczeniowa wynosi aż 𝑂(2𝑛 ). Algorytm dynamiczny Ten algorytm spisuje się najlepiej z pozostałych. Zawsze pokazuje optymalne rozwiązanie, a w dodatku robi to w rozsądnym czasie. Rozwiązuje on te zadanie, obliczając po kolei rozwiązanie dla coraz większego n oraz W. Jego złożonośd obliczeniowa wynosi 𝑂(𝑛 ∗ 𝑊). Podsumowanie Najlepszym z testowanych algorytmów okazał się byd zgodnie z założeniami algorytm dynamiczny. Jeśli komuś zależy bardzo na szybszym czasie wykonywania to polecamy algorytm zachłanny, który nie spisał się wcale najgorzej. Natomiast wykładnicza złożonośd czasowa algorytmu brute force skreśla go z użytku dla testów z większą liczbą przedmiotów.