A legalacsonyabb súlyú, diszkrét matematika legszűkebb fája

A Steiner-probléma nevében a grafikonelméletben a következő probléma ismeretes: n pontokat adnak a síkon; Ehhez egyenes vonalakat kell csatlakoztatni oly módon, hogy a szegmensek teljes hossza a legkisebb legyen.

A megoldás keresése során új pontok beírása engedélyezett; A két adott pontot összekötő szegmens "hossza" nem feltétlenül értelmezhető szó szerint geometrikusan - ez lehet némi kvantitatív becslés az egyes "broken line" pontról pontra történő áthaladás "áráról".

A Steiner-probléma következő grafikus értelmezését adhatjuk. Egy irányítatlan G0 = (V0, ∅) grafikon van megadva élek nélkül. Szükséges egy speciális tulajdonsággal rendelkező G = (V, T) grafikon megtalálásához.

Feltételezzük, hogy a problémamegoldás során kapott bármely irányítatlan grafikon minden szegletéhez egy nemnemegatív számot társíthatunk, amelyet ennek az élnek a súlyával társítunk. Először is, a szükséges G grafikonnak egy nem irányított fa, másodsorban a csúcsainak halmazának magában kell foglalnia az eredeti gráf csúcsainak halmazát, azaz. V0 ⊆ V, és harmadszor a legkisebbnek kell lennie az éleinek súlyának összegével.

Az a követelmény, hogy a kívánt G gráf egy el nem orientált fa, annak a ténynek köszönhető, hogy minden pár csúcsnak egyetlen lánccal kell csatlakoznia, mert különben a grafikonnak nem lesz a legkisebb súlyösszege. Valójában, ha legalább két lánc van, amely összeköti a pár csúcsokat, akkor az egyiket választjuk, amelynek összege a szélek súlya kisebb. Ha feltételezzük, hogy a vizsgált helyzetben legalább két, azonos súlyú lánc létezik, akkor az optimális megoldáshoz az egyik láncot választjuk (és az optimális megoldás nem egyedi).

Az effektív algoritmusok *, amelyek pontos megoldást adnak a Steiner problémára, nem léteznek. Azonban hatékony algoritmusok ismertek, hogy megtalálják a pontos megoldás közelítését. Az egyik ilyen megoldás a Kruskal algoritmus. Egy irányítatlan (orientált) gráfot, amelyben minden egyes él (ív) társult valódi számmal, egy súlyozott vagy megjelölt gráfnak nevezik. Ezt a számot egy él (ív) súlyának vagy címkéjének nevezik. Rendszerint egy olyan grafikont tekintünk, amelynek természetes élei vannak (ívek).

* Az algoritmus tekinthető hatékonynak, ha a bonyolultsága az algoritmus által kifejezett funkció határolt fent polinom a paraméter jellemzi a „hangerő” az eredeti adatokat. A Steiner probléma ez a paraméter a csúcsok számát G0.

A Kruskal algoritmus egy adott súlyozott, nem irányított G gráfra számítja ki a legkisebb szélek súlyát - a legkisebb súlyú feszítőfát. A leginkább megfogalmazott probléma és a Steiner-probléma közötti lényeges különbség (a grafikonformulációjában) az, hogy az új probléma során a csúcsok halmaza nem változik, ha a legkevesebb tömegű spanning fát keresi. Ezért a Kruskal algoritmus csak egy bizonyos közelítést ad a Steiner-probléma megoldásához.

Az algoritmus leírása során egy adattárolási módot használunk, amelyet egy sornak hívunk. A sorban lévő adatok elemeit a kézhezvétel időpontja szerint rendelik meg. Elemeket lehet hozzáadni a sorhoz és kivonni a sorból. Egyszerre csak egy olyan elem áll rendelkezésre, amelyet a többiek előtt a sorban helyeztek el, a sor "fejét" pedig hozzáadva, az új elem a sor "farka" -jába kerül, azaz. munkát végeznek a szokásos sorban a szabály - „elsőnek jött - first out”, hogy távolítsa el a várakozási sorból egy bizonyos eleme, amely nem áll abban a pillanatban, hogy el kell távolítani az összes korábban kapott terméket, kezdve a „fej” fordulat ..

Tekintsük az algoritmust a legkisebb súlyú (Kruskal algoritmus) megtalálásához. Legyen G egy összekapcsolt, nem orientált G = (V, E) gráf numerikus nem negatív szélsúlyokkal. Az e súlyát φ (ε) jelöljük.

Az algoritmus eredményeként egy G T = (V, H) átviteli fát kapunk úgy, hogy az összeg a legkisebb.

