Komivojazerio uzdavinio tyrimas
Arunas Kasinskas ir Lina Stoniene, VDU, 2000.12.08
e-mail: [email protected]

Įvadas

Keliaujančio prekeivio uždavinys (TSP Traveling Salesperson Problem) viena iš plačiausiai nagrinėjamų užduočių, sprendžiant optimizavimo uždavinius. Keliaujančio prekeivio tikslas yra aplankyti tam tikrą skaičių įvairių miestų ar vietovių taip, kad nukeliautas atstumas būtų kaip galima trumpesnis. Keliaujančio prekeivio uždavinys priklauso sunkių optimizavimo užduočių klasei.
Šis uždavinys plačiai taikomas realiame gyvenime. Matematikos ir informatikos mokslo šakų atstovai dažnai nagrinėja su keliaujančio prekeivio uždaviniu susijusias optimizavimo problemas. Matematikai pradėjo domėtis šia sritimi jau nuo 1759 metų. Euleris ir Vandermonde nagrinėjo rikio turą (knigt's tour) šachmatų lentoje, kuris atitiko Hamiltono ciklą grafe su 64 viršūnėmis. 1856 metais Hamiltonas sukūrė grafų teorijoje Icosian Calculus žaidimą. Reikėjo užbaigti ciklą (Hamiltono) naudojant tam tikrą skaičių sunumeruotų vinių ir žaidimų lentą. 1930 metais Mengeris paminėjo pasiuntinuko problemą, kuri susijusi su trumpiausio kelio paieška Hamiltono cikle. Keliaujančio prekeivio terminas pirmą kartą buvo paminėtas 1931/32 metais Hasslerio Whitney iš Princetono universiteto. Jis sutapatino rikio turo, pasiuntinuko ir keliaujančio prekeivio problemas, kurios iki šiol domina daugelį mokslo srities atstovų.
 
 

Keliaujančio prekeivio uždavinio formulavimas

Keliaujantis prekeivis turi aplankyti N skirtingų miestų taip, kad viso maršruto svoris būtų kaip galima mažesnis, kai iš anksto yra žinomi visi svoriai. Maršruto svoriu gali būti įvardintas jo ilgis, kaina, trukmė.
Kiekvienas miestas gali būti aplankytas tik vieną kartą ir prekeivis turi baigti savo kelionę tame pačiame mieste, iš kurio jis pradėjo keliauti. Maršruto ilgis turi būti kiek galima trumpesnis. Keliaujančio prekeivio uždavinio tikslas yra minimizuoti viso maršruto svorinę funkciją (maršruto kainą, ilgį ar laiką):

Tai yra bendras keliaujančio prekeivio uždavinio (TSP) formulavimas. Yra daug atskirų keliaujančio prekeivio uždavinio formulavimo atvejų.


Simetrinis keliaujančio prekeivio uždavinys

Maršrutų svoriai wij tarp miestų i ir j gali būti atvaizduojami matrica. Matricos elementai wii = 0, kai i = 1, , N.
 
 
 
1
2
j
N
1
0
w12
w1j
w1N
2
w21
0
w2j
w2N
...
...
...
0
...
...
...
i
wi1
wi2
wij
wiN
...
...
...
...
...
0
...
N
wN1
wN2
wNj
0

Simetrinio keliaujančio prekeivio uždavinio atveju yra naudojama simetrinė maršrutų svorių matrica. Ir maršrutų svoriai tarp miestų i ir j wij =wji., kai i, j = 1, , N. Taigi gauto maršruto svoris bus toks pat, jeigu prekeivis keliaus atvirkštine tvarka.


Asimetrinis keliaujančio prekeivio uždavinys

Šiuo atveju, atstumas (kaina, svoris) iš miesto i į miestą j nebūtinai toks pats kaip iš miesto j į miestą i. Tuomet maršrutų svorių matricos elementai wij nelygūs wji,
kai i, j = 1, , N.


Daugelio keliaujančių prekeivių uždavinys

Galima nagrinėti ir tokį atvejį, kai yra m prekeivių, kurie yra mieste ir turi aplankyti kitus miestus. Kiekvienas iš N miestų turi būti aplankytas vieno iš m prekeivių. Tikslas yra surasti kiekvienam prekeiviui tokį maršrutą, kad sudėjus visų prekeivių maršrutus, gautume tokį rezultatą: kiekvienas iš N miestų bus aplankytas tik vieną kartą. Kiekvienas prekeivis turi pradėti ir baigti iš anksto nurodytoje vietoje.
 

Keliaujančio prekeivio maršruto optimizavimas

Keliaujančio prekeivio uždavinys priskiriamas kombinatorinių optimizavimo uždavinių klasei. Sprendžiant šį uždavinį, galima pritaikyti patį paprasčiausią sprendimo būdą perrinkimo algoritmą: sudaryti visus įmanomus maršrutus, rasti jų ilgį ir išrinkti patį trumpiausią maršrutą. Tačiau, jei mes turime n miestų, tai visų galimų maršrutų skaičius bus (n 1)! . Taigi šį algoritmą galima taikyti tik tada, kai turime labai mažai miestų. Šis algoritmas duoda patį trumpiausią maršrutą, tačiau yra pats neefektyviausias, skaičiavimų laiko prasme. Nagrinėjant TSP uždavinius reikia tokių algoritmų, kurie duotų optimalų sprendinį per polinominį laiką (lyginant su miestų skaičiumi n). Sprendžiant TSP uždavinius gali būti taikomi įvairūs algoritmai.


Apytikslūs algoritmai

Keliaujančio prekeivio uždavinio sprendimui gali būti naudojami algoritmai, kurie neduoda optimaliausio sprendinio, bet jų rezultatas - pakankamai optimalus sprendinys, gaunamas per polinominį laiką. Apytikslus algoritmas duoda sprendinį, kuris yra pakankamai arti optimalaus sprendinio. Apytikslių algoritmų atveju sprendinio paieškos laiką gan tiksliai galima numatyti iš anksto. Vienas iš apytikslių algoritmų pavyzdžių - šakų ir ribų metodas (Branch-and-Bound).
 

Heuristiniai algoritmai

Sprendžiant keliaujančio prekeivio uždavinį, dažniausiai naudojami heuristiniai algoritmai. Jie pateikia nebūtinai patį trumpiausią maršrutą, o tikėtinai trumpiausią. Tačiau heuristiniai algoritmai yra efektyvūs laiko prasme. Taigi heuristiniai algoritmai gali ir neduoti optimalaus sprendinio. Lyginant su apytiksliais algoritmais iš anksto nusakyti heuristinių algoritmų sprendinio paieškos laiką yra sudėtingiau.

Labai dažnai naudojami taip vadinami godūs heuristiniai algoritmai, kurie renkasi patį geriausią sprendimą tuo laiko momentu, nesirūpindami kaip tas pasirinkimas įtakos tolimesnę sprendimo eigą. Tokio algoritmo pavyzdys yra artimiausio kaimyno algoritmas (jis pateikiamas žemiau).

Genetiniai algoritmai naudoja evoliucijos proceso gamtoje metaforą. Sukuriama tam tikra populiacija individų, kurių kiekvieną apibūdina tam tikras chromosomų rinkinys (tai gali būti simbolių rinkinys). Tuomet ši populiacija gali vystytis ir augti kaip ir tikro evoliucijos proceso metu. Atskiri genetinių algoritmų atvejai taip pat gali būti taikomi sprendžiant TSP uždavinius.

Reikia paminėti, kad heuristinių algoritmų klasei priklauso tabu paieškos ir modeliuojamo atkaitinimo algoritmai. Jie taip pat gali būti naudojami spręsti keliaujančio prekeivio uždaviniui.
 

Realizuoti keliaujančio prekeivio uždavinio algoritmai

Išnagrinėjus šio uždavinio sprendimo metodus, ir atsižvelgiant į jų efektyvumą, buvo nuspręsta šį uždavinį realizuoti keliais metodais ir palyginti gautus rezultatus efektyvumo ir optimalumo prasme. Uždavinio realizavimui pasirinkti heuristiniai algoritmai: artimiausio kaimyno algoritmas, pasikartojantis artimiausio kaimyno algoritmas ir lankų pakeitimo (2-opt exchange) algoritmas. Pastarasis algoritmas buvo realizuotas dviem būdais: pirmas kai pradinis sprendinys artimiausio
kaimyno metodu gautas sprendinyd, antras pradinis sprendinys parinktas pseudo random būdu, pagal tai kokia tvarka buvo sužymėti miestai.
 

Artimiausio kaimyno algoritmas

Vienas iš godžių heuristinių algoritmų yra Artimiausio kaimyno algoritmas (Nearest Neighbour Algorythm). Pasirenkamas kelionės pradžios taškas (miestas) ir toliau einama į artimiausią jam miestą. Iš to miesto einama į kitą artimiausią miestą, nesirenkant jau aplankytų miestų, ir taip iki pat galo kai visi miestai bus aplankyti. Kelionė baigiasi, kai yra sugrįžtama į pradinį miestą.

Šio algoritmo sudėtingumas O(n3). Šis algoritmas gali ir neduoti optimaliausio maršruto. Todėl naudojamas algoritmo patobulinimas Pasikartojantis artimiausio kaimyno algoritmas (Repetitive Nearest Neighbour Algorythm).
 

Pasikartojantis artimiausio kaimyno algoritmas

Pasikartojantis artimiausio kaimyno algoritmas atlieka viską taip pat kaip ir artimiausio kaimyno algoritmas. Tik šiuo atveju artimiausio kaimyno algoritmas kartojamas N kartų, kaip išeities tašką pasirenkant vis kitą miestą. Tuomet iš gautų N maršrutų išrenkamas trumpiausias maršrutas. Gautas sprendinys yra optimalesnis arba sutampa su artimiausio kaimyno"algoritmo duodamu rezultatu.

Artimiausio kaimyno metodas ir pasikartojantis artimiausio kaimyno metodas yra vidutinės kokybės metodai. Norint pagerinti maršrutą, naudojamas 2-opt pakeitimo (2-opt exchange) metodas.

2- opt exchange algoritmas

Šis algoritmas priklauso lokalios paieškos heuristinių algoritmų klasei, kai duotas pradinis maršrutas H. 2-opt exchange algoritmo veikimo principas yra dviejų lankų panaikinimas, perjungiant lankų viršūnes kitokiu būdu, norint gauti geresnį , trumpesnį maršrutą. Jei naujasis maršrutas H yra trumpesnis, tuomet jis pakeičia maršrutą H. Yra tik vienintelis būdas perjungti lankus, kurie įeina į maršrutą. Tarkime turime du lankus:(i1 i2) ir (j1 j2) Perjungti lankai:(i1 j1) ir (i2 j2),

kur i1, i2, j1, j2 yra lankų viršūnės.

Jei length (i1 i2) + length(j1 j2) > length (i1 j1) + length (i2 j2), tuomet turime geresnį maršrutą H, kuris pakeičia maršrutą H.

Iš visų galimų lankų porų (vienos poros lankai neturi bendrų viršūnių), kurių 2-opt sukeitimas sumažina ilgį, pasirenkame tokią porą, kuri duoda trumpiausią maršrutą. Ši procedūra kartojama tol, kol nelieka porų, kurias galima būtų perjungti. Galutinis maršrutas vadinamas 2-optimaliu. Optimalus maršrutas taip pat yra ir 2-optimalus. Šis algoritmas tinka tik simetriniam TSP.

2-opt exchange algoritmas duoda geresnį rezultatą, jei yra pradinis maršrutas yra pakankamai optimalus. Todėl pradinis maršrutas šiame algoritme gali būti pasirenkamas kaip artimiausio kaimyno metodo rezultatas.

Išvados

Šiame darbe buvo realizuoti trys metodai, skirti spręsti keliaujančio prekeivio uždaviniui. Tai artimiausio kaimyno, pasikartojančio artimiausio kaimynoir dviejų lankų pakeitimo metodai. Savaime suprantama tokius uždavinius spręsti galima be galo daug būdų. Pats tiksliausias atsakymas būtų gautas naudojant perrinkimo metodą. Tačiau net leidžiant pažymėti tik 20 miestų, tai būtų per didelė prabanga. Norint gauti atsakymą, reiktų atlikti net 20! iteracijų.  Atliekant šių skirtingų algoritmų palyginimą buvo pasirinkti du parametrai, kurie tiesiogiai atspindi algoritmų optimalumą ir efektyvumą. Visi algoritmai buvo lyginami dviem aspektais: gauto trumpiausio maršruto ir iteracijų skaičiaus. Šiuo atveju buvo skaičiujamos tik ciklo iteracijos, neatsižvelgiant į tai kiek vienoje ciklo iteracijoje atliekama matematinių ar kitokių operacijų.

Iš karto galima pastebėti, kad artimiausio kaimyno ir pasikartojančio artimiausio kaimyno metodų sudėtingumą galima nesunkiai įvertinti. Artimiausio kaimyno metodas atlieka n2 iteracijų, o pasikartojančio artimiausio kaimyno metodas n3 iteracijų. Tačiau lankų pakeitimo metodo sudėtingumo teoriškai įvertinti neįmanoma. Sudėtingumas nepriklauso nuo miestų skaičiaus, o priklauso nuo to kiek bus padaryta lankų sukeitimo operacijų.

Buvo padarytos dvi lankų pakeitimo metodo modifikacijos. Pirmu atveju pradiniam maršrutui naudojamas pasikartojančio kaimyno algoritmas. Antru atveju naudojamas maršrutas, gautas vartotojui pažymėjus miestus.Toks maršrutasgali būti sąlyginai pavadintas pseudo atsitiktiniu. Beje abiejų modifikacijų sudėtingumo iš anksto įvertinti neįmanoma.

Iteracijų skaičiaus atžvilgiu visą laiką daugiausiai iteracijų atlikdavo pasikartojančio kaimyno algoritmas. Lankų pakeitimo metodas, naudojantis pasikartojančio kaimyno metodą, atlikdavo šiek tiek daugiau iteracijų, nei pasikartojančio kaimyno algoritmas, net ir tuo atveju, kai visi metodai duodavo vienodą rezultatą maršruto ir distancijos prasme. Lankų pakeitimo metodo naudojančio, pseudo atsitiktinį pradinį maršrutą, iteracijų skaičius priklauso nuo to kaip vartotojas sudėlioja miestus. Kuo pradinis maršrutas būdavo optimalesnis, tuo mažiau pakeitimų atlikdavo lankų pakeitimo metodas. Pasikartojančio kaimyno algoritmas dažniausiai atlikdavo mažiausiai iteracijų, išskyrus tuos atvejus, jei vartotojas pakankamai optimaliai sudėliodavo miestus (optimalus eiliškumas) ir pasirinkdavo lankų pakeitimo metodą, naudojantį pradinį maršrutą pagal tai, kaip vartotojas sužymėjo miestus.

Distancijos atžvilgiu artimiausio kaimyno metodas duodavo prasčiausią rezultatą (išskyrus tuos atvejus, kai visų metodų rezultatai sutapdavo). Dažniausiai geriausią rezultatą duoda lankų pakeitimo metodas. (itin retais atvejais pasikartojančio artimiausio kaimyno metodas).

Koks skirtumas tarp lankų pakeitimo metodo dviejų modifikacijų? Kuo daugiau taškų (miestų) tuo mažiau iteracijų atlikdavo šio algoritmo modifikacija su kaip pradinį maršrutą imanti pasikartojančio kaimyno metodo rezultatą. Beje kas įdomiausia, kai daug taškų išsiskirdavo šių modifikacijų rezultatai net distancijos prasme. Ir dažniausiai geresnį atsakymą duodavo modifikacija su artimiausio kaimyno metodo panaudojimu.

Remiantis stebėjimų duomenimis, galima teigti, kad iš nagrinėtų algoritmų optimaliausias yra lankų pakeitimo metodas, kuris kaip pradinį maršrutą naudoja artimiausio kaimyno metodu gaunamą rezultatą.

Papildoma literatūra:

 
http://itp.nat.uni-magdeburg.de/~mertens/TSP
http://saturn.vcu.edu/~gasmerom/MAT131/tsp.html
http://serendipity.nofadz.com/hermetic/misc/ts3/ts3demo.htm
http://www.ececs.uc.edu/~mnoschan/sale.html