В начале 19 века геометр из Берлина Якоб Штейнер nustatyti užduotį, kaip prijungti tris kaimus, kad jų ilgis būtų trumpiausias. Vėliau jis apibendrino šią problemą: reikia rasti tašką plokštumoje, kad atstumas nuo jo iki kitų taškų būtų mažiausias. XX amžiuje ši tema tęsėsi. Buvo nuspręsta imtis kelių punktų ir sujungti juos taip, kad atstumas tarp jų būtų trumpiausias. Visa tai yra ypatingas nagrinėjamos problemos atvejis.
Greedy algoritmai
„Kraskal“ algoritmas priklauso „gobšiems“ algoritmams(jie taip pat vadinami gradientu). Jų esmė - didžiausias pelnas kiekviename žingsnyje. Ne visada „gobšus“ algoritmai suteikia geriausią problemos sprendimą. Yra teorija, kuri rodo, kad, pritaikius konkrečias užduotis, jie suteikia optimalų sprendimą. Tai yra matroidų teorija. Kraskalio algoritmas nurodo tokias problemas.
Rasti minimalų svorio rėmelį
Aptariamas algoritmas sukurtas optimaliaikadro grafikas. Problema yra tokia. Pateikiamas netiesioginis grafikas be kelių kraštų ir kilpų, o jo kraštų rinkinyje nurodoma svorio funkcija w, kuri priskiria kiekvieną kraštą e skaičių - krašto svorį - w (e). Kiekvieno pogrupio svoris nuo briaunų rinkinio nustatomas pagal jo kraštų svorį. Reikia rasti mažiausio svorio skeletą.
Aprašymas
Kraskalio algoritmas veikia taip.Pirma, visi pradinio grafiko kraštai išdėstyti didėjančių svorių tvarka. Iš pradžių sistema neturi jokių briaunų, bet apima visas grafiko viršūnes. Po kito algoritmo žingsnio į jau sukonstruotą rėmo dalį, kuri yra spiningas miškas, pridedamas vienas kraštas. Jis nėra pasirinktas savavališkai. Visi grafiko kraštai, nepriklausantys rėmui, gali būti vadinami raudona ir žalia. Kiekvienos raudonos briaunos viršūnės yra vienoje statomo miško jungties sudedamojoje dalyje, o žalios viršūnės yra skirtingos. Todėl, jei ten pridedame raudoną kraštą, pasirodys ciklas, o jei jis yra žalias, po šio etapo gautame miške jungiamumo komponentai bus mažesni už vieną. Taigi prie gautos konstrukcijos negalima pridėti raudonos spalvos krašto, tačiau, norint gauti mišką, galima pridėti bet kokį žalią kraštą. Ir pridėkite žalią kraštą su minimaliu svoriu. Rezultatas yra mažiausio svorio rėmas.
Įgyvendinimas
Pažymėkite dabartinį mišką F.Diagramos viršūnių rinkinys suskaidomas į susietus domenus (jų sąjungos formos F, ir jos nesiskiria poromis). Raudonuosiuose kraštuose abi viršūnės yra vienoje dalyje. Dalis (x) yra funkcija, kuri kiekvienai vertex x grąžina tos dalies, kuriai priklauso x, pavadinimą. Unite (x, y) yra procedūra, kuria sukuriamas naujas skaidinys, susidedantis iš x ir y dalių ir visų kitų dalių derinimo. Leiskite n būti grafiko kraštų skaičius. Visos šios sąvokos yra įtrauktos į „Kraskal“ algoritmą. Įgyvendinimas:
Rūšiuoti visus grafiko kraštus nuo 1 iki n. Didėjančia tvarka. (ai, bi yra krašto viršūnės su skaičiumi i).
i = 1 iki n.
x: = dalis (ai).
y: = dalis (bi).
Jei x nėra lygus y, tada Unite (x, y), įtraukite kraštą i F.
Teisingumas
Leiskite T būti originalaus grafiko, pastatyto naudojant Kraskal algoritmą, skeletu, ir S jo savavališką skeletą. Būtina įrodyti, kad w (T) neviršija w (S).
Leiskite M būti kraštų S, P kraštų rinkiniuT. Jei S yra ne lygus T, tada yra pagrindo T kraštas ir kraštas, kuris nepriklauso S. Join et to S. Suformuojamas ciklas, pavadinkime jį C. Pašalinkite bet kurį iš C, priklausančių S., mes gausime naują kadrą, nes kraštai, ir ten yra tiek daug smailių. Jo svoris neviršija w (S), nes w (et) yra ne didesnis kaip w (s) dėl Kraskal algoritmo. Mes pakartosime šią operaciją (kraštų S keitimas kraštais T) tol, kol gauname T. Kiekvieno gauto rėmo svoris yra ne didesnis už ankstesnio svorio, o tai reiškia, kad w (T) yra ne didesnis kaip w (S).
Be to, „Kraskal“ algoritmo teisingumas kyla iš „Rado-Edmonds“ matroidinės teoremos.
Kraskalio algoritmo taikymo pavyzdžiai
Pateiktas grafikas su viršūnėmis a, b, c, d, e ir briaunomis (a,b), (a, e), (b, c), (b, e), (c, d), (c, e), (d, e). Ribų svoriai pateikti lentelėje ir paveiksle. Iš pradžių F statomas miškas turi visus grafiko viršūnius ir neturi vieno krašto. Kruskalio algoritmas pirmiausia prideda kraštą (a, e), nes jis turi mažiausią svorį, o a ir e viršūnės yra skirtinguose miško F jungiamumo komponentuose (kraštas (a, e) yra žalias), tada kraštas (c, d), nes kad šis kraštas turi mažiausią svorio briaunų, nepriklausančių F, masę, ir jis yra žalias, taigi dėl tų pačių priežasčių pridedamas kraštas (a, b). Bet kraštas (b, e) yra praleistas, nors jis turi mažiausią likusių kraštų svorį, nes jis yra raudonas: b ir e viršūnės priklauso tai pačiai prijungtam miško F komponentui, tai yra, jei pridedate kraštą (F, b) iki F, ciklą. Tada pridedamas žalias kraštas (b, c), raudonasis kraštas (c, e) praleidžiamas, tada d, e. Taigi, nuosekliai pridedamos briaunos (a, e), (c, d), (a, b), (b, c). Juos sudaro optimalus pradinio grafiko rėmelis. Tokiu būdu algoritmas veikia šiuo atveju. Tapyta. Tai parodė pavyzdys.
Paveiksle parodyta diagrama, susidedanti iš dviejų sujungtų komponentų. Paryškintomis linijomis rodomi optimalaus karkaso (žalio) kraštai, pastatyti naudojant „Kruskal“ algoritmą.
Viršutiniame paveiksle pavaizduotas pradinis grafikas, o apatiniame - minimalus svorio griaučiai, sukonstruoti jam naudojant nagrinėjamą algoritmą.
Pridėtų kraštų seka: (1,6); (0,3), (2,6) arba (2,6), (0,3) - nesvarbu; (3.4); (0,1), (1,6) arba (1,6), (0,1) taip pat yra abejingas (5,6).
Kruskalio algoritmas yra praktiškai pritaikomas, pavyzdžiui, optimizuojant komunikacijų, kelių tiesimą kiekvienos šalies naujų gyvenviečių rajonuose, taip pat kitais atvejais.