Algoritmø analizës specialieji skyriai

Panašūs dokumentai
4 skyrius Algoritmai grafuose 4.1. Grafų teorijos uždaviniai Grafai Tegul turime viršūnių aibę V = { v 1,v 2,...,v N } (angl. vertex) ir briaun

Algoritmai ir duomenų struktūros (ADS) 7 paskaita Saulius Ragaišis, VU MIF

PowerPoint Presentation

GRAFŲ TEORIJA Pasirenkamasis kursas, Magistrantūra, 3 sem m. rudens semestras Parengė: Eugenijus Manstavičius Įvadas Pirmoji kurso dalis skirta

LIETUVOS JAUNŲJŲ MATEMATIKŲ MOKYKLA 7. PAPRASČIAUSIOS DIFERENCIALINĖS LYGTYS ( ) Teorinę medžiagą parengė ir septintąją užduotį sudarė prof. d

Lietuvos mokinių matematikos olimpiada Rajono (miesto) etapo užduočių klasei sprendimai 2015 m. 1 uždavinys. Aistė užrašė skaičių seką: 1 (2 3)

PowerPoint Presentation

* # * # # 1 TIESĖS IR PLOKŠTUMOS 1 1 Tiesės ir plokštumos 1.1 Lygtys ir taškų aibės Sferos lygtis Tarkime, kad erdvėje apibrėžta Dekarto stačiak

lec10.dvi

10 Pratybos Oleg Lukašonok 1

Algoritmai ir duomenų struktūros (ADS) 2 paskaita Saulius Ragaišis, VU MIF

Algebra ir geometrija informatikams. Paskaitu¾ konspektas Rimantas Grigutis 7 paskaita Matricos. 7.1 Apibr eµzimas. Matrica A yra m eiluµciu¾ir n stul

MatricosDetermTiesLS.dvi

9 paskaita 9.1 Erdvės su skaliarine daugyba Šiame skyriuje nagrinėsime abstrakčias tiesines erdves, kurioms apibrėžta skaliarinė daugyba. Jos sudaro l

Printing AtvirkstineMatrica.wxmx

TIESINĖ ALGEBRA Matricos ir determinantai Matricos. Transponuota matrica. Nulinė ir vienetinė matrica. Kvadratinė matrica. Antrosios ir trečiosios eil

Atranka į 2019 m. Pasaulinę ir Vidurio Europos matematikos olimpiadas Sprendimai Artūras Dubickas ir Aivaras Novikas 1. Mykolas sugalvojo natūraliųjų

Slide 1

Printing triistr.wxmx

QR algoritmas paskaita

DISKREČIOJI MATEMATIKA. Grafai serija 5800 variantas 001 Grafas G 1 = (V, B 1 ) apibrėžtas savo viršūnių bei briaunų aibėmis: V = {i, p, z, u, e, s},

Neiškiliojo optimizavimo algoritmas su nauju bikriteriniu potencialiųjų simpleksų išrinkimu naudojant Lipšico konstantos įvertį

(Microsoft Word - Pasiruo\360imas EE 10 KD-1)

PS_riba_tolydumas.dvi

VI. TOLYDŽIU IR DIFERENCIJUOJAMU FUNKCIJU TEOREMOS 6.1 Teoremos apie tolydžiu funkciju tarpines reikšmes Skaitytojui priminsime, kad nagrinėdami reali

III. SVEIKI NENEIGIAMI SKAIČIAI 3.1 Indukcijos aksioma Natūraliu ju skaičiu aibės sa voka viena svarbiausiu matematikoje. Nors natūralaus skaičiaus sa

Printing BaziniaiSprendiniai&KrastutiniaiTaskai.wxm

Teorinių kontrolinių sąlygos ir sprendimai Vytautas Kazakevičius 2016 m. gruodžio 20 d. Teiginiai ( ). 1. (0.05 t.) Užrašykite formule tokį t

DISKREČIOJI MATEMATIKA. Grafo tyrimas serija 5705 variantas Grafas (, ) yra 1 pilnasis; 2 tuščiasis; 3 nulinis; 4 dvidalis. 2 Atstumas tarp graf

Logines funkcijos termu generavimo algoritmas pagristas funkciniu modeliu

Microsoft Word - 15_paskaita.doc

TAIKOMOJI MATEMATIKA IR KIEKYBINIAI METODAI. Rašto darbas serija 3081 variantas Nustatykite funkcijos f(x) = x+2 x 6 cos ( 3x) apibrėžimo sritį.

Microsoft Word - T-Krivousas_magistrinis.doc

VERSLO IR VADYBOS TECHNOLOGIJŲ PROGRAMA

Slide 1

Longse Wi-Fi kameros greito paleidimo instrukcija 1. Jums prireiks 1.1. Longse Wi-Fi kameros 1.2. Vaizdo stebėjimo kameros maitinimo šaltinio 1.3. UTP

Dažniausios IT VBE klaidos

Projektas „Europos kreditų perkėlimo ir kaupimo sistemos (ECTS) nacionalinės koncepcijos parengimas: kreditų harmonizavimas ir mokymosi pasiekimais gr

GPAIS vartotojo vadovas savivaldybėms GPAIS VARTOTOJO VADOVAS SAVIVALDYBIŲ PILDOMAI INFORMACIJAI GPAIS TURINYS 1. BENDRI DARBO SU GPAIS PRINCIPAI... 2

TAIKOMOJI MATEMATIKA. 1-ojo testo pavyzdžiai serija **** variantas 001 x x + 12 lim = x 4 2x 8 1 2; 3 0; 2 1 2; 5 1; 6 2; 7 ; riba nee

L I E T U V O S J A U N Ų J Ų M A T E M A T I K Ų M O K Y K L A 2. TRIKAMPIŲ ČEVIANOS ( ) Teorinę medžiagą parengė ir antrąją užduotį sudarė V

Duomenų vizualizavimas

RR-GSM_IM_LT_110125

VILNIAUS UNIVERSITETAS MATEMATIKOS IR INFORMATIKOS FAKULTETAS PROGRAMŲ SISTEMŲ KATEDRA Atsitiktinės paieškos optimizavimo algoritmų vertinimas Evaluat

Priedai_2016.indd

Slide 1

LIETUVOS DARBO BIRŽOS

DB sukūrimas ir užpildymas duomenimis

Ginčo byla Nr LIETUVOS BANKO PRIEŽIŪROS TARNYBOS FINANSINIŲ PASLAUGŲ IR RINKŲ PRIEŽIŪROS DEPARTAMENTO DIREKTORIUS SPRENDIMAS DĖL A. G. IR

Microsoft PowerPoint Ekstremumai_naujas

Kauno menų darželis Etiudas Mgr. Virginija Bielskienė, direktorės pavaduotoja ugdymui, II vad. kategorija, auklėtoja metodininkė Žaidimas pagrindinė i

Masyvas su C++ Užduotys. Išsiaiškinkite kodą (jei reikia pataisykite) ir paleiskite per programą. Ciklo skaitliuko įrašymas į vienmatį masyvą: #includ

AAA.AIEPI.Mokymu_medziaga_MOK_VI_07.Vandens_inventorizacijos_duomenu_tvarkymas.v.0.4

XI skyrius. KŪNAI 1. Kūno sa voka Šiame skyriuje nagrinėsime kūnus. Kūnas tai aibė k, kurioje apibrėžti aibės k elementu du vidiniai kompozicijo

