Minimalno vpeto drevo

Minimalno vpeto drevo

Avtor: Matija Lokar

Povežimo poštne strežnike

  • Imamo n računalnikov – poštnih strežnikov. Radi bi jih povezali tako, da je z vsakega mogoče pošiljati pošto vsakemu
  • Med računalniki lahko izbiramo različne načine povezovanja (različne ponudnike) z različnimi stroški
  • Kako se odločiti za ponudnike povezav, da bodo naši stroški najmanjši?

Klepetulje

Meta ima 6 prijateljic: Aljo, Jano, Tejo, Sašo, Kajo in Uršo. Vse so navdušene uporabnice mobilnih telefonov. Ampak ker mora vsako novico, ki jo izve ena, izvedeti tudi ostalih 6, so telefonski računi zelo veliki. Ko so nekaj časa spremljale stroške povprečnega pogovora, so prišle do naslednje matrike stroškov posameznega klica

(vpeto_drevo_2a.png) (vpeto_drevo_2b.png)

Če se torej Meta pogovarja z Aljo, so stroški klica 50 centov, če Saša kliče Uršo (ali obratno) 52 centov, če Urša govori s Kajo 16 centov, .... Ugotovi, kako naj se kličejo, da bo vsako novico izvedela vsaka in da bodo za razširitev ene novice porabile kar se da malo denarja.

Klepetulje - zgled

  • Denimo, da imamo le štiri prijateljice
  • A – B: 10
  • B – C: 15
  • A – C: 12
  • A – D: 6
  • D – B: 7
  • C in D pa se ne marata in ne govorita

Podzemna železnica

  • Vemo, kje moramo narediti postaje

    • Vsekakor tam, da ima pomembna osebnost dovolj blizu postajo
  • Iz vsake postaje mora biti moč priti do druge
  • Poznamo stroške za neposredno povezavo postaje i in postaje j.
  • Kar se da poceni!
(vpeto_drevo_4.png)

Vohunska mreža

  • Verjetnost, da prestrežejo sporočilo agenta i agentu j je p[i,j].
  • Kako naj za sporočila izvedo vsi, tako, da bo verjetnost, da je sporočilo prestreženo, minimalna.
(vpeto_drevo_5.png)

Problemi

  • Klepetave prijateljice
  • Podzemna železnica
  • Povezava poštnih strežnikov
  • ...
  • Dano je omrežje

    • Množica točk in povezav med njimi z določenimi vrednostmi
    • "vrednostni graf"
    • Želimo povezati vse točke

      • iz vsake želimo priti v vsako
      • n točk: torej n – 1 povezav

Vpeto drevo

  • N točk
  • N – 1 povezav, povezano (iz vsake točke se da priti do vsake točke)
  • To je značilnost drevesa (ne dvojiškega, ampak splošnega)
  • Iščemo t.i. vpeto drevo grafa.
  • Vpeto?

    • Uporabiti je potrebno vse točke grafa
    • smemo uporabiti samo obstoječe povezave
  • Drevo?

    • Povezanost n točk z uporabo n – 1 povezav
  • Vpetih dreves je lahko več

    • Primer

Graf

(vpeto_drevo_8.png)

Vpeta drevesa I

(vpeto_drevo_9.png)

Vpeta drevesa II

(vpeto_drevo_10.png)

Vpeta drevesa III

(vpeto_drevo_11.png)

Vpeta drevesa IV

(vpeto_drevo_12.png)

Kabelsko omrežje med mesti

  • Med n mesti želimo speljati kabelsko omrežje

    • Iz oddajne točke moramo znati spraviti signal v vsa mesto (neposredno ali preko drugih mest)

      • Iščemo vpeto drevo
    • Seveda čim ceneje

      • Iščemo minimalno vpeto drevo
      • Cena drevesa: Vsota vrednosti povezav
  • Ali je potrebno začeti gradnjo tam, kjer bo centralna oddajna postaja?

    • Ne, saj je važna le dosegljivost vsake točke
  • Začnimo v nekem mestu /tistemu, ki ima najboljše restavracije :) / - recimo, da je to mesto a
  • Med tistimi mesti, do katerih je možno priti, izberemo tistega, do katerega lahko položimo kabel najceneje (recimo, da je to mesto c)
  • Položimo kabel

