Dodatek do poniżej wyjaśniający warunki :k(k−1)
Tak więc, jeśli przeanalizujesz terminy w wyrażeniu, możesz wyobrazić sobie (analogicznie), że termin jest wyliczeniem wszystkich ciągów binarnych zawierających 1, które mają 1 w pierwszej pozycji. Innymi słowy, pozwalamy każdej pozycji w łańcuchu binarnym reprezentować wybór, czy dane z jednego z miast w problemie znajduje się w dokładnie podzbiorze, który rozważamy w tym czasie. Zatem dla 5 miast 10101 odpowiada podzestawowi {1,3,5}.(n−1k)kn
Zatem, aby obliczyć wszystkie podzbiory {1, ..., }, po prostu zliczamy każdy podzbiór binarny (tj. Liczymy przez ciągi binarne) o rozmiarze = 2 (tj. Ciągi binarne o rozmiarze które zawierają dwa 1), rozmiar = 3, następnie rozmiar = 4, ... następnie rozmiar = n. (Zauważ, że podzbiór size = 1 musi zawierać tylko pierwsze miasto, a zatem obliczenie jego częściowej odległości nie ma znaczenia, ponieważ odległość od 1 -> wszystkich innych miast w podzbiorze -> 1 wynosi dokładnie 0).nn
W każdym podzbiorze miastami musimy rozważyć do kandydatów optymalnych, częściowych ścieżek. W szczególności optymalna, całkowita ścieżka mogłaby przejść przez dany podzbiór i skończyć w jednym z miast , z wyłączeniem pierwszego miasta. Następnie dla każdej takiej kandydującej podścieżki obliczamy optymalną trasę do tego punktu jako minimum dowolnej z poprzednich podścieżek size = plus odległość od miasta końcowego dla tej podścieżki do miasto końcowe dla bieżącej ścieżki podrzędnej kandydata. To daje takie porównania, które musimy wykonać. Rozbieżność między moim terminem akk−1k−1k−1(k−1)(k−2)(k−1)(k−2)k(k−1)termin w powiązanej analizie jest różnicą notacyjną (sumowałbym w innym zakresie, biorąc pod uwagę moją definicję niż oni). Przynajmniej powinien on jednak ilustrować złożoność kwadratową tego terminu.k
Co ciekawe - właśnie skończyłem kodowanie tego dokładnego algorytmu w C ++ kilka minut temu. (Więc wybacz styczną od czystej teorii do małej praktycznej dyskusji. :))
Kosztuje czas i przestrzeń - przynajmniej pod moją implementacją. Praktycznie rzecz biorąc, gdy Twoje wymagania przestrzenne rosną tak szybko, stają się o wiele bardziej bolesne niż wymagania czasowe. Na przykład na moim komputerze (z 4 GB pamięci RAM) mogę rozwiązywać instancje z maksymalnie 24 miastami - nawet więcej, i brakuje mi pamięci.O(2nn2)O(2nn)
Oczywiście, mógłbym być po prostu złym programistą, a może będziesz w stanie radzić sobie lepiej ode mnie w praktyce. :)
Edycja: Trochę więcej szczegółów na temat jednego szczegółu pytania: Pojęcie wynika z faktu, że w najgorszym przypadku musisz obliczyć częściową, optymalną odległość od poprzednich podzbiorów (najwyżej z nich; zwróć uwagę, że jest sumowane przez w analizie, którą połączyłeś) z bieżącą. Wymaga to, ponownie w najgorszym przypadku, porównań z podzbiorami wielkości dla sumy .k(k−1)nknO(k)k−1O(k2)
Ponadto, jeśli moje wyjaśnienie nie było wystarczająco jasne, oto kilka miłych notatek z wykładów Vazirani ( PDF ). Przewiń w dół do P. 188, aby omówić TSP, w tym analizę Held-Karp.
Uwaga główna
Ważne jest, aby pamiętać, że obliczenia i sklep nie
„odległość optymalnej ścieżki dla
combination of k cities
”ale
„odległości optymalnej ścieżki dla
combination of k cities
I zaend-point city from this combination
”.Zrozumienie tego pomoże w znaczeniu pierwszych dwóch mnożników w następującej formule.
Pierwsza faza
Liczba operacji w pierwszej fazie wynosi:∑k>=2(n−1k−1)choose city combinationof size = k−1⋅(k−1)choose city to be the lastfrom k−1 citiesin chosen combination⋅((n−1)−(k−1))choose citythat is not in chosen combinationto add to path
Brakujący indeks górny w sumie oznaczak=n−1
(n−1n−2)⋅(n−2)⋅1 n−1
for all k>=2 that is valid for binomial coefficient
. Tak więc ostatni poprawny, nie zerowy termin sumy będzie dla Oznacza to, że nasza suma nie przechwytuje ostatnich wyborów miasta, aby połączyć się z pierwszym miastem. Istnieje miast, które połączą się z pierwszym miastem. W końcu dodamy ten termin do sumy.Pozwól przekształcić formułę w formułę, którą podajesz, która jest również na stronie Wikipedii Held-Karp .
Druga faza
Druga faza przywraca optymalną ścieżkę dzięki znakom, które zrobiliśmy w pierwszej fazie jednocześnie z odległościami obliczeniowymi.
Dla każdej optymalnej ścieżki „dla
combination of k cities
AND dlaend-point city from this combination
” uratowaliśmy miasto od ostatniego do ostatniego.Aby prześledzić optymalną ścieżkę, musimy poprosić o pewną strukturę danych, aby zwrócić miasto od „do ostatniego” „dla
∑k>=2n−1k=(n)(n−1)2−1
combination of k cities
AND dlaend-point city from this combination
”. Więc ta struktura danych musi być podobnaMap<combination of k cities, Map<last city, second-to-last city>>
. Jako indekscombination of k cities
możemy na przykład użyćbinary_string[city id]=1 if city id is in combination
. Musimy więc spojrzeć na wszystkie elementy,combination of k cities
aby zidentyfikować kombinację i zindeksować naszą strukturę danych. To daje nam liczbę operacji dla drugiej fazy:źródło