P. Kasparaitis. Praktinė informatika. Skriptų vykdymas ir duomenų valdymas Skriptų vykdymas ir duomenų valdymas Įvadas Skripto failas tai M

Vigirdas Mackevičius 2. Sekos riba Paskaitu konspektas Intuityviai realiu ju skaičiu seka vadinama realiu ju skaičiu aibė, kurios elementai (vadinami

RET2000 Elektronisis Skaitmeninis Termostatas su LCD

Informacijosmokslai50-n.indd

ES F ben dri Projekto kodas (Įrašoma automatiškai) 1 PROJEKTO SFMIS DUOMENŲ FORMA FORMAI PRITARTA m. Europos Sąjungos struktūrinės paramos a

DĖL APLINKOS IR SVEIKATOS MOKSLO KOMITETO ĮSTEIGIMO

(Microsoft Word - Versta i\360 angli\360ko vertimo i\360 dan\370 k.docx)

24 VERSLO APSKAITOS STANDARTO MR

PATVIRTINTA

PRIEINAMAS TURIZMAS-TURIZMAS VISIEMS UNIVERSALUS DIZAINAS: TEORIJA IR PRAKTIKA

Magistro darbas

PATVIRTINTA Kauno sporto mokyklos Startas Direktoriaus 2019 m. balandžio 23 d. įsakymu Nr KAUNO SPORTO MOKYKLOS STARTAS PRIVATUMO POLITIKA Kauno

Microsoft Word - Ak noretum grizti v04.docx

Pagrindiniai algoritmai dirbant su sveikųjų ir realiųjų skaičių masyvų reikšmėmis Sumos skaičiavimo algoritmas Sveikieji skaičiai int Suma (int X[], i

Banko_paslaugu_internetu_teikimo_salygos_

Brandos egzaminų organizavimas ir vykdymas 2012 m.

Microsoft PowerPoint Dvi svarbios ribos [Read-Only]

LIETUVOS ŽEMĖS ŪKIO UNIVERSITETAS

3 k. BUTAS Vilniaus m. sav., Vilkpėdė, Vilkpėdės g. Domantas Grikšas tel

Muzikos duomenų bazės NAXOS Music Library naudojimo vadovas Turinys Kas yra NAXOS Music Library... 2 Kaip pradėti naudotis... 3 Kaip atlikti paiešką..

SKLYPAS Vilniaus m. sav., Užupis, Darbo g. Antanas Kudarauskas tel

IKT varžybos Pakeliaukime po informacijos pasaulį Varžybų vykdymo eiga 1. Komandų prisistatymas Susipažinkime užduotis (1 priedas) Mokinukui per

Kauno Veršvų vidurinės mokyklos įsivertinimo ataskaita 2015 m. Kauno Veršvų vidurinės mokyklos giluminiam vertinimui pasirinkti rodikliai m.

LIETUVOS RESPUBLIKOS AZARTINIŲ LOŠIMŲ ĮSTATYMO NR. IX-325 2, 10, 15, 16, 29 STRAIPSNIŲ PAKEITIMO IR ĮSTATYMO PAPILDYMO 15 1, 16 1 STRAIPSNIAIS ĮSTATYM

_SGD_SPRENDINIAI TARYBAI_AR SANTRAUKA_12005

Techninė dokumentacija Qlik Sense architektūros apžvalga 2015 m. gruodis qlik.com

Microsoft Word - Moletu_Raj_Koncepcija_7_Redakcija doc

LIETUVOS RESPUBLIKOS LYGIŲ GALIMYBIŲ KONTROLIERIUS SPRENDIMAS DĖL GALIMOS DISKRIMINACIJOS AMŽIAUS PAGRINDU UŽDARAJAI AKCINEI BENDROVEI SLAPTO PIRKĖJO

Slide 1

PowerPoint Presentation

Rekomendacijos vietinės reikšmės kelių su žvyro danga taisymui

VILNIAUS KOLEGIJA AGROTECHNOLOGIJ FAKULTETAS CHEMIJOS KATEDRA Tyrimas: STUDENTAI APIE KURSINĮ DARBĄ Dalykas: LABORATORIJ VEIKLA Tyrimą atliko lektorė:

BALSO SKAMBUČIŲ UŽBAIGIMO JUDRIOJO RYŠIO TINKLE SĄNAUDŲ APSKAIČIAVIMO PAAIŠKINIMAS IR SKAMBUČIŲ INICIJAVIMO SĄNAUDŲ SKAIČIAVIMO PRINCIPŲ PAAIŠKINIMAS

PATVIRTINTA Kauno lopšelio darželio Vaikystė direktoriaus 2015 m. spalio 26 d. įsakymu Nr. V-74 KAUNO LOPŠELIO DARŽELIO VAIKYSTĖ VAIZDO DUOMENŲ TVARKY

Lietuvos mobiliojo ryšio operatorių 30Mbit/s zonų skaičiavimo metodika

1. Matematinės dėlionės Įvadas Šiame modulyje pateiktos įvairaus sudėtingumo matematinės dėlionės. Jos padės mokytis skaičiuoti mintinai ir rasti įvai

Microsoft Word - DSEA-3s.doc

Foresta

6. ŠAKNIES RADIMO ALGORITMAS Istorija. Babiloniečių arba Herono algoritmas. Jau žiloje senovėje reikėjo mokėti traukti kavadratinę šaknį. Yra išlikęs

MATEMATIKOS BRANDOS EGZAMINO PROGRAMOS MINIMALIUS REIKALAVIMUS ILIUSTRUOJANTYS PAVYZDŽIAI Egzamino programos minimalūs reikalavimai 1.3. Paprastais at

JABRA REVO WIRELESS Naudotojo Vadovas jabra.com/revowireless

UGDYMO PLĖTOTĖS CENTRO DIREKTORIUS ĮSAKYMAS DĖL UGDYMO PLĖTOTĖS CENTRO DIREKTORIAUS 2016 M. VASARIO 29 D. ĮSAKYMO NR. VK-24 DĖL BENDROJO UGDYMO DALYKŲ

PowerPoint Presentation

LIETUVOS RESPUBLIKOS VYRIAUSYBĖ N U T A R I M A S DĖL VAIKO GLOBOS ORGANIZAVIMO NUOSTATŲ PATVIRTINIMO 2002 m. kovo 27 d. Nr. 405 Vilnius Vadovaudamasi

Microsoft Word - 8 Laboratorinis darbas.doc

G E O M E T R I J A Gediminas STEPANAUSKAS Turinys 1 TIES ES IR PLOK TUMOS Plok²tumos ir tieses plok²tumoje normalines lygtys

Transkriptas:

VGTU Matematinio modeliavimo katedra VGTU SC Lygiagrečiųjų skaičiavimų laboratorija Paskaitų kursas. 5-oji dalis.

Turinys 1 2 KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu

Grafai. Pagrindinės sąvokos ir apibrėžimai. Tegul turime viršūnių (vertex) aibę V = { v 1, v 2,..., v n } ir briaunų aibę E = { e 1, e 2,..., e K }, briauna (edge) yra viršūnių pora - e j = (v j1, v j2 ). Grafu vadinama pora G = (V, E). Paprasčiausias grafo pavyzdys yra šalies kelių žemėlapis: miestai ir gyvenvietės sudaro viršūnių aibę, o keliai briaunų aibę. Jei briaunos e j = (v j1, v j2 ) ir e k = (v j2, v j1 ) yra skirtingos (t.y. svarbi ir jų jungimo kryptis), tai jos vadinamos orientuotomis, o grafas, sudarytas iš tokių briaunų, vadinamas orientuotuoju grafu. Orientuotąją briauną dar vadiname lanku. Pavyzdys: keliai (gatvės) su vienpusiu judėjimu. Dvi grafo viršūnės, sujungtos bent viena briauna, vadinamos gretimomis arba kaimyninėmis, priešingu atveju jos vadinamos nepriklausomomis. Pavyzdžiui, Vilnius ir Kaunas yra gretimos viršūnės, o Kaunas ir Utena yra nepriklausomos viršūnės.

Viršūnės v kaimynų (angl. neighbours) aibę žymėsime N (v) = { u : u V, (u, v) E arba (v, u) E } ir vadinsime viršūnės aplinka. Viršūnės v laipsnis deg(v) yra kaimynų skaičius. Jei viršūnė neturi kaimynų (deg(v) = 0), tai ji vadinama izoliuota. Kai deg(v) = 1, tai v vadinama nusvirusia viršūne. Orientuoto grafo atveju skiriame viršūnės įėjimo ir išėjimo puslaipsnius. Dažniausiai neužtenka tik žinoti, kad du miestai yra sujungti keliu, svarbus yra ir atstumas tarp šių miestų bei koks maksimalus greitis leidžiamas važiuojant šiuo keliu. Todėl grafo briaunoms gali būti priskirti realieji skaičiai, įvertinantys atstumą, laiką, svorį ir panašius požymius. Toks grafas vadinamas svertiniu arba įvertintuoju. Briaunos e j E įvertį (svorį, angl. weight) žymėsime w(e j ).

Grafų pavyzdžiai a) neorientuotas b) orientuotas c) svertinis pav.: Grafų pavyzdžiai: a) neorientuotas grafas, V = 7, E = 7, viršūnių v 1, v 3, v 4 laipsnis yra lygus 3, viršūnių v 2, v 5 laipsnis lygus 2, v 6 yra nusvirusi viršūnė, v 7 izoliuota viršūnė, b) orientuotas grafas, V = 4, E = 6, c) svertinis grafas, V = 6, E = 8