Kako naprej

  • Spet bomo izbrali najcenejše

    • A od kje?
    • Iz mesta, kamor smo ravno potegnili kabel (c)?
    • Ne, potrebno je upoštevati vsa dosegljiva mesta
  • Pregledamo, koliko nas stane gradnja do mest, dosegljivih iz a in c
  • Torej – poiščemo najcenejšo povezavo med vozlišči v doslej zgrajenem vpetem drevesu in tistimi, ki tam še niso
  • Dodamo najcenejše dosegljivo mesto – denimo x

Kako naprej

  • Pregledamo, koliko nas stane gradnja do mest, dosegljivih iz a, x (zadnje dodano) in c
  • Seveda upoštevamo samo tiste povezave iz a, c in x, ki gredo do "novih" mest – povezave med a, c in x nas NE zanimajo več (čeprav so morda poceni, a so nepotrebne)
  • Torej – poiščemo najcenejšo povezavo med vozlišči v doslej zgrajenem vpetem drevesu in tistimi, ki tam še niso

Minimalno vpeto drevo

  • Iščemo vpeto drevo
  • Vpetih dreves je (lahko) veliko
  • Iščemo najcenejše
  • Jih je lahko več?
  • Iščemo eno!

Algoritem

  • Začni s poljubnim vozliščem. To je začetno vpeto drevo.
  • Dokler ne dodaš n-1 vozlišč, ponavljaj

    • Izberi najcenejšo povezavo med vozlišči v doslej zgrajenem vpetem drevesu in vozlišči, ki še niso del drevesa
    • Dodaj to povezavo v drevo

Algoritem

  • Pripravi vrsto s prednostjo
  • Vstavi začetno vozlišče
  • Ponavljaj, dokler vrsta ni prazna

    • Poišči vse povezave med zadnjim dodanim vozliščem in vozlišči, ki niso v drevesu
    • Dodaj jih v vrsto s prednostjo
    • Vzemi najcenejšo povezavo

      • Če povezuje vozlišče v drevesu in vozlišče, ki ni v drevesu, jo dodaj v doslej zgrajeno vpeto drevo
      • Sicer jo zavrzi in ponovi ta korak

Prikaz

(vpeto_drevo_19.png)

Prikaz 2

Drugačna ideja

  • Ker imamo n vozlišč, bo potrebno n - 1 povezav.
  • Vzemimo najcenejšo in povežimo vozlišči.
  • Vzemimo najcenejšo med preostalimi povezavami
  • Dve možnosti:

    • Med povezanima vozliščema in novim
    • Med dvema novima vozliščema
  • Kasneje

    • Po nekaj vozlišč skupaj že povezanih v vpeta drevesa (za tisti del omrežja), nekaj "osamljenih" vozlišč.
  • Če je najcenejša povezava "notranja"
    (Povezuje vozlišči znotraj istega vpetega drevesa)

    • nas NE zanima

Kruskalov algoritem

  • Torej na tekočem koraku

    • Vzamemo najcenejšo med preostalimi povezavami
  • Več možnosti:

    • "slabe"

      • Med vozlišči istega vpetega drevesa
    • dobre

      • Med "osamljenim vozliščem" in vpetim drevesom
      • Med dvema "osamljenim vozliščem"
  • V bistvu sta obe "dobri" možnosti isti

    • Posamezno vozlišče je tudi vpeto drevo!
  • Torej na tekočem koraku imamo nekaj minimalnih vpetih dreves
  • Povežemo tisti vpeti drevesi, ki ju je najceneje povezati

Prikaz

(vpeto_drevo_23.png)

Prikaz 2

Minimalno vpeto drevo

  • Omrežje
  • N vozlišč, m povezav, vrednosti povezav
  • Če povezave ni: vrednost
  • Primov algoritem (1959)
  • Kruskalov algoritem (1956)

http://www.cs.usask.ca/resources/tutorials/csconcepts/graphs/tutorial/advanced/prim/mst.html

Minimalno vpeto drevo

0%
0%