Kruskal algoritmen - konstruktionen af det optimale skelet
I begyndelsen af det 19. århundrede var geometeret fra Berlin, Jacob Steinersætte opgaven med at forbinde de tre landsbyer, så deres længde var den korteste. Derefter generaliserede han dette problem: det er nødvendigt at finde et punkt på flyet, så afstanden fra den til n andre punkter var den mindste. I det 20. århundrede fortsatte arbejdet med dette emne. Det blev besluttet at tage flere punkter og forbinde dem på en sådan måde, at afstanden mellem dem var den korteste. Dette er alle et særligt tilfælde af problemet under undersøgelse.
Grådige algoritmer
Kruskal-algoritmen refererer til "grådige" algoritmer(de kaldes også gradient). Essensen af dem - den største vinder på hvert trin. Ikke altid "grådige" algoritmer giver den bedste løsning til opgaven. Der er en teori, der viser, at når de anvendes på specifikke problemer, giver de den optimale løsning. Dette er teorien om matroider. Kruskal-algoritmen vedrører sådanne problemer.
Finde skeletet af mindste vægt
Algoritmen under overvejelse konstruerer en optimalskeletet af grafen. Problemet med det er som følger. Der er givet en uregistreret graf uden flere kanter og sløjfer, og der er givet en vægtfunktion w, der tildeler hver kant e et tal - vægten af kanten - w (e). Vægten af hver delsæt af sæt af kanter bestemmes af summen af vægten af dets kanter. Det er nødvendigt at finde skelet af den mindste vægt.
beskrivelse
Kruskal-algoritmen virker som denne. For det første arrangeres alle kanter af den oprindelige graf i rækkefølge af stigende vægte. Indledningsvis indeholder rammen ikke nogen kanter, men indbefatter alle gradernes hjørner. Efter det næste trin i algoritmen tilføjes en kant til den allerede konstruerede del af rammen, som er en spænde skov. Det vælges ikke vilkårligt. Alle kanter af grafen, der ikke tilhører skeletet, kan kaldes rød og grøn. Kanten af hver rød ribbe er i en komponent af skovenes sammenhæng, der er bygget, og grøntens hjørner er i forskellige komponenter. Hvis du tilføjer en rød kant deraf, vises en cyklus, og hvis den grønne - i det resulterende skovtrin bliver forbindelseskomponenten mindre med en. Således kan der ikke tilføjes en rød kant til den resulterende konstruktion, men enhver grøn kant kan tilføjes for at få skoven. Og der tilføjes en grøn ribbe med en mindste vægt. Som et resultat opnås skeletet af den mindste vægt.
implementering
Angiv den nuværende skov F. Det opdeler graferne af graferne i tilsluttede domæner (deres foreningsformer F, og de krydser ikke parvis). De røde kanter har begge hjørner i en del. Del (x) er en funktion, der returnerer navnet på den del, som x tilhører for hvert hjerte x. Forene (x, y) er en procedure, der opbygger en ny partition bestående af foreningen af delene x og y og alle andre dele. Lad n være antallet af kanter af grafen. Alle disse begreber er inkluderet i Kruskal algoritmen. Implementering:
Arranger alle kanter af grafen fra 1. til nste stigende vægt. (ai, bi er kanten af kanten med indeks i).
for i = 1 til n gør.
x: = del (ai).
y: = Del (bi).
Hvis x ikke er lig med y, skal du forene (x, y) med kanten med tallet i i F.
korrekthed
Lad T være skeletet på den oprindelige graf konstrueret ved brug af Kruskal-algoritmen, og lad S være dets vilkårlig skelet. Det er nødvendigt at bevise at w (T) ikke overstiger w (S).
Lad M være sæt af kanter af S, P sæt af kanterT. Hvis S ikke er lig med T, er der en kant et slagtet T, som ikke tilhører S. S. et støder cyklussen, kaldes det C. C fjerne fra enhver kant es, der tilhører S. Vi får en ny ramme, fordi kanterne og der er så mange hjørner i den. Dens vægt ikke er større end w (S), idet w (et) ikke længere w (r) i en strøm Kruskal algoritme. Denne operation (substitutionsprodukter T S ribber på ribben) vil blive gentaget så længe modtage T. Vægten af hver efterfølgende modtagne ramme ikke er større end den foregående vægt, hvilket indebærer, at w (T) ikke er større end w (S).
Korrektheden af Kruskal-algoritmen følger også fra Rado-Edmonds sætning på matroider.
Eksempler på anvendelsen af Kruskal-algoritmen
Givet en graf med hjørner a, b, c, d, e og kanter (a,b), (a, e), (b, c), (b, e), (c, d), (c, e), (d, e). Vægterne af kanterne er vist i tabellen og i figuren. Indledningsvis indeholder konstruktionen af skoven F alle grader af grafen og indeholder ikke en enkelt kant. Algoritme Kruskal først tilføje ribben (a, e), da vægten havde den laveste, og de hjørner en og e er i forskellige komponenter tømmer tilslutningsmuligheder F (ribben (a, e) er grøn), så ribben (c, d), fordi at denne kant har den mindste vægt fra kanterne af grafen, der ikke tilhører F, og den er grøn, af samme grunde tilføjes en kant (a, b). Men kanten (b, e) er passeret, selv om han og den mindste vægt af de resterende kanter, fordi den er rød: de hjørner B og E tilhører samme komponent i skov tilslutningsmuligheder F, det vil sige, hvis vi tilføjer til F kanten (B, E), der dannes cyklus. Derefter tilføjes den grønne kant (b, c), den røde kant (c, e) springes over og derefter d, e. Kanterne (a, e), (c, d), (a, b), (b, c) tilsættes således i rækkefølge. Herved består det optimale skelet af den oprindelige graf. Sådan virker algoritmen i dette tilfælde Jeg farvede. Et eksempel viser dette.
Figuren viser en graf bestående af to konnektivitetskomponenter. Fede linjer viser kanterne af den optimale ramme (grøn), konstrueret ved brug af Kruskal-algoritmen.
Den øverste figur viser den oprindelige graf, og på den nederste - skeletet af minimumsvægten konstrueret til det ved hjælp af den betragtede algoritme.
Sekvensen af tilføjede kanter: (1.6); (0,3), (2,6) eller (2,6), (0,3) - betyder ikke noget; (3,4); (0,1), (1,6) eller (1,6), (0,1), er ligegyldigt (5,6).
Kruskals algoritme finder praktisk anvendelse, for eksempel at optimere kommunikationspuder, veje i nye kvarterer i hvert lands lokaliteter og også i andre tilfælde.