Viršūnių seką p = { v i0, v i1,..., v ik } vadiname keliu (angl. path), jei sekos visos gretimos viršūnės yra sujungtos briaunomis, t. y. (v ij, v ij+1 ) E, j = 0, 1,..., k 1. Ciklu vadiname kelią, kuriame pradinė viršūnė sutampa su paskutine v i0 = v ik, o kitos viršūnės kelyje nesikartoja. Grafą vadiname jungiuoju, jei tarp bet kurių jo viršūnių egzistuoja kelias. Pavyzdžiui, jeigu turime kelių žemėlapį ir grafas yra jungusis, tai iš bet kurio miesto ar gyvenvietės galima nuvažiuoti į kitą vietovę. Pavasarinių potvynių metu kai kurios gyvenvietės tampa nepasiekiamos - grafas tampa nejungiu. Grafas yra vadinamas pilnuoju, jei visos jo viršūnės tarpusavyje sujungtos briaunomis, t. y.: N (v j ) = V \ {v j }, j = 1, 2,..., V.

Nagrinėkime svertinį grafą. Kelio p = { v i0, v i1,..., v ik } ilgiu vadinsime skaičių k 1 W (p) = w ( (v ij, v ij+1 ) ). j=0 Jei grafo briaunų svoriai nėra nustatyti, tada kelio ilgiu vadiname kelio briaunų skaičių. Trumpiausiu keliu, jungiančiu dvi grafo viršūnes a ir b, vadiname kelią p = { a, v i1,..., v ik, b }, tenkinantį sąlygą W (p) W (p ), čia p yra bet koks kitas kelias, jungiantis a ir b. Teorema.Jei visų briaunų svoriai yra teigiamieji skaičiai, tai trumpiausias kelias visada egzistuoja. Įrodymas. Kadangi briaunų svoriai yra teigiamieji skaičiai, tai trumpiausiame kelyje negali būti ciklų. Tada lieka baigtinis (nors gal būt ir labai didelis) skirtingų kelių skaičius, iš jų ir išrenkame trumpiausią.

Grafo vaizdavimo duomenų struktūros Duomenų struktūrą, vaizduojančią grafą, parinkti nėra labai paprasta. Būtina atsižvelgti į du svarbius kriterijus: 1 saugomos informacijos apimtį (t.y. naudojamos atminties), 2 veiksmų su grafais atlikimo efektyvumą (t.y. greitį). Ypač dažnai reikia rasti viršūnes, kurios yra gretimos duotajai. Todėl grafo duomenų struktūra turi būti tokia, kad ši operacija būtų atliekama kuo grečiau. Orientuotojo grafo atveju turi būti skiriamos gretimos įeinančios ir išeinančios viršūnės. Dažniausiai grafo struktūrą apibrėžiame naudodami tiesinės algebros duomenų struktūrą matricas. Kadangi matricos yra įvairių tipų, galime prisitaikyti prie grafo briaunų pasiskirstymo ir jų kiekio. Išnagrinėsime du svarbiausius atvejus, kai grafas yra artimas pilnajam ir kai kiekviena viršūnė sujungta tik su nedideliu skaičiumi kaimyninių viršūnių.

Grafo viršūnių gretimumo matrica Turime grafą G = (V, E). Apibrėžiame n n dydžio matricą s 11 s 12... s 1n s S = 21 s 22... s 2n............, s n1 s n2... s nn kurios elementai yra tokie: 1, jei e ij := (v i, v j ) E, s ij = 0, jei e ij E. Jei grafas yra svertinis, tai gretimumo matricoje saugome ir briaunų svorius: w ij, jei e ij E, s ij = 0, jei e ij E.

Jei grafas nėra orientuotasis, tai jo gretimumo matrica S yra simetrinė: s ij = s ji, 1 i, j n. Matricos S i-tosios eilutės nenuliniai elementai apibrėžia tas viršūnes v j, į kurias galima patekti iš v i viršūnės. Atitinkamai, j-ojo stulpelio nenuliniai elementai apibrėžia viršūnes v i, iš kurių galima patekti į v j. Saugomos informacijos apimtis yra n 2 skaičių. Viršūnės v i visas gretimas viršūnes randame, atlikę n veiksmų. Ši duomenų struktūra ypač efektyvi, kai reikia patikrinti, ar e ij E, tokio veiksmo sąnaudos yra O(1) eilės dydis. Sudarykime gretimumo matricas trijų grafų, pavaizduotų 1 paveiksle.

Grafo viršūnių gretimumo suspausto formato matrica Dažniausiai grafo viršūnių laipsnis (gretimų viršūnių skaičius) yra daug mažesnis už n. Todėl didesnioji grafo viršūnių gretimumo matricos koeficientų dalis yra nuliai. Todėl toks informacijos saugojimo būdas nėra ekonomiškas. Tiesinėje algebroje matricos, kurių eilučių nenulinių koeficientų skaičius yra daug mažesnis už stulpelių skaičių, vadinamos retomis (angl. sparse matrix). Joms saugoti taikomi įvairus informacijos suspaudimo būdai (formatai). Vieną iš tokių formatų pritaikysime grafo duomenims vaizduoti.

