© h.hofstede (h.hofstede@hogeland.nl)

Het verbindingsprobleem.
       
We gaan deze les een gewogen graaf bekijken waarvan we op jacht zijn naar de opspannende boom met het kleinste totale gewicht. Dat noemen we de minimale opspannende boom van deze graaf.  Denk bijvoorbeeld weer aan een stedennetwerk dat met spoorlijnen met elkaar verbonden moet worden. De gewichten stellen dan afstanden of kosten voor.

Eerst bekijken we een manier om een opspannende boom te maken als er geen gewichten zijn (of als alle gewichten gelijk zijn). Dat gaat heel eenvoudig: 
•  Kies één voor één de zijdes en zorg er daarbij voor dat de graaf steeds acyclisch blijft.
•  Stop als dat niet meer lukt.

Hier zie je een voorbeeldje:
       

       
Merk nog even op dat de graaf tussendoor helemaal niet samenhangend hoeft te blijven. Aan het eind komt vanzelf alles aan elkaar.
       
Kruskal's Algoritme
       
Kruskal breidde dit eenvoudige systeem uit om een minimale opspannende boom te vinden.  Dat deed hij met de belachelijk eenvoudige extra regel:
"Als je kunt kiezen, kies dan steeds degene met het kleinste gewicht".
       
Zo kinderlijk eenvoudig! Je kunt bijna niet geloven dat dit algoritme pas in 1956 werd gepubliceerd!! Je ziet trouwens dat dit weer een voorbeeld is van een "greedy"" algoritme.
Hier zie je een voorbeeldje. Volg de blauwe pijlen.
       

       
De optimale boom heeft totaalgewicht 34 gekregen. Beter kan dus niet!

Waarom werkt dit eigenlijk?
Een bewijs uit het ongerijmde. 
Noem de boom die we met dit algoritme hebben gevonden B*, en stel dat de achtereenvolgens gekozen verbindingslijnen gelijk zijn aan de lijst  {V1, V2, ..., Vn-1}

Stel dat B* niet optimaal is.......
  Dan is er in de lijst van wél optimale bomen dus een boom B te vinden die beter is. Kies nu van alle optimale bomen  B degene die het langst gelijk is aan B*.  Noem die boom B1.
Dus dat is degene waar in het rijtje  {V1, V2, ...} zo laat mogelijk een afwijkende V voorkomt vergeleken met B*.
Noem deze eerste afwijkende zijde Vi  (we kiezen dus de optimale boom B1 met maximale i).

B1 + Vi  bevat dan een cykel.  (een V toevoegen aan een boom geeft altijd een cykel)

Maar in die cykel zitten ook nog hogere V's  immers Vi  kan met de eerdere V's geen cykel maken want B1 heeft geen cykel.
Neem zo'n latere Vj uit de cykel en laat die weg uit de graaf  B1.
Dan heb je een nieuwe graaf B2 gekregen die óók een opspannende boom is.
gewicht van B2 = gewicht van B1 + gewicht van Vi - gewicht van Vj 
maar omdat j een latere verbinding is dan i  is het gewicht van j  ≥ gewicht van i
dus dan is gewicht van  B2  ≤  gewicht van B1
B2 is dan óók een optimale boom, met als eerste afwijkende verbindingslijn Vj groter dan Vi
Dat is in tegenspraak met het feit dat B1 de zo laat mogelijk afwijkende Vi had (i was maximaal)
Dus de aanname dat B* niet optimaal is klopt niet!
     
Verward door al die B's en V's en  i 's en  j 's??
Hou dan dit plaatje in gedachten:

       
Bij de verbindingslijnen van B* staat tussen haakjes als hoeveelste ze gekozen zijn.

Stel dat B1 en B*  pas bij de 4e keus voor het eerst verschillen (V4) , en dat daarvoor in de plaats in B1 werd gekozen voor de blauwe verbinding (4).
Dan heeft B1 + V4  een cykel, in dit geval  (4)(8)(1)(7)
Als je uit  B1 + V4 van die cykel  nu bijv. Vj = (8) weglaat krijg je B2.
B2 is ook een opspannende boom, met waarde  ≤  B1 dus ook een optimale boom  (want  (8) was groter dan (4) omdat je bij Kruskal altijd de kleinste eerst koos)
Maar B2 is pas later dan V4  ongelijk aan B*  en dat klopt niet met de aanname dat die V4 de grootste was......
       
Het algoritme van Prim
       
Prim bedacht een ander, maar ook zeer eenvoudig, algoritme om een minimale opspannende boom te vinden.
Zijn methode gaat in drie stappen:
       
stap 1.  kies een willekeurige ongemarkeerde knoop van de graaf en markeer die
stap 2. bekijk alle buren van gemarkeerde knopen van de graaf
bepaal van al die buren de kortste afstand tot een gemarkeerde knoop
stap 3 markeer de buur met de kleinste minimale afstand
ga weer naar stap 1.
       
Laten we het toepassen op dezelfde graaf die we al met Kruskal behandelden.
Kies bijvoorbeeld knooppunt K, en markeer dat (rood)
Die heeft drie buren (oranje) met afstanden 5, 6, 2
Markeer dus de buur met afstand 2.

Hieronder zie je hoe het verhaal verder gaat. Weer via zo'n blauwe pijlen-route. Het wijst zichzelf wel, denk ik...

(de rode pijl geeft steeds het nieuw te markeren knooppunt aan; bij gelijke minimale afstanden is zomaar eentje daarvan gekozen)
       

       
En zoals je ziet wordt uiteindelijk  precies dezelfde minimale opspannende boom van 34 gevonden die we ook al via Kruskal vonden.
       
  OPGAVEN
       
1. Bepaal van de volgende gewogen grafen een minimale opspannende boom, en geef het totale gewicht daarvan.
       
  a.

     

44

  b.

     

48

   
2. Hieronder staan een aantal plaatsen in Oost-Nederland die direct met elkaar verbonden zijn. De afstanden staan bij de verbindingswegen.
Ontwerp een netwerk dat deze verbindingswegen gebruikt, en dat al deze plaatsen met elkaar verbindt en waarvoor de totale lengte van alle verbindingen minimaal is.
       

       
     
       

© h.hofstede (h.hofstede@hogeland.nl)