dylemat domokrążcy
Transkrypt
dylemat domokrążcy
Metryczny problem komiwojażera Problem można prosto zobrazować poprzez dylemat domokrążcy, który chce odwiedzić określoną liczbę domów (miast), przy czym każde miasto należy odwiedzić tylko raz, po czym wrócić do punktu wyjścia. Bardziej formalnie, dany jest pełny nieskierowany graf G=(V,E). Wierzchołki symbolizują miasta, a krawędzie – drogi między miastami. Waga krawędzi (a,b) oznacza odległość pomiędzy miastami a i b. Pełność oznacza, że graf posiada "wszystkie" krawędzie tzn. dla |V| wierzchołków każdy z nich posiada dokładnie |V| – 1 krawędzi prowadzących do |V| – 1 sąsiadów. Graf jest nieskierowany, więc krawędź (a,b) to ta sama krawędź co (b,a). Rozpatrujemy problem metryczny, więc krawędzie muszą spełniać nierówność trójkąta tzn. krawędź (a,b), nie może mieć większej wagi niż suma wag krawędzi (a,c) oraz (c,b) dla dowolnego c. Warunek ten najłatwiej spełnić poprzez nadanie wierzchołkom współrzędnych x oraz y. Wtedy waga krawędzi (a,b) może zostać obliczona jako odległość euklidesowa pomiędzy miastami a i b na podstawie ich współrzędnych. Rozwiązanie metrycznego problemu komiwojażera polega na znalezieniu minimalnego cyklu Hamiltona – ścieżki, która odwiedza każdy wierzchołek (oprócz początkowego) dokładnie raz, wraca do wierzchołka początkowego i ma najmniejszą długość, rozumianą jako suma wag krawędzi wchodzących w skład ścieżki. Opiszemy teraz kilka przybliżonych algorytmów rozwiązania tego problemu. Algorytm najbliższych sąsiadów 1. Zaczynamy od dowolnego wierzchołka. 2. Dopóki są jeszcze nieodwiedzone wierzchołki: 1. Jako kolejny wierzchołek do odwiedzenia wybieramy najbliższego jeszcze nieodwiedzonego sąsiada aktualnego wierzchołka. 3. "Zamykamy" cykl początkowego. poprzez przejście od ostatniego wierzchołka do Algorytm ten działa w czasie wielomianowym (zależnie od reprezentacji), ale dla dowolnego R > 0 można znaleźć taką instancję problemu, dla której błąd ε będzie większy niż R. Algorytm 2-aproksymacyjny Trasa dostarczana przez ten algorytm jest co najwyżej 2x większa niż trasa dostarczana przez algorytm optymalny. Znajomość wag krawędzi potrzebna jest jedynie na początku i końcu algorytmu. Algorytm dla danego grafu G jest następujący: 1. Znajdź minimalne drzewo rozpinające dla G. Oznaczmy je przez T. Etat ten wymaga znajomości wag krawędzi, ale w samym drzewie T wagi nie są już potrzebne. 2. Zmodyfikuj T poprzez zdublowanie każdej krawędzi. Oznacza to, że jeśli w T pomiędzy wierzchołkami a i b nie było krawędzi, to nie ma jej dalej, jeśli zaś krawędź była, to tworzymy drugą identyczną. Tak otrzymany twór jest tzw. multigrafem (pseudografem). Oznaczmy go przez M. Do przechowywania takiego multigrafu najlepiej posłużyć się macierzą sąsiedztwa, w której element [a][b] jest liczbą krawędzi od a do b (w naszym przypadku będzie to 0 lub 2). 3. Skonstruuj cykl Eulera dla M. Algorytm konstrukcji dla grafów nieskierowanych można znaleźć tutaj (pierwszy algorytm od góry). Algorytm ten jest przystosowany dla multigrafów i wykorzystuje macierz sąsiedztwa tak jak opisano to w punkcie poprzednim. 4. Końcową trasę budujemy według kolejności wierzchołków w skonsturowanym cyklu Eulera. Innymi słowy, jeśli cykl Eulera jest następujący: 0→1→5→3→5→4→5→1→2→1→0 to przybliżonym rozwiązaniem problemu komiwojażera jest: 0→1→5→3→4→2 bierzemy więc pod uwagę pierwsze wystąpienie danego wierzchołka w cyklu.