Masyve A iš eilės surašome visų viršūnių gretimas viršūnes: pirmosios viršūnės kaimynų numeriai, antrosios,... Šio masyvo ilgis yra lygus grafo briaunų skaičiui dim E. Kartu sudarome kitą masyvą - R. Masyvo R elementas r i nurodo viršūnės v i gretimų viršūnių sąrašo pradžią masyve A. Masyvo R ilgis yra (n + 1), paskutinį elementą apibrėžiame kaip r n+1 = E + 1. Taigi, v i kaimynų aibę gauname tokiu būdu: N (v i ) = { v aj : r i j < r i+1 }. Jeigu turime įvertintąjį grafą G, tai papildomame masyve W saugome atitinkamų briaunų svorius (tokia pačia tvarka kaip saugomos gretimos viršūnės A masyve). Sudarykime suspausto formato matricas trijų grafų, pavaizduotų 1 paveiksle.

Pagrindiniai grafų teorijos uždaviniai Daug taikomųjų uždavinių gali būti suformuluoti vartojant grafų sąvokas. Suformuluosime dažniausiai pasitaikančius uždavinius. 1 uždavinys. Duotas grafas G = (V, E). Reikia rasti trumpiausią kelią tarp dviejų jo viršūnių a, b V. 2 uždavinys. Reikia rasti trumpiausius kelius tarp viršūnės a ir visų kitų grafo viršūnių v V. 3 uždavinys. Jeigu grafas G yra orientuotasis, tai reikia rasti trumpiausius kelius iš visų grafo viršūnių v V iki duotosios viršūnės a V. 4 uždavinys. Kiekvienai grafo viršūnių porai a, b V reikia rasti trumpiausią jas jungiantį kelią. Aišku, kad išmokę spręsti 2 uždavinį, 3 uždavinį galėsime išspręsti tuo pačiu algoritmu, prieš tai pakeitę briaunų kryptis. Taigi lieka trys skirtingi uždaviniai.

Atrodytų, kad užtenka išmokti spręsti 1 uždavinį, tada 2 ir 4 uždavinius spręsime, kaip seką paprastesnių pirmojo tipo uždavinių. Bet toks būdas nebūtinai yra geriausias: 1 sudėtingesnio uždavinio tiesioginis sprendimo algoritmas gali būti daug efektyvesnis; 2 pamatysime, kad paprastesnį 1 uždavinį efektyviai pavyksta išspręsti tik algoritmu, skirtu 2 uždaviniui spręsti (Dijkstros algoritmas). Šis faktas pamokantis: dažnai lengviau yra išspręsti tinkamai suformuluotą bendresnį uždavinį, nei rasti atskirojo uždavinio sprendinį.

Spręsime 2 uždavinį, t. y. rasime trumpiausius kelius nuo viršūnės v 1 iki visų kitų įvertintojo grafo viršūnių w V. Dijkstros algoritme naudojama godi strategija: kiekvienu žingsniu pasirenkamas geriausias lokalus sprendinys. Vykdydami pirmąjį algoritmo žingsnį randame viršūnę w 1, iki kurios kelias iš v 1 yra šiuo metu trumpiausias. Toliau nagrinėjame visas naujosios viršūnės (1 žingsnyje w 1 ) dar neparinktas kaimynes v j (1 žingsnyje išskyrus v 1 ). Kiekvienai tokiai viršūnei v j lyginame dviejų kelių ilgius: geriausio iš iki šiol žinomų (1 žingsnyje tiesiai iš v 1 į v j, jei toks kelias yra) ir naujo kelio, kai pirmiausia trumpiausiu keliu einame į w 1, o iš jos pasiekiame v j. Pasirenkame trumpiausią kelią iš dviejų ir išsaugome, kaip geriausią (trumpiausią) žinomą kelią šiuo metu. Šį algoritmą kartojame randami viršūnę w 2, iki kurios kelias iš v 1 yra šiuo metu trumpiausias, ir t.t.

Dijkstros algoritmo duomenų struktūros Šiuo metu žinomų trumpiausių kelių iš v 1 iki kiekvienos viršūnės v i V ilgius saugome masyve d[ ]. Masyvą p[ ] naudojame šiuo metu žinomam trumpiausiam maršrutui išsaugoti ir atstatyti. Jo i-tojo elemento reikšmė p i = k parodo, kad į v i viršūnę patenkame iš v k viršūnės. Aibėje S saugosime viršūnes, iki kurių jau radome trumpiausią kelią. Pradžioje šiai aibei priklauso tik pradinė viršūnė v 1. Vykdydami algoritmą kiekviename žingsnyje aibę S papildome nauja viršūne: w 1, w 2,... Aibėje Q saugome viršūnes, iki kurių trumpiausias kelias dar nežinomas. Aišku, taupydami kompiuterio atmintį, galime apsiriboti tik aibe S arba Q, nes Q = V \ S, tačiau algoritmo realizacija yra efektyvesnė, kai parenkame tinkamą duomenų struktūrą aibei Q saugoti.

Dijkstra () // Dijkstros algoritmas begin (1) for ( i ( = 2; i n ; i++ ) do // pradinių reikšmių priskyrimas (2) if (v1, v i) E ) d i = w 1i; (3) else d i = ; (4) p i = 1; end do (5) S = {v 1}; Q = V \ S; (6) for ( i = 1; i < n ; i++ ) do (7) randame w i = v k Q: d k d j, v j Q; (8) if ( d k = ) stop // Grafas nejungus (9) S = S v k ; Q = Q \v k ; (10) for ( v j N (v k ) Q ) do (11) d = d k + w kj (12) if ( d j > d ) then // dviejų kelių ilgių palyginimas (13) d j = d, p j = k; end if end do end do end Dijkstra

Rasime trumpiausius kelius iš viršūnės v 1 iki visų likusių grafo viršūnių. Aibės S ir masyvų d, p pradinės reikšmės yra tokios: i = 0 : S = { v 1 }, d = (0, 70, 50,, 100, ), p = (1, 1, 1, 1, 1, 1). Toliau: 1 : S = { v 1, v 3 }, d = (0, 70, 50, 65, 100, ), p = (1, 1, 1, 3, 1, 1) 2 : S = { v 1, v 3, v 4 }, d = (0, 70, 50, 65, 95, 110), p = (1, 1, 1, 3, 4, 4) 3 : S = { v 1, v 3, v 4, v 2 }, d = (0, 70, 50, 65, 95, 90), p = (1, 1, 1, 3, 4, 2) 4 : S = { v 1, v 3, v 4, v 2, v 6 }, d = (0, 70, 50, 65, 94, 90), p = (1, 1, 1, 3, 6, 2) 5 : S = { v 1, v 3, v 4, v 2, v 6, v 5 }, d = (0, 70, 50, 65, 94, 90), p = (1, 1, 1, 3, 6, 2) Trumpiausias kelias iš v 1 į v 5, yra p = (v 1, v 2, v 6, v 5), o jo ilgis p = 94.

