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.
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:
De største elementer „bobler op til toppen” af listen ved hvert gennemløb .
Start: 5, 3, 4, 1, 2
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
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
Sammenlign 3 og 1 → byt → 1, 3, 2, 4, 5 Sammenlign 3 og 2 → byt → 1, 2, 3, 4, 5
Sammenlign 1 og 2 → ingen bytning → 1, 2, 3, 4, 5
Sorteret liste: 1, 2, 3, 4, 5
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.
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’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 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?
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.
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[]
Hvis vi har en graf med noderne A, B, C og D, og kanterne har vægte, finder Dijkstra:
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.
| 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 |
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 } };
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).