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.