/ / Kruskalov algoritam - izgradnja optimalnog kostura

Kruskalov algoritam - izgradnja optimalnog kostura

Početkom 19. stoljeća, geometri iz Berlina, Jacob Steinerpostavili zadatak kako spojiti tri sela tako da njihova duljina bude najkraća. Nakon toga, generalizirao je taj problem: potrebno je pronaći točku na ravnini tako da je udaljenost od nje do n drugih točaka bila najmanja. U 20. stoljeću nastavlja se rad na ovoj temi. Odlučeno je uzeti nekoliko točaka i povezati ih na takav način da je udaljenost između njih bila najkraća. Ovo je poseban slučaj problema koji se istražuje.

Pohlepni algoritmi

Kruskalov algoritam odnosi se na "pohlepni" algoritmi(oni se također nazivaju gradijentom). Bit onih - najveća pobjeda na svakom koraku. Ne uvijek "pohlepni" algoritmi daju najbolje rješenje zadatku. Postoji teorija koja pokazuje da se, kada se primjenjuju na specifične probleme, pružaju optimalno rješenje. Ovo je teorija matroida. Kruskalov algoritam se odnosi na takve probleme.

Pronalaženje kostura minimalne težine

Algoritam koji se razmatra konstruira optimalnokostur grafikona. Problem je u tome što slijedi. Prikazan je neizravni grafikon bez višestrukih rubova i petlji, a na njemu se nalazi rubna funkcija w koja svakom rubu dodjeljuje broj - težinu ruba - w (e). Težina svakog podskupa skupova rubova određuje se zbrojem težina njegovih rubova. Potrebno je pronaći kostur od najmanje težine.

opis

Kruskalov algoritam ovako funkcionira. Prvo, svi rubovi izvornog grafikona su poredani po porastu težine. U početku, okvir ne sadrži rubove, ali uključuje sve vrhove grafikona. Nakon sljedećeg koraka algoritma, jedan rub se dodaje već izgrađenom dijelu okvira, koji je šumska širina. Nije izabrano samovoljno. Svi rubovi grafikona koji ne pripadaju kosturu mogu se nazvati crveno i zeleno. Vrhovi svake crvene rebra su u jednoj komponenti povezanosti šume koja se gradi, a vrhovi zelenog su u različitim komponentama. Stoga, ako dodate crvenu rubu, pojavit će se ciklus, a ako zeleni - u rezultiranom koraku šume, komponenta povezivanja bit će manja za jedan. Dakle, ne može se dodati crveni rub u dobivenu konstrukciju, ali se može dodati bilo koji zeleni rub kako bi se dobila šuma. I dodaje se zeleni rebro s minimalnom težinom. Kao rezultat, dobiva se skelet s najmanjom težinom.

izvršenje

Označite postojeću šumu F. Razdvori skup vertica grafikona u povezane domene (njihovi sindikalni oblici F, a ne presijecaju se u parovima). Crveni rubovi imaju oba vrha u jednom dijelu. Dio (x) je funkcija koja vraća naziv dijela kojem x pripada za svaki vrh x. Unite (x, y) je postupak koji gradi novu particiju koja se sastoji od sjedinjenja dijelova x i y i svih ostalih dijelova. Neka n bude broj rubova grafikona. Svi ti pojmovi su uključeni u algoritam Kruskal. provedba:

  1. Rasporedite sve rubove grafikona od prvog do nultih uzlaznih utega. (ai, bi su vrhovi ruba s indeksom i).

  2. za i = 1 do n.

  3. x: = Dio (ai).

  4. y: = Dio (bi).

  5. Ako x nije jednak y, zatim Unite (x, y), uključite rub s brojem i u F.

ispravnost

Neka T bude kostur izvornog grafikona konstruiranog korištenjem algoritma Kruskal, i neka S bude njegov proizvoljni kostur. Potrebno je dokazati da w (T) ne prelazi w (S).

Neka M bude skup rubova S, P skup rubovaT. Ako S nije jednak T, tada je rub i trup T, ne pripadaju S. S. et graničiti ciklus, to se zove C C ukloniti iz svih rubnih es, pripadaju S. Dobiveno novi okvir jer rubova i u njemu ima onoliko vrhova. Njegova težina nije veća od w (S), budući w (et) više ne w (e) u električnu Kruskal algoritam. Ovaj postupak (T S zamjena rebra na rebrima) se ponavlja sve dok se dobiti T. težinu svakog sljedećeg primljene okvira nije veća od prethodne težine, što pokazuje da masa (T) nije veća od w (S).

Također, ispravnost algoritma Kruskal slijedi iz Rado-Edmondsovog teorema na matroidima.

Primjeri primjene algoritma Kruskal

Kraskalov algoritam

S obzirom na grafikon s vrhovima a, b, c, d, e i rubovima (a,b), (a, e), (b, c), (b, e), (c, d), (c, e), (d, e). Težine rubova prikazane su u tablici i na slici. U početku, izgradnja šume F sadrži sve vrhove grafikona i ne sadrži niti jedan rub. Algoritam Kruskal najprije dodati rebro (a, e), budući da težina imao najmanji, a vrhovi A i E su u različite dijelove drvo povezivanja F (rebra (a, e) zeleno), a zatim je rebro (c, d), jer da ovaj rub ima najmanju težinu od rubova grafa koji ne pripada F, a zelen je, a iz istih je razloga dodan i rub (a, b). Ali rub (b, e) je prošao, iako je i minimalna težina od preostalih rubova, jer je crvena: Vrhovi B i E pripadaju istoj komponenti šuma povezivanje F, koji je, ako se tome doda F rub (b, e), nastaje ciklus. Zatim se dodaje zeleni rub (b, c), crveni rub (c, e) se preskače, a zatim d, e. Dakle, rubovi (a, e), (c, d), (a, b), (b, c) su dodani u slijedu. Iz nje se sastoji od optimalnog kostura izvornog grafa. Tako algoritam radi u ovom slučaju Obojio sam se. Primjer pokazuje ovo.

algoritam obojen primjer

Slika prikazuje grafikon koji se sastoji od dvije komponente povezivanja. Podebljane linije prikazuju rubove optimalnog okvira (zeleno), konstruirane pomoću algoritma Kruskal.

algoritam Implementacija boje

Gornja slika prikazuje izvorni grafikon, a na donjem - kostur minimalne težine, konstruiran za njega uz pomoć algoritma koji se razmatra.

Redoslijed dodanih rubova: (1.6); (0,3), (2,6) ili (2,6), (0,3) - nije bitno; (3.4); (0,1), (1,6) ili (1,6), (0,1), također je indiferentan (5,6).

ispravnost Kruskalovog algoritma

Kruskalov algoritam pronalazi praktičnu primjenu, na primjer, kako bi optimizirao komunikacijske ploče, ceste u novim četvrtima u lokalitetima svake zemlje, kao iu drugim slučajevima.

Pročitajte više: