Algoritmer #1

I forløbet algortimer #1, skal vi lære hvad en algoritme er, hvor vigtigt det er at være meget specifik og stringent ift. udførsel af trin i en algoritme.

Når vi programmerer, handler det ikke kun om at skrive kode, men om at løse problemer på en systematisk måde. For at kunne gøre det effektivt, har vi brug for algoritmer.

En algoritme er en trin-for-trin beskrivelse af, hvordan en opgave kan løses – lidt ligesom en opskrift i et køkken eller en manual til at samle en reol.

Algoritmer ligger bag næsten alt, hvad vi bruger i hverdagen: når vi søger på Google, får anbefalinger på Netflix, eller når vores telefon finder den hurtigste vej hjem. I faget Programmering er forståelsen af algoritmer central, fordi de hjælper os til at skrive smartere, mere effektive og mere pålidelige programmer.

Vi vil beskæftige os med BubbleSort sortering, samt Dijkstra Shortest Path algoritme.


BubbleSort

Bubble sort er en simpel sorteringsalgoritme, der gentagne gange gennemgår en liste, sammenligner to tilstødende elementer ad gangen og bytter dem, hvis de er i forkert rækkefølge.

Processen gentages flere gange, indtil listen er sorteret.

Trin:

  1. Sammenlign par af nabo-elementer
  2. Byt om, hvis det næste element er mindre end det forrige
  3. Hop til næste element, og gentag indtil ingen bytninger sker i et genneløb.
  1. I første gennemløb sammenligner du n-1 par (her 4 par).
  2. I andet gennemløb sammenligner du n-2 par. etc. etc. indtil kun 1 par sammenlignes.

De største elementer „bobler op til toppen” af listen ved hvert gennemløb =).


BubbleSort eksempel

Start: 5, 3, 4, 1, 2

Gennemløb 1 (4 sammenligninger)

  Sammenlign 5 og 3 → byt → 3, 5, 4, 1, 2
  Sammenlign 5 og 4 → byt → 3, 4, 5, 1, 2
  Sammenlign 5 og 1 → byt → 3, 4, 1, 5, 2
  Sammenlign 5 og 2 → byt → 3, 4, 1, 2, 5  ← største er nu på plads

Gennemløb 2 (3 sammenligninger)

  Sammenlign 3 og 4 → ingen bytning → 3, 4, 1, 2, 5
  Sammenlign 4 og 1 → byt → 3, 1, 4, 2, 5
  Sammenlign 4 og 2 → byt → 3, 1, 2, 4, 5  ← næststørste er nu på plads

Gennemløb 3 (2 sammenligninger)

  Sammenlign 3 og 1 → byt → 1, 3, 2, 4, 5
  Sammenlign 3 og 2 → byt → 1, 2, 3, 4, 5

Gennemløb 4 (1 sammenligning)

  Sammenlign 1 og 2 → ingen bytning → 1, 2, 3, 4, 5

Sorteret liste: 1, 2, 3, 4, 5


Dijkstra Shortest Path

Dijkstra’s algoritme bruges til at finde den korteste vej i et netværk, som fx ruter på et kort eller forbindelser i et netværk. Den lærer dig, hvordan man analyserer og håndterer vægtede grafer, samt hvordan man kan optimere søgningen efter den mest effektive rute. Algoritmen viser, hvordan programmering og matematik arbejder sammen, og hvordan logik kan bruges til at løse praktiske problemer.
At forstå Dijkstra giver dig et solidt fundament for mange avancerede algoritmer inden for netværk, spiludvikling og AI.


Motivation


At lære algoritmer i Programmering B er altså ikke bare et teoretisk krav, men en praktisk nødvendighed. Det gør dig bedre til at tænke som en programmør og giver dig redskaber, du kan bruge både i studiet og i erhvervslivet.


Dijkstra Shortest Path

Dijkstra’s algoritme er en graf-algoritme, der bruges til at finde den korteste vej fra en startnode til alle andre noder i en vægtet graf (hvor kanterne har ikke-negative vægte).

Den er især nyttig inden for:


Hvad for en slags algoritme er det?

Hvad er Dijkstra's algoritme?

Dijkstra's algoritme er en metode til at finde den korteste vej mellem to punkter i en graf. Grafen består af noder (punkter) og kanter (forbindelser mellem punkter) med tilknyttede vægte (fx afstand, tid eller pris).

Algoritmen starter fra en valgt startnode og arbejder sig gradvist frem ved at opdatere den korteste kendte afstand til hver node, indtil den finder den korteste vej til målnoden.

Hvordan virker algoritmen?

  1. Start ved startnoden med afstand 0 til sig selv, og sæt alle andre noders afstand til uendelig (ukendt).
  2. Marker alle noder som ubehandlede.
  3. Vælg ubehandlet node med den mindste kendte afstand (i starten er det startnoden).
  4. For hver af den valgte nodes naboer, beregn en mulig ny kortere afstand via den valgte node.
  5. Hvis den nye afstand er kortere end den tidligere kendte afstand, opdateres afstanden og „forgængeren“ (den node man kommer fra).
  6. Marker den valgte node som behandlet.
  7. Gentag trin 3-6, indtil alle noder er behandlet, eller målnoden er nået.

info


Intuition

Forestil dig, at vi har en række byer forbundet med veje.

Hvordan gør vi det?

Det er præcis, hvad Dijkstra’s algoritme gør – den finder systematisk den billigste (korteste) vej.


Pseudokode

DIJKSTRA(Graph, start):
For hver node v i Graph:
distance[v] := ∞
previous[v] := UDEFINERET
distance[start] := 0 
 
S := tomt sæt  // noder med fastlagt korteste afstand
Q := alle noder i Graph  // noder vi skal behandle
 
Mens Q ikke er tom:
    u := node i Q med mindste distance[u]
    Fjern u fra Q
 
    For hver nabo v af u:
        alt := distance[u] + vægt(u, v)
        Hvis alt < distance[v]:
            distance[v] := alt
            previous[v] := u
 
    Tilføj u til S
 
Returnér distance[] og previous[]

Eksempel

Hvis vi har en graf med noderne A, B, C og D, og kanterne har vægte, finder Dijkstra:


Eksempel: 6 byer med adjacency matrix

Vi har 6 byer (noder): A, B, C, D, E, F Vejene mellem byerne har følgende „afstand i km“:

Der er ingen andre direkte forbindelser.


Adjacency matrix

A B C D E F
A 0 7 9 14
B 7 0 10 15
C 9 10 0 11 2
D 15 11 0 6
E 6 0 9
F 14 2 9 0

C#-repræsentation

int INF = int.MaxValue;
 
int[,] graf = {
    { 0, 7, 9, INF, INF, 14 },
    { 7, 0, 10, 15, INF, INF },
    { 9, 10, 0, 11, INF, 2 },
    { INF, 15, 11, 0, 6, INF },
    { INF, INF, INF, 6, 0, 9 },
    { 14, INF, 2, INF, 9, 0 }
};

Noter

Symmetrisk matrix, fordi vi antager at vejene kan køres begge veje.

Ved Dijkstra kan man nu slå afstanden mellem to byer op på graph[i,j].

Antallet af noder er 6 → matrixen er 6×6.

int.MaxValue bruges som uendelig (ingen direkte forbindelse).

Opsummering


Teori


Øvelser