Keliaujančio pirklio uždavinys

Arnoldas Bagdonas RM 0/1gr.,

Kauno Technologijos universitetas

Telekomunikacijų ir elektronikos fak.

Turinys:

Problemos aprašymas

Sprendimas:

Išvados

 

Problemos aprašymas

Pirklys nori apeiti visus šalies miestus apsilankydamas kiekviename iš jų tik po vieną kartą. Jis nori kuo mažiau pavargti, dėl to jam reikia eiti kuo trumpesniu keliu. Reikia rasti algoritmą, kuris padėtų pirkliui surasti minėtą maršrutą.

Sprendimas

alt="Your browser understands the APPLET> tag but isn't running the applet, for some reason." Your browser is completely ignoring the APPLET> tag!

1 pav. Java programa realizuojanti SA agoritmą pirklio kelio optimizavimui. (programos kodas: pirklys.java)

Algoritmas

Vienas iš algoritmų leidžiančių surasti tokio uždavinio sprendinį yra SA (simmulated annealing). Jo idėja yra paimta iš metalurgijoje atrastų šaldymo ir kristalizacijos procesų. Atomai skysčiuose juda labai greitai esant aukštoms temperatūroms ir lėčiau krintant temperatūrai. Lėto aušinimo metu išnyksta gardelių įtempimai. Tokiu atveju globalinė sistemos energija pasiekia absoliutų minimumą. Greito aušinimo metu atomams nelieka laiko išsirikiuoti ir sistema lieka aukštoje energetinėje būsenoje. Per greitai mažinant temperatūrą įtempimai esantys užšalančiame metale įšala.

Energijos arba sistemos būseną atspindinčios funkcijos (mūsų atveju pirklio nueito kelio) minimizavimo idėja: laikinai pakeičiama atsitiktinė sistemos dalis. Jei dėl šio pakeitimo energija sumažėja, pakeitimas priimamas ir paliekamas. Jei šis pakeitimas padidina sistemos energiją, pakeitimas priimamas su tam tikra (bėgant laikui vis mažėjančia) tikimybe:

                                          (1)

čia "delta" yra energijos pokytis (arba funkcijos pokytis), T sistemos temperatūra.

Detaliau SA algoritmas pavaizduotas 2 pav. blokinėje schemoje.

Programos parametrai

 

N - koeficientas, kuris apsprendžia T parametro kitimo greitį.  T reikšmė keičiama po N sistemos būsenos pasikeitimų. Šis koeficientas turi būti sveikas skaičius, t.y. netrupmeninis.

M - koeficientas, kuris kaip ir N apsprendžia T parametro kitimo greitį. T.y. T reikšmė keičiama kas M sistemos būsenos pasikeitimų, kurie sumažina sistemos energiją arba optimizuojamąjį dydį, šiuo atveju maršruto ilgį. Šis parametras turi būti sveikas skaičius, t.y. netrupmeninis.

T - koeficientas apsprendžiantis su kokia tikimybe reikia pereiti į blogesnę (mažiau optimalią) būseną. 

a - koeficientas, nuo kurio priklauso T keitimo greitis, nauja T reikšmė gaunama senąją dauginant iš a. Šis koeficientas  paprastai būna tarp 1 ir 0.7. Nenaudokite koeficiento sveikai daliai atskirti nuo trupmeninės "," (kablelio), tam reikia naudoti "."(tašką).

iter - nurodomas maksimalus iteracijų skaičius. Patartina šį skaičių parinkti kuo mažesnį, ir įvertinus turimo kompiuterio spartą atitinkamai jį padidinti taip, kad skaičiavimai būtų užbaigiami per priimtiną laiko tarpą.

Programos aprašymas

Klavišų paskirtis:

cities - atsitiktinai sugeneruojamos miestų koordinatės. Miestų skaičius nurodomas gretimame laukelyje.

Kiti klavišai yra skirti pradinio maršruto generavimui:

random - sugeneruojamas atsitiktinis miestų apėjimo maršrutas.

nearest - pradedama nuo kokio nors miesto ir ieškomas artimiausias, po to kitas artimiausias ir taip tęsiama, kol visi miestai aplankomi po vieną kartą.

bubble - pradedama nuo trijų atsitiktinių miestų. Po to imamas naujas miestas ir ieškoma, kurioje ankstesnius miestus jungiančioje kraštinėje geriausia įtraukti naująjį miestą. Taip tęsiama, kol visi miestai bus įtraukti į maršrutą.

Paspaudus vieną iš maršruto generavimo klavišų (bubble, nearest, random) pradedamas vykdyti SA algortimas, surastas trumpausio maršruto ilgis rodomas dešinėje pusėje The best length laukelyje, sugeneruoto maršruto ilgis rodomas virš jo esančiame laukelyje Old length, o algoritmas esamu laiko momentu parodo turimą maršruto ilgį laukelyje The curent lenght. Norint pamatyti SA surastą optimalų kelią reikia uždėti varnelę laukelyje SA, to nepadarius bus parodomas pradinis maršrutas.

