Pobierz
Transkrypt
Pobierz
OSTASZEWSKI PAWLICKI Piotr Paweł (55566) (55567) Algorytmy i Struktury Danych – PIŁA 16.01.2003 ALGORYTMY ZACHŁANNE Porównanie Algorytmów Rozwiązyjących problem TSP 100 000 000 000,000 10 000 000 000,000 1 000 000 000,000 100 000 000,000 10 000 000,000 czas [ms] 1 000 000,000 100 000,000 10 000,000 1 000,000 100,000 10,000 1,000 0,100 0,010 0,001 5 10 15 20 25 30 35 40 45 50 ilość wierzchołków w grafie [n] Algorytm Zachłanny 5 Algorytm z Powracaniem Algorytm Zachłanny 10 15 20 0,006 1,177 196,147 398 779,0 0,0049 0,0082 0,0135 0,0183 25 2 718 017,164 0,0302 Algorytm z Powracaniem 30 35 40 45 18 525 592,631 126 267 628,798 860 621 001,432 5 865 862 178,274 0,0451 0,0674 0,1058 0,1581 50 39 980 826 678,955 0,2424 Porównanie jakości uzyskiwanych rozwiązań przez algorytm zachłanny 100% 90% 80% błąd względny [%] 70% 60% 50% 40% 30% 20% 10% 0% 5 10 15 20 25 30 35 40 45 50 ilość wierzchołków [n] algorytm zachłanny -> algorytm dokładny alg. zach. -> alg. dokł. alg. zach. -> opt. zach algorytm zachłanny -> optymalnie algorytm zachłanny 5 10 15 20 25 30 35 40 45 50 14,02% 0,00% 73,27% 8,31% 54,92% 35,97% 76,05% 22,88% 62,40% 45,76% 50,33% 48,22% 63,78% 53,22% 77,37% 58,58% 45,27% 51,34% 68,29% 58,22% WNIOSKI: Problem komiwojażera jest jednym z tych problemów optymalizacji kombinatorycznej, dla których nie jest znany efektywny algorytm rozwiązywania, czyli algorytm którego czas obliczeń jest ograniczony wielomianem zmiennej n, będącej liczbą wierzchołków sieci. Rozwiązując problem TSP można wybrać jedno z dwóch następujących podejść: można zastosować metodę dokładną, gwarantującą iż otrzymane rozwiązanie jest optymalnym, ale w niektórych przypadkach nie nadającą się do rzeczywistych danych; można zastosować metodę przybliżoną, która nie generuje rozwiązań optymalnych, ale jest znacznie szybsza. Rozwiązania leżą dość blisko rozwiązań optymalnych; Nasz zespół badał zachowanie algorytmów dokładnego i opartego o metodę zachłanną. Różnice, jakie zaobserwowaliśmy są dość znaczące. Na samym początku trzeba nadmienić, iż algorytm dokładny (z powracaniem) nie rozwiązał pomyślnie problemu dla zadanej instancji (tj. od 5 do 50 wierzchołków w grafie), ponieważ pomimo tego, że analiza wykonywana była na dość szybkim komputerze PC (PentiumIV 2,4 GHz, 512 MB RAM), to znalezienie optymalnej ścieżki komiwojażera między 50 miejscami zajęłoby w przybliżeniu 462 dni, (a my mieliśmy jedynie dni 29). Algorytm ten można by usprawnić dodając procedurę odcinania tych ścieżek, które na pewnym etapie stają się rozwiązaniami złymi. Cały problem w znalezieniu optymalnej ścieżki dla komiwojażera używając algorytmu z powracaniem leży w tym, iż należy przeszukać n! możliwości (gdzie n to liczba wierzchołków), jednakże z drugiej strony może i to jest siłą tego algorytmu, bo w 100% wynik będzie optymalnym. Może kiedy dysponujemy super sprzętem komputerowym o mocy obliczeniowej nieporównywalnie większe od używanego przez nas ten algorytm sprawdziłby się, ale jaka firma może pozwolić sobie na super komputer? Większość używa komputerów PC średniej klasy, więc im możemy zaproponować algorytm heurystyczny, oparty na metodzie zachłannej. Znajduje on rozwiązanie w o wiele krótszym czasie, jednakże jakość wyników nie jest już tak precyzyjna jak w przypadku poprzedniego algorytmu. Złożoność obliczeniowa algorytmu zachłannego, konkretnie algorytmu farthest insertion, porównując go z algorytmem z powracaniem jest o wiele mniejsza, tzn. korzystniejsza dla użytkownika, któremu zależy na tym, aby wyniki były wygenerowane w możliwie jak najkrótszym czasie. Niestety wadą algorytmu farthest insertion, zarówno jak i wszystkich algorytmów heurystycznych jest to, że wyniki wygenerowane nie są w pełni optymalnymi. Oczywiście znajdują się one w ściśle określonym przedziale, który ze względu na potrzeby może być akceptowalny lub nie, ale podczas przeprowadzania przez nas analiz, rozwiązanie otrzymane przez algorytm zachłanny w stosunku do algorytmu dokładnego, nie było rozwiązaniem ”wymarzonym”. Generowane wyniki ustępują optymalnym nawet o około 70%, a to nie jest mało. Możemy oczywiście zredukować błąd względny poprzez wielokrotne uruchamianie tego algorytmu, każdorazowo dla innego punktu startowego. Wówczas jednak nie osiągniemy wyników w tak krótkim czasie, ale za to jakość generowanych wyników będzie znacznie lepsza i ustępować będzie wynikom algorytmu z powracaniem w granicach normy około 0,01-2,5%. Jednogłośnie możemy powiedzieć, że w naszym odczuciu o wiele lepszym algorytmem, będzie algorytm oparty o metodę zachłanną farthest insertion. Dzięki niemu udaje się wygenerować wyniki w stosunkowo bardzo szybkim czasie, a dodatkowo stosując pewien zabieg kosmetyczny będą one bardzo bliskie optymalnym. Spróbujmy jeszcze dokonać analizy samych algorytmów. Ogólnie można powiedzieć, że algorytm wykorzystujący włączanie najdalszego wierzchołka buduje ścieżkę bazując na przekonaniu, że jeżeli zgrubny zarys trasy może być skonstruowany przez znacznie oddalone wierzchołki, to ostateczna, wynikowa trasa będąca rezultatem włączania najbliższych węzłów może być wypełniona bez dużego wzrostu kosztu przejścia. Jest to intuicyjne stwierdzenie potwierdzone przez niezależnie przeprowadzone testy komputerowe, i dowodzi ono wyższości wykorzystania włączania najdalszego wierzchołka nad sposobem przeszukiwania wszystkich możliwych ścieżek. Czas działanie algorytmu farthest insertion nie zależy od rozkładu wag w sieci a jedynie od jej rozmiaru. Złożoność całego algorytmu wynosi O(n2). Pętla główna programu jest wykonywana n – 1 razy. Po jednym razie dla każdego nowo włączanego wierzchołka do rozwiązania. W czasie każdej k-tej iteracji wykonywanych jest k porównań wartości macierzy wag. Przy każdym przebiegu pętli głównej uaktualnia się dwie tablice. Każde uaktualnienie wymaga co najwyżej n działań. Daje to nam złożoność O(n2). Należy pamiętać, że jest to złożoność dla algorytmu uruchamianego raz, dla losowo wybranego wierzchołka początkowego. Jeżeli uwzględnić, że algorytm ten jest uruchamiany dla wszystkich wierzchołków po kolei, to złożoność wzrośnie n-krotnie. Czas obliczeń dla tego przypadku wynosi więc O(n3). Jeśli chodzi o złożoność obliczeniową algorytmu z powracaniem to należy go zaliczyć do klasy algorytmów o złożoności O(2N). Implementacyjnie nie jest on algorytmem złożonym, wywołuje się rekurencyjnie aby stworzyć złudzenie permutacji, przy czym odznacza jednocześnie przy wywołaniu flagę wierzchołka, który został właśnie włączony. Jednakże sam fakt przynależności do tej klasy algorytmów, sprawia, że jest on mało efektywnym i w rzeczywistości rzadko stosowanym, chyba że, dla celów edukacyjnych, ale jak już wspomnieliśmy, możemy go usprawnić dodając procedurę odcinającą błędne kombinacje.