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.