1 uždavinio sprendimas Dijkstros algoritmu Jei sprendžiamas 1 uždavinys, t.y. reikia rasti trumpiausią kelią iš v 1 iki vienos viršūnės w, tai sprendinį gauname tuo pačiu Dijkstros algoritmu ir galime nutraukti (6) ciklą, kai naujoji (7) žingsnyje rasta viršūnė w i yra w, t.y. į pseudokodą reikia įdėti eilutę (9) if ( w i == w ) break; Tačiau blogiausiu atveju, jei w bus parinkta paskutinė, gali tekti atlikti (n 1) algoritmo žingsnį. Anksčiau pateiktame pavyzdyje trumpiausią kelią iki v 5 randame penktame žingsnyje, o iki v 4 antrajame: p = (v 1, v 3, v 4 ), p = 65.

Dijkstros algoritmo teisingumas ir sudėtingumas Dijkstros algoritmas yra godusis algortimas. Tačiau yra įrodyta, kad jis randa tikslųjį sprendinį (trumpiausius kelius), t.y. tai tikslusis algoritmas. Pabrėšime, kad Dijkstros algoritmas taikomas tik tada, kai briaunų svoriai yra neneigiami. Jei yra briaunų su neigiamais svoriais taikomas Bellman-Fordo algoritmas. Vykdydami Dijkstros algoritmą, (6) ciklą kartojame ( V 1) kartą. Kiekvienoje ciklo iteracijoje randame aibės Q viršūnę, iki kurios kelio ilgis yra trumpiausias: (7) operacija. Jos sudėtingumas priklauso nuo duomenų struktūros, realizuojančios aibę Q. Jei naudojame masyvą, tai O( Q ) veiksmų. Iš viso - O( V 2 ) veiksmų. Kiekviena grafo briauna (10) cikle analizuojama tik vieną kartą, todėl čia atliekame O( E ) veiksmų. Taigi bendra skaičiavimų apimtis yra O( V 2 + E ) = O( V 2 ) veiksmų (čia E < 1 2 V 2 ).

Dijkstros algoritmo modifikacijos Jeigu grafo G gretimumo matrica yra reta (kaip dažnai būna taikomuosiuose uždaviniuose), tai E = m V, m V. Tada pagrindinė skaičiavimų dalis tenka trumpiausio kelio paieškai aibėje Q. Šį uždavinį galima išspręsti efektyviau, kai Q yra piramidė (heap). Net su piramidės formavimo ir jos struktūros tvarkymo kiekvienoje ciklo iteracijoje sąnaudomis šio uždavinio sprendimo apimtis yra O( V log V ) veiksmų. Taip modifikuoto Dijkstros algoritmo sudėtingumas O( V log V + E ) veiksmų.

4-ojo uždavinio sprendimas Sprendžiant 4-ąjį uždavinį, kai reikia rasti trumpiausius kelius tarp visų įvertintojo grafo G viršūnių porų, galima kartoti Dijkstros algoritmą n kartų su vis kita pradine viršūne. Tokio algoritmo sudėtingumas (skaičiavimų apimtis) priklausomai nuo naudojamos Dijkstros algoritmo modifikacijos yra O( V 3 ) arba O ( V 2 log V + V E ). Skaičiavimo eksperimentai rodo, kad kai grafas yra artimas pilnam, 4 uždavinys greičiau išsprendžiamas Floido (Floyd) algoritmu, kuris gaunamas dinaminio programavimo metodu. Teorinis Floido algoritmo sudėtingumo įvertis yra toks pat - O( V 3 ).

5 uždavinys. Šis uždavinys dažnai pasitaiko planuojant komunikacinius tinklus, pavyzdžiui, kompiuterinį tinklą, jungiantį visus įstaigos kompiuterius. Tokį tinklą vaizduojame grafu, kurio viršūnių aibę V sudaro asmeniniai kompiuteriai, darbo stotys ir serveriai, o briaunų aibę E sudaro jungtys, jungiančios šiuos kompiuterius. Aišku, konstruojamas grafas turi būti jungusis, tik tada visi darbuotojai galės keistis informacija. Taip pat siekiame, kad komunikacinių linijų kaina būtų minimali, todėl reikia mažinti grafo briaunų skaičių. Tam, kad formaliai suformuluotume 5 uždavinį, turime apibrėžti medžio, dengiančio medžio ir pagaliau minimalaus dengiančio medžio sąvokas.

Medis yra jungusis grafas, kuriame nėra ciklų. Aptarsime kai kurias medžių savybes, kurios ir charakterizuoja šią struktūrą. Teorema. Tegul v ir w yra skirtingos medžio viršūnės, tada egzistuoja vienintelis paprastas jas jungiantis kelias. Įrodymas. Tarkime priešingai, kad egzistuoja du skirtingi keliai, jungiantys v ir w. Tada gauname, kad grafo briaunos sudaro ciklą, bet taip būti negali, nes grafas yra medis. Teorema. Medis, kuriame yra n viršūnių, turi (n 1) briauną. Įrodymas. Jei turime tik vieną viršūnę, tai briaunų aibė yra tuščia. Pridėdami papildomą briauną, turime pridėti ir naują viršūnę, nes priešingu atveju gausime ciklą.

Tegul G = (V, E) yra jungusis grafas. Grafo G dengiančiuoju medžiu (angl. spanning tree) vadinsime medį T = (V, E ), kurio briaunų aibė E yra grafo G briaunų aibės poaibis, t. y. E E. Aišku, kad grafo dengiantysis medis nebūtinai yra vienintelis. Yra daug algoritmų, leidžiančių sukonstruoti dengiančiuosius medžius. Pavyzdžiui, pasirenkame bet kurią grafo G viršūnę. Kadangi grafas yra jungusis, tai randame naują viršūnę, sujungtą briauna su viena iš jau parinktų viršūnių. Šį ciklą kartojame tol, kol parenkame visas n viršūnes. Visų grafą G = (V, E) dengiančių medžių briaunų skaičius yra vienodas - V 1. Tačiau, kai grafas yra įvertintasis (svertinis), dengiančių medžių kainą gali smarkiai skirtis.

5 uždavinys. Rasti įvertintuojo grafo G minimalų dengiantįjį medį T, t. y. medį, kurio bendrasis briaunų svoris (kaina) W (T) yra mažiausias, čia W (T) = e E w(e). a) b) c) pav.: Dengiančiųjų medžių pavyzdžiai: a) grafas G, b) dengiantysis medis W (T) = 54, c) minimalus dengiantysis medis W (T) = 38

Minimalaus dengiančiojo medžio radimas Vienas iš populiariausių šio uždavinio sprendimo algoritmų yra Primo (R.C. Prim) algoritmas. Šis algoritmas naudoja godžiąją strategiją. Tačiau yra įrodyta, kad šis godusis algoritmas yra tikslus, t.y. jis randa minimalų dengiantį medį. Algoritmo idėja labai paprasta kiekvienu žingsniu randame grafo G = (V, E) trumpiausią briauną e = (u, v) E, jungiančią vieną iš jau parinktų minimalaus dengiančiojo medžio viršūnių u U su viena iš likusių grafo viršūnių v V \ U. Tada briauną e įtraukiame į medį T = (U, B). Taip tęsiame, kol įtrauksime į medį visas grafo viršūnes.