iter laukelyje reikia nurodyti SA algortimo iteracijų skaičių. Patartina pradėti nuo mažų reikšmių, nes įvedus didelį skaičių kompiuteris bus labai apkrautas ir gali sutrikti jo normalus darbas.

Pastaba:  žemėlapyje mėlynomis linijomis pavaizduojamas pradinis sugeneruotas maršrutas, raudona - SA surastas optimalus maršrutas. Taip pat maksimalus miestų skaičius yra ribotas - maksimaliai galimi 98 miestai.

 

2 pav. SA algoritmo adaptuoto pirklio uždaviniui spręsti blokinė schema.

Algoritmo tyrimas:

Tyrinėjant algoritmą paaiškėjo, jog priklausomai nuo parinktų algortimo parametrų N, M, a ir T gaunami gana skirtingi rezultatai (žr. 1-3 lenteles). Siekiant sumažinti laiko sąnaudas, šiame ekspermente buvo užsiduotas maksimalus iteracijų skaičius lygus 10000.

 1 lentelė. Pastovus parametras T (visi kiti kintantys)

T=const

10

50

100

500

vid. Ilgis

5037

5270

5505

6012

 2 lentelė. Pastovus parametras N (visi kiti kintantys)

N=const

10

50

100

vid. Ilgis

5413

5486

5469

 3 lentelė. Pastovus parametras M (visi kiti kintantys)

M=const

10

10

50

vid. Ilgis

5470

5476

5422

 Pastaba: vid. ilgis   tai įvairių algoritmo realizacijų su skirtingais parametrais rastų optimalių sprendinių (trumpiausių kelių) vidurkis.

 Kaip matome gaunami rezultatai labiausiai priklauso nuo T: kuo T mažesnis, tuo geresni rezultatai. Tačiau, kai T mažas galima pakankamai ilgai laukti optimalaus sprendinio ir nesulaukti, nes paprasčiausiai sistema gali būti tokioje būsenoje, iš kurios į optimalią pereinama per žymiai aukštesnės energijos būseną.

Kitas parametras  yra N, nuo jo labai priklauso temperatūros mažėjimo greitis, arba blogo sprendinio priėmimo tikimybės mažėjimas. Jei šis parametras yra mažas, tai temperatūra greičiau mažėja ir į aukštesnės energijos būsenas pereinama vis rečiau ir rečiau.

Analogiškas parametro M vaidmuo, tik jis turi didesnę įtaką prie mažesnių T reikšmių, kai pakeitimai daromi vis dažniau į mažesnės energijos būseną.

 Nors SA algoritmas yra gana paprastas, tačiau jį galima patobulinti: parinkti optimalias T, M, N ir a reikšmes. Taip pat algoritmą galima patobulinti parinkus geresnį pradinį maršrutą. Vienas iš galimų algoritmų yra  toks pradedama nuo bet kurio laisvai pasirinkto miesto, po to einama į jam artimiausią, po to vėl į artimiausią. Taip tęsiama, kol neliks miestų, kuriuose dar nebuvome apsilankę. Po to einama vėl į pradinį miestą. Tai yra artimiausio miesto algortimas. Algoritmo efektyvumas taip pat priklauso nuo to kokie sistemos pakeitimai naudojami sukeičiama tik dviejų gretimų miestų apėjimo tvarka, sukeičiama atsitiktinai parinktų miestų apėjimo tvarka ir pan. Nuo to, mano nuomone, taip pat labai priklauso gaunami rezultatai.

 Parametrų optimizavimo tikslingumą galima pailiustruoti taip:

 a)      Parenkamas atsitiktinis pradinis miestų apėjimo maršrutas (jo ilgis 6012 kilometrų), parametrai T=500, N=200, M=10, a=0.99. Per 3 valandas darbo (maksimalus iteracijų skaičius nebuvo ribotas) algoritmas surado optimalų 3012 kilometrų ilgio sprendinį.

b)      Parenkamas pradinis miestų apėjimo maršrutas panaudojant artimiausio miesto algoritmą (jo ilgis 3082 kilometrų), parametrai T=20, N=200, M=10, a=0.99. Per 30 minučių darbo (maksimalus iteracijų skaičius nebuvo ribotas) algoritmas surado optimalų 2996 kilometrų ilgio sprendinį.

Išvados: 

1. SA algoritmas leidžia surasti optimalų maršrutą, tačiau tam reikia daug laiko - algoritmas turi "peržiūrėti" labai daug sistemos būsenų.

2. Norint gauti tuos pačius rezultatus per trumpesnį laiką, reikia optimizuoti algortimo parametrus. Jų optimizavimo nenagrinėsiu, nes tai atskiras ir sudėtingas darbas reikia rasti keturių-šešių argumentų (priklausomai nuo SA realizavimo) funkcijos (N,M,T,a, miestų keitimo tvarka, L) geriausią rezultatą duodančią reikšmę. Taip pat reikia nepamiršti, jog tokios sudėtingos funkcijos optimizavimas reikalaus daug laiko ir kiekvienu atveju gali būti vis kitoks (t.y. vienam atvejui rasti optimalūs parametrai kitu atveju gali visiškai netikti).