Rendezése minden éle a kezdeti gráf emelkedő mértékét és formáját az őket, úgy, hogy a „fej” a sorban volt egy él a legalacsonyabb tömeg, és a „farok” - a legnagyobb és a súlyokat az élek nem csökkentik a „fej” a sorban a „farok”.

Az eljárás a kívánt fa "varrása" az átlyukló erdő összetevőiből áll. Kezdetben egy terjedő erdő az eredeti gráf elszigetelt csúcsainak egy csoportja, azaz sok éle üres. Az első lépésben a legkisebb súly szélét kivágják a sorból, és hozzáadják az eredeti fa széleihez.

Az algoritmus következő lépésein az egyik szél kivágódik a sorból. Ha ez az él összekapcsolja az aktuálisan áttörő erdő különböző összetevőire jellemző csúcsokat, akkor hozzáadódik a kívánt fa éleinek, és ezek az összetevők egybeolvadnak. Ellenkező esetben az él elvész. A folyamatot addig ismételjük, amíg az átfutó erdő komponenseinek száma megegyezik 1. Megmutatható, hogy ez az összetevő a legkisebb súlyú feszítőfa.

Most folytatjuk az algoritmus hivatalos leírását.

  1. Megadjuk a szükséges csavart fa H élének halmazát (H = ∅).
  2. A VS = 1> készletet alkotjuk. n >>, amelynek elemei a csúcsok halmazai, amelyek megfelelnek az eredeti terjedő erdő összetevőinek. Mindegyik összetevő egyetlen csúcsból áll.
  3. Az eredeti grafikon E élének sorát rendezzük a súlyok növelésével és a Q sorból, amelynek elemei a G gráf élei.
  4. Ha a VS készlet több elemet tartalmaz (azaz a több erõs erõmû több komponensbõl áll), és a Q sor nem üres, lépjen az 5. lépésre, ha másképp - a 7. lépésre.
  5. A Q sorból kivágunk egy évet. Ha az e él végpontjai különbözõ V és Vj csúcskészletekhez tartoznak. akkor lépjen a 6. lépésre, ha másként van, akkor dobja ki a kivont élt, és térjen vissza a 4. lépésre.
  6. Mi össze több csúcsú Vi és Vj (feltételezve W = = Vi ∪ Vj), törölni több vi és vj a több Vs és hozzá a beállított W. hozzáadása e él a beállított N. Visszatérve a 4. lépésre.
  7. Megállítjuk a munkát. A H készlet a létrejövő feszítőfa éleinek halmaza.

A Kruskal algoritmus helyességének igazolása, azaz annak bizonyítása, hogy az algoritmus által létrehozott algoritmus valójában a legkevesebb súlyú feszítőfa.

Az 1. ábrán. Az 5.19, a-d a nem irányított gráfhoz mutatja a legkisebb súlyú feszítőfa létrehozásának sorrendjét. Megjegyezzük, hogy az algoritmus eredménye általában az azonos súlyú élek sorrendjétől függ a sorban. Tegyük fel, hogy a várólista első sorrendje után a 0 v1> él 2-es súlyú.

Az eredeti grafikon az 1. ábrán látható. 5.19, a. Az 1. ábrán. 5.19, b az algoritmus első lépésének eredményét mutatja. Az 1. ábrán. 5.19, c azt mutatja, hogy a következõ 1. v2> él a sorból 2-es tömeggel kerül hozzáadásra. Az 1. ábrán. 5.19, d mutatja a 0. v4> él 3-as súlyú szegélyének hozzáadását. Ha a sor következő sora 1. v4>, akkor el kell dobni. A további folyamán az algoritmus függ a sorrendet, amelyben a bordák kerülnek a sorban 2 v3> és 3. v4> súlyokkal 4. Bármely ezek adhatunk a készlet szélén egy fa-struktúra, és ez az algoritmus befejezi a munkát. Az 1. ábrán. 5.19, d a 3. él v4> hozzáadását követően kapott átfedő fát mutatja.

Megjegyezzük, hogy a fenti grafikonon két széle súly 2 szerepelni fog a feszítőfa, függetlenül attól, hogy azok sorrendjét a sorban válogatás után és a szélén 1. v4> sem lép a minimális súly feszítőfa.

Meg lehet bizonyítani, hogy a Kruskal algoritmus legnehezebb lépése a grafikon éleinek rendezése a súlyok növelésével. Mint már tudjuk, az n elemek rendezésének feladata nem oldható meg gyorsabban, mint az O (nlog2 n) időben. Következésképpen a Kruskal-algoritmus komplexitását O (| E | log2 | E |) számolja, ahol | E | A gráf széleinek halmaza kardinalitása. Mivel az egyenlőtlenség | E | log2 | E | ≤ | E | 1. akkor a Kruskal-algoritmus hatékonynak tekinthető.