Primo algoritmas Apibrėžkime aibę briaunų, jungiančių aibės U viršūnes su likusiomis grafo G = (V, E) viršūnėmis D = { e E : e = (u, v), u U, v V \ U }. Prim () // Primo algoritmas begin (1) U = {v 1 V }, B = ; // pradinė viršūnė nesvarbi (2) while ( U < V ) do (3) Randame briauną e = (u, v): w(e) = min z D w(z); (4) U := U {v}, B := B e; // auginame medį T = (U, B) end do end Prim Primo algoritmo skaičiavimų apimtis iš esmės priklauso nuo duomenų struktūrų, kuriose saugome informaciją apie grafą G ir minimalų dengiantįjį medį T. Naudojant gretimumo matricas algoritmo sudėtingumas yra O( V 2 ).

a) b) c) d) e) f) g) h) Minimalaus dengiančiojo medžio radimas Primo algoritmu: a) pradinis grafas, h) minimalaus dengiančiojo medžio pomedis po kiekvieno algoritmo žingsnio. Riebiu šriftudoc. pažymėti dr. Vadimas svoriai Starikovičius tų nepasirinktų Algoritmų briaunų, analizės kurios specialieji nagrinėjamos skyriai eiliniu b

(KPU) KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Turime n miestų, kurie sudaro grafo G = (V, E) viršūnių aibę V = {v i : 1 i n}. Kai kurie miestai yra sujungti keliais, ir žinome atstumus tarp šių miestų. Keliai sudaro grafo G briaunų aibę: E = {e ij : e ij = (v i, v j ), 1 i, j n}. Pažymėkime w(e ij ) = (v i, v j ) kelio, jungiančio viršūnes v i ir v j, ilgį. Dažnai grafo briaunų matricą saugoma suspaustu formatu. Jeigu naudojama pilna matrica, tai, jei du miestai v i ir v j nėra sujungti keliu, patogu apibrėžti w(e ij ) =. Uždavinys. Pirklys, išėjęs iš pirmo miesto, turi aplankyti visus miestus ir grįžti į pradinį miestą. Į kiekvieną miestą jis gali patekti tik vieną kartą. Tokį kelią p = {v 1, w 2, w 3,..., w n, v 1 }, w j = v ij vadiname maršrutu. Reikia rasti trumpiausią maršrutą.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Jeigu grafas G yra neorientuotas, tai toks keliaujančio pirklio uždavinys vadinamas simetriniu, priešingu atveju uždavinys vadinamas nesimetriniu. Laikysime, kad bent vienas maršrutas visada egzistuoja, nors nežinome nė vienos paprastos pakankamosios sąlygos, kuri tai garantuotų. Aišku, toks maršrutas tikrai egzistuoja, jei grafas yra pilnasis, t. y. visos jo viršūnės yra sujungtos tarpusavyje briaunomis. yra atskiras atvejis bendresnio uždavinio apie Hamiltono maršrutų radimą.

Hamiltono maršrutai KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Maršrutas, apeinantis visas grafo višūnes po vieną kartą, vadinamas Hamiltono maršrutu. Jei pradinė ir galinė maršruto viršūnės sutampa, toks maršrutas vadinamas Hamiltono ciklu. Grafas, turintis bent vieną Hamiltono maršrutą, vadinamas Hamiltono grafu. Norėdami įrodyti, kad grafas yra Hamiltono, turime rasti bent vieną maršrutą. Dažnai sprendžiamas ir sudėtingesnis uždavinys ieškomi visi Hamiltono maršrutai. Tada, suradę visus ciklus, nesunkiai išsprendžiame keliaujančio pirklio uždavinį. Pažymėsime, kad nors visų maršrutų radimo uždavinys atrodo sudėtingesnis už Hamiltono grafo sąlygos tikrinimą (t. y. vieno maršruto paiešką), tačiau abiejų uždavinių sudėtingumas gali būti toks pat, kai grafe nėra nė vieno maršruto.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Pilnas variantų perrinkimas paprastu algoritmu Paprasčiausias būdas, kaip rasti visus Hamiltono ciklus, generuoti visus skirtingus viršūnių išdėstymo būdus p = {v 1, w 2, w 3,..., w n, v 1 }, w j = v ij ir patikrinti, kurie iš jų apibrėžia maršrutą, t. y. egzistuoja visos briaunos (v 1, w 2 ) E, (w i, w i+1 ) E, i = 2,..., n 1, (w n, v 1 ) E. Tikrinimo metu naudojame grafo viršūnių gretimumo matricą. Jeigu sprendžiame keliaujančio pirklio uždavinį, tai šiuo etapu apskaičiuojame ir gauto maršruto ilgį. Tarkime, kad naują viršūnių kombinaciją randame, atlikę O(1) veiksmų. Iš viso skirtingų variantų yra (n 1)!. Tikrindami, ar viršūnių kombinacija sudaro maršrutą, nagrinėjame n briaunų svorius, todėl visus variantus perrenkame atlikę (( n ) n+1/2 ) O(n!) = O veiksmų. e

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Pilnas variantų perrinkimas paieškos gilyn algoritmu Pateiktajame variantų perrinkimo algoritme neatsižvelgta į tai, kad daugumos taikymų sprendžiamų uždavinių grafo viršūnių gretimumo matrica yra reta. Tada galima smarkiai sumažinti nagrinėjamų kelių skaičių. Tarkime, kad grafo viršūnių kaimynų skaičius neviršyja m. Tada skirtingų ciklų yra ne daugiau nei O(m n ). Aišku, kad ir šiuo atveju keliaujančio pirklio uždavinio sprendimo algoritmas yra nepolinominio sudėtingumo. Visus variantus (skirtingus kelius) generuosime paieškos gilyn algoritmu. Šios paieškos strategija yra paprasta: iš duotosios viršūnės einame į jai gretimą, paieškos metu dar neaplankytą grafo viršūnę. Jei tokių viršūnių nėra, tai žengiame vieną žingsnį atgal ir ieškome naujo kelio iš tėvo viršūnės.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Kiekviena grafo viršūnė gali būti vienoje iš dviejų būsenų (būsenas žymėsime skirtingomis spalvomis). Pradžioje visos viršūnės yra neaplankytos ir dažomos balta spalva. Kai viršūnė v aplankoma, ji tampa nenauja ir dažoma pilka spalva. Kai išimame paskutinę viršūnę, patikriname ar gavome ciklą. Po to ši viršūnė vėl nudažoma balta spalva. Todėl ji vėl gali būti lankoma paieškos metu (ieškant kitą kelią). Šitaip randame visus skirtingus kelius. Paieškos kelius įsimename masyve π, jo elemento π(v) reikšmė yra viršūnė u, iš kurios atėjome į v.

