Held–Karp-algoritm
Held –Karp-algoritmen , även kallad Bellman–Held–Karp-algoritmen , är en dynamisk programmeringsalgoritm som 1962 föreslogs oberoende av Bellman och av Held och Karp för att lösa resandesäljarproblemet (TSP), där indata är en avståndsmatris mellan en uppsättning städer, och målet är att hitta en rundtur med minsta längd som besöker varje stad exakt en gång innan du återvänder till startpunkten. Den hittar den exakta lösningen på detta problem, och till flera relaterade problem, inklusive Hamiltons cykelproblem, i exponentiell tid .
Algoritmbeskrivning och motivation
Numrera städerna , med godtyckligt betecknad som en "startstad" (eftersom lösningen på TSP är en cykel, är valet startstad spelar ingen roll). Held–Karp-algoritmen börjar med att beräkna, för varje uppsättning städer och varje stad ingår inte i , den kortaste enkelriktade vägen från till som passerar genom varje stad i i någon ordning ( men inte genom några andra städer). Beteckna detta avstånd , och skriv för längden på den direkta kanten från till . Vi kommer att beräkna värden på med början med de minsta uppsättningarna och avslutar med den största.
När har två eller färre element kräver beräkningen av att man tittar på en eller två möjliga kortaste vägar. Till exempel helt enkelt och är bara längden på . Likaså är längden på antingen eller vilket som är kortast.
När innehåller tre eller fler städer, ökar antalet vägar genom snabbt, men endast ett fåtal sådana vägar behöver undersökas för att hitta den kortaste. Till exempel, om är kortare än , sedan måste vara kortare än och längden på är inte ett möjligt värde på . På liknande sätt, om den kortaste vägen från till till är och den kortaste vägen från till till slutar med kanten , då måste hela vägen från till vara och inte någon av de andra fem sökvägarna som skapats genom att besöka i en annan ordning.
Mer generellt, anta att är en uppsättning städer. För varje heltal , skriv för uppsättningen som skapats genom att ta bort från . Om den kortaste vägen från till till har som sin näst sista stad, tas den slutliga bort kanten från denna väg måste ge den kortaste vägen från till genom . Detta innebär att det bara finns möjliga kortaste vägar från till till , en för varje möjlig näst sista stad med längden och .
Detta steg i algoritmen avslutas när är känt för varje heltal , vilket ger det kortaste avståndet från stad till stad som passerar genom varannan stad. Det mycket kortare andra steget adderar dessa avstånd till kantlängderna för att ge möjliga kortaste cykler, och hittar sedan den kortaste.
Den kortaste vägen i sig (och inte bara dess längd) kan slutligen rekonstrueras genom att lagra bredvid etiketten för den näst sista staden på vägen från till till , vilket höjer utrymmeskraven med endast en konstant faktor.
Algoritmisk komplexitet
Held–Karp-algoritmen har exponentiell tidskomplexitet , betydligt bättre än den superexponentiella prestandan av en brute-force-algoritm. Held–Karp kräver dock utrymme för att hålla alla beräknade värden för funktionen , medan brute force bara behöver utrymme för att lagra själva grafen.
Tid
Beräknar ett värde av för en -elementdelmängd av kräver att man hittar den kortaste av möjliga vägar, var och en hittas genom att lägga till ett känt värde på och en kantlängd från den ursprungliga grafen; det vill säga det kräver tid proportionell mot . Det finns -elementdelmängder av ; och varje delmängd ger möjliga värden för . Beräknar alla värden på där kräver alltså tid över alla delmängder storlekar . Det andra steget av algoritmen, att hitta en komplett cykel från kandidater, tar tid och påverkar inte asymptotisk prestanda.
För oriktade grafer kan algoritmen stoppas tidigt efter steget och hitta det lägsta för varje , där är komplementmängden av . Detta är analogt med en dubbelriktad sökning som börjar vid och möter mittpunkten . Detta är dock en konstant faktorförbättring och påverkar inte den asymptotiska prestandan.
Plats
Lagring av alla värden för delmängder av storleken kräver att man behåller . En komplett värdetabell för kräver alltså mellanslag . Detta förutsätter att är tillräckligt liten så att kan lagras som en bitmask av konstant multipel av maskinord snarare än en explicit k-tupel.
Om bara längden på den kortaste cykeln behövs, inte själva cykeln, så kan rymdkomplexiteten förbättras något genom att notera att man beräknar för en av storlek kräver endast värden på för delmängder av storlek . Behåller endast värden för där har storlek antingen eller minskar algoritmens maximala utrymmeskrav, som uppnås när , till .
Exempel
Avståndsmatris:
Funktionsbeskrivning:
- g(x, S) - från 1 slutar min kostnad för banor vid toppunkt x, passerar hörn i mängd S exakt en gång
- c xy - kantkostnaden slutar på x från y
- p(x, S) - det näst sista hörnet till x från mängden S. Används för att konstruera TSP-vägen tillbaka i slutet.
k = 0, nolluppsättning:
Ställ in ∅:
g(2, ∅) = c 21 = 1 g(3, ∅) = c 31 = 15 g(4, ∅) = c 41 = 6
k = 1, betrakta mängder av 1 element:
Ställ in {2}:
g(3,{2}) = c 32 + g(2, ∅ ) = c 32 + c 21 = 7 + 1 = 8 p(3,{2}) = 2 g(4,{2}) = c 42 + g(2, ∅ ) = c 42 + c 21 = 3 + 1 = 4 p(4,{2}) = 2
Ställ in {3}:
g(2,{3}) = c 23 + g(3, ∅ ) = c 23 + c 31 = 6 + 15 = 21 p(2,{3}) = 3 g(4,{3}) = c 43 + g(3, ∅ ) = c 43 + c 31 = 12 + 15 = 27 p(4,{3}) = 3
Ställ in {4}:
g(2,{4}) = c 24 + g(4, ∅ ) = c 24 + c 41 = 4 + 6 = 10 p(2,{4}) = 4 g(3,{4}) = c 34 + g(4, ∅ ) = c 34 + c 41 = 8 + 6 = 14 p(3,{4}) = 4
k = 2, betrakta uppsättningar av 2 element:
Ställ in {2,3}:
g(4,{2,3}) = min {c 42 + g(2,{3}), c 43 + g(3,{2})} = min {3+21, 12+8}= min {24, 20}= 20 p(4,{2,3}) = 3
Ställ in {2,4}:
g(3,{2,4}) = min {c 32 + g(2,{4}), c 34 + g(4,{2})} = min {7+10, 8+4}= min {17, 12} = 12 p(3,{2,4}) = 4
Ställ in {3,4}:
g(2,{3,4}) = min {c 23 + g(3,{4}), c 24 + g(4,{3})} = min {6+14, 4+27}= min {20, 31}= 20 p(2,{3,4}) = 3
Längd på en optimal tur:
f = g(1,{2,3,4}) = min { c 12 + g(2,{3,4}), c 13 + g(3,{2,4}), c 14 + g( 4,{2,3}) } = min {2 + 20, 9 + 12, 10 + 20} = min {22, 21, 30} = 21
Föregångare till nod 1: p(1,{2,3,4}) = 3
Föregångare till nod 3: p(3, {2,4}) = 4
Föregångare till nod 4: p(4, {2}) = 2
Föregångare till nod 2: p(2, {}) = 1
Därför ges en optimal TSP-tur av 1 → 2→ 4 → 3→ 1.
Pseudokod
funktionsalgoritm TSP (G, n) är för k := 2 till n do g({k}, k) := d(1, k) slut för för s := 2 till n−1 gör för alla S ⊆ { 2, ..., n}, |S| = s gör för alla k ∈ S gör g(S, k) := min m≠k,m∈S [g(S\{k}, m) + d(m, k)] slut för ände för slut för opt := min k≠1 [g({2, 3, ..., n}, k) + d(k, 1)] returnera (opt) slutfunktion
Relaterade algoritmer
Exakta algoritmer för att lösa TSP
Förutom dynamisk programmering, linjär programmering och Branch and bound är designmönster som också används för exakta lösningar till TSP. Linjär programmering tillämpar skärplansmetoden i heltalsprogrammering , dvs löser LP som bildas av två begränsningar i modellen och söker sedan skärplanet genom att lägga till olikhetsbegränsningar för att gradvis konvergera till en optimal lösning. När människor tillämpar denna metod för att hitta ett skärplan är de ofta beroende av erfarenhet, så denna metod används sällan som en generell metod.
Termen gren och bunden användes första gången 1963 i en artikel publicerad av Little et al. på TSP, som beskriver en teknik för att kombinera mindre sökutrymmen och fastställa lägre gränser för att utöka det praktiska tillämpningsområdet för en exakt lösning. Tekniken är användbar för att utöka antalet städer som kan övervägas beräkningsmässigt, men bryts fortfarande ned i storskaliga datamängder.
Den styr sökningsprocessen genom att tillämpa restriktiva gränser, vilket möjliggör en sökning efter den optimala lösningsgrenen från rymdtillståndsträdet för att hitta en optimal lösning så snabbt som möjligt. Den centrala komponenten i denna algoritm är valet av den restriktiva gränsen. Olika restriktiva gränser kan bilda olika grenbundna algoritmer.
Ungefärliga algoritmer för att lösa TSP
Eftersom tillämpningen av exakt algoritm för att lösa problem är mycket begränsad, använder vi ofta ungefärlig algoritm eller heuristisk algoritm. Resultatet av algoritmen kan bedömas med C/C* ≤ ε . C är det totala färdavståndet som genereras från en ungefärlig algoritm; C* är det optimala färdavståndet; ε är den övre gränsen för förhållandet mellan den totala färdsträckan för ungefärlig lösning och optimal lösning under det värsta läget. Värdet på ε >1,0. Ju mer den närmar sig 1.0, desto bättre är algoritmen. Dessa algoritmer inkluderar: Interpolationsalgoritm, Nearest Neighbor-algoritmen , Clark & Wright-algoritmen, Dubbelspännande trädalgoritm, Christofides-algoritmen , Hybridalgoritmen, Probabilistisk algoritm (som Simulated annealing ).