Ciklų radimas paieškos gilyn algoritmu KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Ciklai (G) begin (1) for all ( v V ) do (2) spalva(v) = balta; (3) π(v) = NULL; end do (4) t = 1, spalva(v 1 ) = pilka; (6) Visit(v 1 ); end Ciklai Visit (u) begin (1) if ( t == ( V ) then (2) if (u, v1) E ) then (3) π(v 1) = u; (4) printciklas(π); end if (5) else ( ) (6) for all ( v N (u) do ) (7) if spalva(v) == balta then (8) t := t + 1, spalva(v) = pilka; (9) π(v) = u, Visit(v); end if end do end if (11) t := t 1, spalva(u) = balta; end Visit

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Keliaujančio pirklio uždavinio euristiniai sprendimo algoritmai Dažnai užtenka apskaičiuoti pakankamai gerą trumpiausio maršruto artinį, tačiau jį norime rasti labai greitai. Tokiu atveju naudojami euristiniai šio uždavinio sprendimo algoritmai. Susipažinsime su keliais euristiniais algoritmais, kuriuos sudarysime naudodami godžiųjų algoritmų strategiją. Pirmajame algoritme pradedami nuo kažkurios grafo viršūnės, pastoviai renkamės iš dar neaplankytų viršūnių pačią artimiausią (su kuo mažesniu briaunos svoriu). Kai nebelieka neaplankytų viršūnių grįžtame į pradinę. Šis algoritmas dažnai vadinamas artimiausio kaimyno algoritmu.

Artimiausio kaimyno algoritmas KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Priminsime, kad N (v) žymi viršūnės v kaimynų aibę. double GS (u) begin (1) Q = V / {u}, S = {u}, L= 0, v= u; (2) while Q ) ( do (3) for all vj Q N(v) ) do (4) Rasti v : w(v, v ) w(v, v j); end do (5) Q := Q / {v }, S := S {v }; (6) L := L + w(v, v ), v= v ; end do (7) L := L + w(v, u); (8) return (L); end GS GS algoritmo sudėtingumas O( V + E ), taigi turint net ir pilnąjį grafą, algoritmas yra kvadratinio sudėtingumo O( V 2 ).

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Pirklio maršruto sudarymas GS algoritmu a) L = 0 b) L = 2 c) L = 6 d) L = 9 e) L = 10 f) L = 18

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Artimiausio kaimyno algoritmo tikslumo įvertis Pažymėkime maršruto, apskaičiuoto GS algoritmu, ilgį L n (GS), o optimalaus maršruto ilgį L n. Teorema. Tegul C yra n n dydžio matrica, apibrėžianti atstumus tarp miestų. Tarsime, kad matrica yra simetrinė, t. y. c ij = c ji ir atstumai tenkina trikampio nelygybę c ij c ik + c kj, 1 i, j, k n. Tada teisingas toks maršruto, apskaičiuoto GS algoritmu, ilgio įvertis: L n (GS) 1 2( log n + 1 ) Ln.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Akivaizdu, kad godusis GS algoritmas randa tik optimalaus maršruto artinį. Nesunku pastebėti, kad GS algoritmo randamas artinys priklauso nuo pradinės viršūnės pasirinkimo. Todėl sudarome sudėtingesnę euristiką, kai GS algoritmu V kartų ieškome pirklio maršruto, pradėdami vis iš kitos grafo viršūnės ir atrinkdami trumpiausią. double GS2 () begin (1) L= ; ( ) (2) for all v V do (3) LN = GS(v); (4) if ( LN < L ) L = LN; end do (5) return (L); end GS2 GS2 algoritmo sudėtingumas O( V 2 + V E ), taigi turint pilnąjį grafą, algoritmas yra kubinio sudėtingumo O( V 3 ). Tačiau net ir turėdami tūkstantį viršūnių maršrutą apskaičiuojame per kelias sekundes.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Lentelėje pateikti rezultatai, gauti pilnojo perrinkimo metodu, randančiu optimalųjį maršrutą, ir euristiniais algoritmais GS ir GS2. Čia n žymi miestų skaičių, T yra pilnojo perrinkimo algortmo vykdymo laikas sekundėmis. Stulpeliuose PP, GS2 ir GS pateikti maršrutų ilgiai. n T PP GS2 GS 10 0,12 482 482 486 11 1,35 539 574 574 12 15,9 661 737 756 13 202 694 763 816 14 2773 694 775 775 Matome, kad pilnojo perrinkimo algoritmo skaičiavimo laikas kiekvieną kartą padidėja n kartų, todėl optimalaus maršruto skaičiavimas 15 miestų grafe jau užtruktų net 11 valandų. Tik turėdami 10 miestų GS2 algoritmu radome optimalų maršrutą, kitais atvejais gavome artinius.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu KPU sprendimas dinaminio programavimo metodu Pilnojo variantų perrinkimo pagrindinis trūkumas tas, kad daug kartų nagrinėjame tuos pačius maršruto poaibius. Prisiminkime, kad tai yra vienas iš požymių (sąlygų), kai taikytinas dinaminio progromavimo metodas: 1 Jei uždavinio sprendimo metu generuojamos užduočių aibės esmingai persidengia, tai įsimename jau spręstų užduočių sprendinius ir sprendžiame tik naujus uždavinius. 2 Uždavinys tenkina Belmano (arba variacinę optimalumo) sąlygą, kad optimalus sprendinys yra sudarytas (gaunamas) iš atskirų mažesnių užduočių optimalių sprendinių. Ši sąlyga užrašoma rekurentinės lygybės forma ir ji smarkiai sumažina nagrinėjamų variantų skaičių. Gaukime šią sąlygą keliaujančio pirklio uždavinio sprendiniui.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Pirklio maršrutas yra uždaroji ciklinė kreivė, todėl galime ją pradėti nagrinėti nuo bet kurios viršūnės. Tarkime, kad tai yra v 1 viršūnė. Jei optimaliame maršrute pirmiausia einame į v k viršūnę, tai gauname naują uždavinį: Reikia rasti trumpiausią kelią nuo v k iki v 1, kai kiekvieną aibės V \ {v 1, v k } viršūnę aplankome po vieną kartą. Tegul S V yra aibės V viršūnių poaibis. Pažymėkime g(k, S) funkciją, kuri apibrėžia ilgį trumpiausio kelio, einančio iš v k iki v 1, kai aplankome po vieną kartą kiekvieną aibės S viršūnę. Tada, spręsdami keliaujančio pirklio uždavinį, ieškome funkcijos g ( 1, V \ {v 1 } ) reikšmės. Jei pirmoji optimalaus ciklo atkarpa yra (v 1, v k ), tai g ( 1, V \ {v 1 } ) = w(v 1, v k ) + g ( k, V \ {v 1, v k } ), čia w(v i, v k ) pažymėjome atkarpos (v 1, v k ) ilgį.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Kadangi mes, aišku, nežinome, kuri viršūnė v k bus aplankyta pirmoji, todėl gauname variacinę lygybę g ( 1, V \ {v 1 } ) ( = min w(v1, v k ) + g ( k, V \ {v 1, v k } )). 2 k n Taigi, jei žinotume visų mažesnių uždavinių g ( k, V \ {v 1, v k } ), k = 2,..., n sprendinius, tai nesunkiai galėtume rasti ir keliaujančio pirklio uždavinio sprendinį. Šią strategiją taikome rekursyviai mažesnės apimties uždaviniams, gauname pagrindinę variacinę optimalumo sąlygą g ( i, S ) ( = min w(vi, v k ) + g ( k, S \ {v k } )). v k S Rekursijos pabaiga yra triviali: g ( i, ) = w(v i, v 1 ).

KPU dinaminio programavimo algortimas KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Spręsdami KPU dinaminio programavimo metodu pirmiausia apskaičiuojame visas g ( i, ) reikšmes. Paskui apskaičiuojame visas g ( i, {v k } ) reikšmes. Šį procesą tęsiame tol, kol randame uždavinio sprendinį g ( 1, V \ {v 1 } ). Mums svarbus ne tik trumpiausio ciklo ilgis, bet ir pats maršrutas, todėl visada įsimename numerį tos viršūnės v k S, kuri suteikia minimalią reišmę funkcijai g ( i, S ). Kadangi iš anksto nežinome optimalaus maršruto, tenka apskaičiuoti visų pagalbinių mažesnių uždavinių sprendinius. Tačiau skirtingai nuo pilnojo variantų perrinkimo išvengiame pasikartojančių kelio atkarpų analizės. Kokia kaina? Eksperimentai, atlikti su atsitiktinai generuotais grafais, parodė, kad tokio algoritmo sudėtingumas O(n 2 2 n ), t. y. nagrinėjamų variantų skaičius yra daug mažesnis už bendrą variantų skaičių n!.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Optimalaus KPU maršruto radimas dinaminio programavimo metodu Nagrinėkime orientuotąjį pilnąjį grafą G, kuris apibrėžia kelių ilgius tarp penkių miestų. Kelių ilgiai yra tokie: 0 12 8 16 23 9 0 14 16 13 S = 15 13 0 24 14. 7 20 16 0 14 21 12 28 12 0 Tarsime, kad pirklys pradeda savo kelionę iš pirmosios viršūnės (optimalus ciklas, aišku, nepriklauso nuo šio pasirinkimo). Atkarpos (v i, v k ) ilgį žymėsime c ik. Pirmiausia randame g(i, ) = c i1 reikšmes g(2, ) = 9, g(3, ) = 15, g(4, ) = 7, g(5, ) = 21.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Toliau apskaičiuojame funkcijos g ( i, {v k } ) reikšmes, t.y. nagrinėjame maršrutus iš viršūnės v i iki v 1, kai pakeliui aplankome vieną viršūnę v k. Remdamiesi variacine optimalaus ciklo sąlyga, gauname lygybę g ( i, {v k } ) = c ik + g(k, ) = c ik + c k1, i 1, k 1, i. g ( 2, {v 3 } ) = 14 + 15 = 29, g ( 2, {v 4 } ) = 23, g ( 2, {v 5 } ) = 34, g ( 3, {v 2 } ) = 13 + 9 = 22, g ( 3, {v 4 } ) = 31, g ( 3, {v 5 } ) = 35, g ( 4, {v 2 } ) = 20 + 9 = 29, g ( 4, {v 3 } ) = 31, g ( 4, {v 5 } ) = 35, g ( 5, {v 2 } ) = 12 + 9 = 21, g ( 5, {v 3 } ) = 43, g ( 5, {v 4 } ) = 19. Toliau nagrinėjame maršrutus, kurie aplanko du tarpinius miestus g ( i, {v j, v k } ) = min ( c ij + g ( j, {v k } ), c ik + g ( k, {v j } )). Priminsime, kad turime saugoti ne tik optimalių maršrutų ilgius, bet ir pačius maršrutus.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu g ( 2, {v 3, v 4 } ) = min(14 + 31, 16 + 31) = 45, {v 2, v 3, v 4, v 1 }, g ( 2, {v 3, v 5 } ) = min(14 + 35, 13 + 43) = 49, {v 2, v 3, v 5, v 1 }, g ( 2, {v 4, v 5 } ) = min(16 + 35, 13 + 19) = 32, {v 2, v 5, v 4, v 1 }, g ( 3, {v 2, v 4 } ) = min(13 + 23, 24 + 29) = 36, {v 3, v 2, v 4, v 1 }, g ( 3, {v 2, v 5 } ) = min(13 + 34, 14 + 21) = 35, {v 3, v 5, v 2, v 1 }, g ( 3, {v 4, v 5 } ) = min(24 + 35, 14 + 19) = 33, {v 3, v 5, v 4, v 1 }, g ( 4, {v 2, v 3 } ) = min(20 + 29, 16 + 22) = 38, {v 4, v 3, v 2, v 1 }, g ( 4, {v 2, v 5 } ) = min(20 + 34, 14 + 21) = 37, {v 4, v 5, v 2, v 1 }, g ( 4, {v 3, v 5 } ) = min(16 + 35, 14 + 43) = 51, {v 4, v 3, v 5, v 1 }, g ( 5, {v 2, v 3 } ) = min(12 + 29, 28 + 22) = 41, {v 5, v 2, v 3, v 1 }, g ( 5, {v 2, v 4 } ) = min(12 + 23, 12 + 29) = 35, {v 5, v 2, v 4, v 1 }, g ( 5, {v 3, v 4 } ) = min(28 + 31, 12 + 31) = 43, {v 5, v 4, v 3, v 1 }.

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Kitu žingsniu nagrinėjame maršrutus iš v i iki v 1, kurie eina per tris tarpinius miestus: g ( i, {v j, v k, v l } ) = min { c ij + g ( j, {v k, v l } ), c ik + g ( k, {v j, v l } ), Gauname tokius optimalius maršrutus ir jų ilgius: c il + g ( l, {v j, v k } )}. g ( 2, {v 3, v 4, v 5 } ) = min( 47, 67, 56 ) = 47, {v 2, v 3, v 5, v 4, v 1 }, g ( 3, {v 2, v 4, v 5 } ) = min( 45, 61, 49 ) = 45, {v 3, v 2, v 5, v 4, v 1 }, g ( 4, {v 2, v 3, v 5 } ) = min( 69, 51, 55 ) = 51, {v 4, v 3, v 5, v 2, v 1 }, g ( 5, {v 2, v 3, v 4 } ) = min( 57, 64, 50 ) = 50, {v 5, v 4, v 3, v 2, v 1 }. Turėdami šią informaciją, apskaičiuojame optimalų ciklą, kuriuo keliaudamas, pirklys greičiausiai apvažiuos visus miestus: g ( 1, {v 2, v 3, v 4, v 5 } ) { = min c1j + g ( j, {v 2, v 3, v 4, v 5 } \ {v j } )}. 2 j 5

KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Tokio ciklo ilgis yra g ( 1, {v 2, v 3, v 4, v 5 } ) = min( 59, 53, 67, 73 ) = 53, o pats ciklas (optimalus keliaujančio pirklio maršrutas) apibrėžiamas taip { v 1, v 3, v 2, v 5, v 4, v 1 }.

KPU sprendimas šakų ir rėžių metodu KPU euristiniai sprendimo algoritmai KPU sprendimas dinaminio programavimo metodu Pagrindinis tikslas sudarant tiksliuosius algoritmus yra sumažinti nagrinėjamų variantų, t.y. atliekamų veiksmų skaičių. Šakų ir rėžių metodo idėja kuo anksčiau išsiaiškinti, kurie maršrutų variantai negali būti optimaliu sprendiniu, ir jų iki galo nenagrinėti. Tam naudojama jau turima informacija apie optimalų sprendinį. Pagal šakų ir rėžių metodą keliaujančio pirklio uždaviniui yra apibrėžiami skaidymo žingsnis, apatinio ir viršutinio rėžių apskaičiavimas, viršūnės išrinkimo taisyklė. Eksperimentai, atlikti su atsitiktinai generuotais grafais, parodė, kad tokio algoritmo sudėtingumas O(1, 26 n ), t. y. šakų ir rėžių algoritmas yra gerokai efektyvesnis už dinaminio programavimo algoritmą.