Dynamisk programmering

Like dokumenter
Dynamisk programmering

Dynamisk programmering Undervises av Stein Krogdahl

Dynamisk programmering. Hvilke problemer? Overlappende delproblemer. Optimalitetsprinsippet

Dynamisk programmering. Hvilke problemer? Overlappende delproblemer. Optimalitetsprinsippet

Alle mot alle. Åttende forelesning. (eller eller Bellman-Ford, eller BFS, alt ettersom) fra alle noder.

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

Dagens plan. INF Algoritmer og datastrukturer. Koding av tegn. Huffman-koding

Søking i strenger. Prefiks-søking Naiv algoritme Knuth-Morris-Pratt-algoritmen Suffiks-søking Boyer-Moore-algoritmen Hash-basert Karp-Rabin-algoritmen

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

Turingmaskiner.

Definisjon: Et sortert tre

Notater til INF2220 Eksamen

Longest increasing. subsequence Betingelser. Longest. common subsequence. Knapsack Grådig vs. DP Moro: 2D-Nim Spørsmål. Forside. Repetisjon.

MAT1030 Diskret Matematikk

Definisjon av binært søketre

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Algdat - øvingsforelesning

Longest. increasing. subsequence. Betingelser. Matrise- common. Grådig vs. DP. Forside. Intro. Fibonacci-tall. Memoisering DP

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

INF 4130 / / Dagens foiler hovedsakelig laget av Petter Kristiansen Foreleser Stein Krogdahl Obliger:

Lars Vidar Magnusson Kapittel 13 Rød-Svarte (Red-Black) trær Rotasjoner Insetting Sletting

Grådige algoritmer. Lars Vidar Magnusson Kapittel 16. Aktivitetvelgingsproblemet Huffmankoder

ALGORITMER OG DATASTRUKTURER

INF 4130 Oppgavesett 3, 20/ m/løsningsforslag

INF1020 Algoritmer og datastrukturer GRAFER

Eksamen iin115 og IN110, 15. mai 1997 Side 2 Oppgave 1 Trær 55 % Vi skal i denne oppgaven se på en form for søkestrukturer som er spesielt godt egnet

Forelesning 33. Repetisjon. Dag Normann mai Innledning. Kapittel 11

IN Algoritmer og datastrukturer

MAT1030 Diskret matematikk

Innledning. MAT1030 Diskret matematikk. Kapittel 11. Kapittel 11. Forelesning 33: Repetisjon

INF Algoritmer og datastrukturer

INF3/4130 PRØVE-EKSAMEN MED SVARFORSLAG Gjennomgås 1/ , (lille aud.)

Kap 9 Tre Sist oppdatert 15.03

Svarforslag til ukeoppgaver til INF 4130

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

INF Algoritmer og datastrukturer

Lars Vidar Magnusson

ALGORITMER OG DATASTRUKTURER

INF2220: Forelesning 2

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

MAT1030 Diskret matematikk

Forelesning 23. Grafteori. Dag Normann april Oppsummering. Oppsummering. Oppsummering. Digresjon: Firefarveproblemet

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

MAT1030 Diskret matematikk

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Forelesning 23: Grafteori

Løsnings forslag i java In115, Våren 1998

MAT1030 Forelesning 25

INF2220: Forelesning 2

Forelesning 25. MAT1030 Diskret Matematikk. Litt repetisjon. Litt repetisjon. Forelesning 25: Trær. Dag Normann

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

MAT1030 Diskret Matematikk

Stein Krogdahl, Dino Karabeg, Petter Kristiansen. Kenneth A. Berman and Jerome L. Paul.

Datastrukturer. Stakker (Stacks) Hva er en datastruktur? Fordeler / Ulemper. Generelt om Datastrukturer. Stakker (Stacks) Elementære Datastrukturer

Algdat Oppsummering, eksamen-ting. Jim Frode Hoff

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

Øvingsforelesning Korteste vei: Alle til alle

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel

Binære trær: Noen algoritmer og anvendelser

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

Repetisjon og mer motivasjon. MAT1030 Diskret matematikk. Repetisjon og mer motivasjon

Forelesning 30. Kompleksitetsteori. Dag Normann mai Informasjon. Oppsummering

Lars Vidar Magnusson

MAT1030 Diskret matematikk

Eksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing. Børge Rødsjø

Algdat-ninja på 60 minutter: Et galskapsprosjekt. Magnus Lie Hetland

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Innhold. Innledning 1

Live life and be merry

Norsk informatikkolympiade runde

Flerveis søketrær og B-trær

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Grunnleggende Grafteori

Transkript:

Dynamisk programmering Metoden ble formalisert av Richard Bellmann (RAND Corporation) på 5-tallet. Programmering i betydningen planlegge, ta beslutninger. (Har ikke noe med kode eller å skrive kode å gjøre.) Dynamisk for å indikere at det er en stegvis prosess. Men også et pynteord.

Dynamisk programmering Metoden ble formalisert av Richard Bellmann (RAND Corporation) på 5-tallet. Programmering i betydningen planlegge, ta beslutninger. (Har ikke noe med kode eller å skrive kode å gjøre.) Dynamisk for å indikere at det er en stegvis prosess. Men også et pynteord.

Hvilke problemer? Dynamisk programmering brukes typisk til å løse optimaliseringsproblemer. (Problemer hvor det kan være mange mulige løsninger, og hvor vi ønsker å finne den beste vi ønsker å optimere verdien av en objektivfunksjon. Skal vi kunne løse et problem med dynamisk programmering, må det kunne deles opp i mindre og mindre biter helt til vi kommer til et delproblem så lite at løsningen lett kan finnes. Så starter vi med løsningene på små delproblemer, og kombinerer disse til løsninger på større delproblemer, helt til vi har løsningen på hele problemet. Skal dynamisk programmering være en egnet (effektiv) metode må:. optimalitetsprinsippet p pp holde,. delproblemer må overlappe, og. antall delproblemer være polynomisk.

) Optimalitetsprinsippet Gitt et optimaliseringsproblem, og en funksjonen combine som kombinerer løsninger på delproblemer til løsninger på større problemer, så sier vi at optimalitetsprinsippet holder hvis følgende alltid er sant: Hvis S = combine(s, S,, S m ), og S er en optimal løsning på sin probleminstans, så er S, S,, S m optimale løsninger på sine respektive probleminstanser. Hvis optimalitetsprinsippet holder, er problemet egnet for løsning med dynamisk programmering. Da genereres bare optimale løsninger på delproblemer når vi starter fra optimale løsninger på de minste delproblemene, og kombinerer disse til løsninger på større problemer.

) Overlappende delproblemer En dynamisk programmerings-algoritme starter med å løse de minste delproblemene, og setter sammen disse løsningene til løsninger på større og større problemer. Hvis samme delproblem forekommer flere ganger, unngår vi dobbeltarbeid. Løsningene på delproblemene lagres nemlig, og vi slipper å løse dette delproblemet flere ganger.

) Overlappende delproblemer En dynamisk programmerings-algoritme starter med å løse de minste delproblemene, og setter sammen disse løsningene til løsninger på større og større problemer. Hvis samme delproblem forekommer flere ganger, unngår vi dobbeltarbeid. Løsningene på delproblemene lagres nemlig, og vi slipper å løse dette delproblemet flere ganger.

) Polynomisk antall delproblemer En algoritmes effektivitet er direkte avhengig av antall delproblemer som løses: er det få (polynomisk), blir algoritmen effektiv, er det mange (eksponensielt) blir algoritmen ikke praktisk nyttig. C(,n) Ikke egnet om det genereres et eksponensielt antall delproblemer

Divide and conquer vs. Dynamisk programmering g Divideid and conquer (f.eks Quicksort) Top down (rekursivt kall) Best egnet når delproblemene er uavhengige av hverandre. Da re-beregnes ikke løsninger på delproblemer. Kun relevante delproblemer løses. Dynamisk programmering Bottom up Egnet når delproblemer overlapper, ettersom løsninger lagres i en tabell og vi kan slå opp når vi støter på et delproblem vi allerede har løst. Ulempen er at vi beregner løsninger på alle delproblemer. Metodene kan kombineres, såkalt memoisering, en divide and conquer algoritme kan lagre løsninger på delproblemer i en tabell og slå opp for å unngå dobbeltarbeid.

Fire enkle(?) steg. Beskriv strukturen i problemet, hvordan en løsning er satt sammen av delløsninger. Verifiser at optimalitetsprinsippet faktisk holder.. Lag en formel for verdien av en optimal løsning (ut fra verdien av av optimale delløsninger).. Beregn verdien til en optimal løsning, bottom up (lagre verdien av optimale delløsninger i en tabell).. Konstruer en optimal løsning ut fra beregnede verdier. (Om vi faktisk ønsker løsningen, og ikke bare nøyer oss med verdien av en optimal løsning.)

Strenger som ligner (kap..5) En streng P er en k-approksimasjon av en streng T dersom T kan konverteres til P ved å utføre maksimalt k av følgende operasjoner: Substitusjon Et symbol i T byttes ut med et annet. Tillegg Et nytt symbol legges til i T. Sletting Et symbol slettes fra T. Edit distance, ED(P,T ), mellom to strenger T og P er det minste antall slike operasjoner som trengs for å konvertere T til P. Eks. logarithm alogarithm algarithm algorithm (+a, -o, a/o) T P

. Strenger som ligner Gitt to strenger T og P, ønsker vi å finne edit distance mellom disse. La D [i, j ] = ED( P [: i ], T [: j ]). (Edit distance mellom delstrenger) Vi deler i følgende delproblemer:. Hvis P [ i ] = T [ j ], så er D [ i, j ] = D [ i -, j -]. i a P[: i ] = j a T[: j ]

. Strenger som ligner Gitt to strenger T og P, ønsker vi å finne edit distance mellom disse. La D [i, j ] = ED( P [: i ], T [: j ]). (Edit distance mellom delstrenger) Vi deler i følgende delproblemer:. Hvis P [ i ] T [ j ], tenker vi oss en optimal sekvens av operasjoner som transformerer T [: j ]tilp P [: i ]. Den siste operasjonen, for å få T [ j ] = P [ i ], kan være: Substitusjon i T sette T [ j ] = P [ i ], Tillegg i T legge til symbol i T i pos T [ j ], Sletting i T slette symbol i T i pos T [ j ].

. Substitusjon sette T [ j ] = P [ i ] i j a n n e P[: i ] a n n f T[: j ] Strenger som ligner Regner ut D [ i, j ] ved å finne D [ i -, j -] (edit distance for det grå området), og legger til for substitusjonen. Tillegg i T legge til symbol i T i pos T [ j ] sletting av P [ i ] i a n n e P[: i ] j a n n T[: j ] Å legge til en e i T er det samme som å slette en i P. Regner ut D [ i, j ] ved å finne D [ i -, j ](edit distance for det grå området), og legger til for slettingen i P. Sletting i T sletting symbol i T på pos T [ j ] i j a n n P[: i ] a n n e T[: j ] Regner ut D [ i, j ] ved å finne D [ i, j -] (edit distance for det grå området), og legger til for slettingen i T.

. Strenger som ligner Formelen (rekursiv definisjon) for D[ i, j ] vil altså være som følger: D[ i, j ] D[ i, j] = min{ D [ i, j ] +, D [ i, j] +, D [ i, j ] + substitusjon tillegg i T sletting i T sletting i P D[, ] =, D[ i, ] = D[, i] = i. } hvis ellers P[ i] = T[ j] Løsningen, edit distance mellom strengene, finnes i D[m,n] (P er av lengde m og T av lengde n).

. Strenger som ligner Formelen (rekursiv definisjon) for D[ i, j ] vil altså være som følger: D[ i, j ] D[ i, j] = min{ D [ i, j ] +, D [ i, j] +, D [ i, j ] + substitusjon tillegg i T sletting i T sletting i P D[, ] =, D[ i, ] = D[, i] = i. } hvis ellers P[ i] = T[ j] j - j j - j... i - i - i i

. Strenger som ligner Formelen (rekursiv definisjon) for D[ i, j ] vil altså være som følger: D[ i, j ] D[ i, j] = min{ D [ i, j ] +, D [ i, j] +, D [ i, j ] + substitusjon tillegg i T sletting i T sletting i P D[, ] =, D[ i, ] = D[, i] = i. } hvis ellers P[ i] = T[ j] j - j j - j... i - i - i i +

. Strenger som ligner function EditDistance ( P [:n ], T [:m ] ) i j for i to n do D[ i, ] i for j t to m do D[, j ] j for i to n do for j to m do If P [ i ] = T [ j ] then D[ i, j ] D[ i -, j - ] else D[ i, j ] min { D[i -, j - ] +, D[i -, j ]+ +, D[i, j - ] + } endif endfor endfor return( D[ n, m ] ) end EditDistance

. eks. Strenger som ligner T D a n e j del T del T a P ins T n n e i

. eks. Strenger som ligner T D a n e j del T del T a P ins T n n e i

Optimal matrisemultiplikasjon Vi er gitt en sekvens M, M,, M n - av matriser og ønsker å beregne produktet M M M n -. Vi gjør dette ved å sette parenteser, og multiplisere par av matriser, f.eks slik: M M M M = (M (M M )) M Parentesene kan settes på mange måter: (M (M (M M ))) (M ((M M ) M )) ((M M ) (M M )) ((M (M M )) M ) (((M M ) M ) M ) Kostnaden (antall skalare multiplikasjoner) kan variere veldig mellom de ulike måtene å sette parenteser på.

Gitt to matriser A = p q matrise, B = q r matrise. Optimal matrisemultiplikasjon Kostnaden (antall skalare multiplikasjoner) ved å beregne A B er p q r (A B) er en p r matrise. Eks. Beregn A B C, hvor A er en matrise, B er en 5 matrise, og C er en 5 5 matrise. Å beregne D = (A B) koster 5, og gir en 5 matrise. Å beregne D C koster,5. Total kostnad for (A B) C blir 7,5. Å beregne E = (B C) koster 5, og gir en 5 matrise. Å beregne A E koster 5,. Total kostnad for A (B C) blir 75,.

. Optimal matrisemultiplikasjon Gitt en sekvens av matriser M, M,, M n -, ønsker vi å beregne produktet på billigst mulig måte vi må finne optimal parentes-struktur. En parenterisering av sekvensen er en oppdeling i to delsekvenser, som hver for seg må parenteriseres: (M M M k ) (M k + M k + M n- ) Vi må prøve alle mulige k for å finne hvor det er best å dele sekvensen. Hvert delingspunkt gir opphav til to delproblemer parenterisering av venstre og høyre delsekvens. Består sekvensen bare av en matrise, er denne en parenterisering av seg selv. Har vi en optimal parenterisering av en sekvens av matriser, så må parenteriseringen av hver delsekvens også være optimal. Ellers kan vi jo bare bytte ut den som ikke var optimal med en bedre en. (Optimalitetsprinsippet holder.)

. Optimal matrisemultiplikasjon La d, d,, d n være dimensjonene til sekvensen av matriser M, M,, M n-, slik at matrise M i har dimensjon d i d i+. La m i,j være kostnaden av en optimal parenterisering av M i, M i+,, M j Formelen (rekursiv definisjon) for m i,j vil være som følger: m i, j { m + m + d d d }, for alle i < j n = min i, k k, j i k + j + i k< j m i i, =, for alle i n Kostnaden av å utføre multiplikasjonen med den optimale parenteriseringen finner vi i m,n -

. Optimal matrisemultiplikasjon d 5 5 5 5 m 5 5,5,875,5 9,75 7,5 5,75 7,875 75,75,5,5 5,75,65 75, 5, 5

. Optimal matrisemultiplikasjon d 5 5 5 5 m m 5, = min(d d d 5 + m(,) + m(,), d d d 5 + m(,) + m(,), 5,5 d d d 5 + m(,) + m(,)) = min(5 5 + +,5,,875,5 5 5 +,65 +,, 5 +,75 + ) 9,75 7,5 5,75 7,875 75,75,5,5 5,75,65 75, 5, 5

./. Optimal matrisemultiplikasjon M M M M 5 = M (M M M ) = (M M ) (M M ) c = (M M M ) M 5 m 5,5,875,5 9,75 7,5 5,75 7,875,75,5,5 5,75,65 75, 5, 5

./. Optimal matrisemultiplikasjon m 5 5,5,875,5 9,75 7,5 5,75 7,875,75,5,5 5,75,65 75, 5, 5 c 5

. Optimal matrisemultiplikasjon c 5 M M M M M M 5 = (M M M ) (M M M 5 ) = ((M ) (M M )) ((M M ) (M 5 ))

./. Optimal matrisemultiplikasjon function OptimalParens( d[ : n ] ) for i to n- do m[i, i] for diag to n do // hjelpevariabel for å fylle ut tabellen nivå for nivå for i to n diag do return m[, n ] end OptimalParens j i + diag m[i, j] for k i to j do q m[i, k] + m[k +, j] + d[i] d[k + ] d[j + ] if q < m[i, j] then endif m[i, j] q c[i,j] k

Optimale søketrær Pat Joe Ray Ann

Optimale søketrær Pat Joe Ray Ann Ann Joe Pat Ray p p p p q q q q q

Optimale søketrær Pat Joe Ray Ann Ann Joe Pat Ray p p p p q q q q q Gjennomsnittlig søketid: p + p + p + p + q + q + q + q + q

Optimale søketrær For generelle søketrær får vi følgende formel for gjennomsnittlig antall sammenlikninger som gjøres: T et tre med n nøkler (søkeord lagret i interne noder) K,, K n-. n+ bladnoder tilsvarer intervaller I,, I n mellom nøklene. n sannsynlighetsvektorer p og q for nøklene og intervallene mellom dem. d i er nivået til nøkkel K i, e i er nivået til bladnode som korresponderer med I i. n A ( T, n, p, q) = p( d + ) + n i i i= i= qe i i

Optimale søketrær Hvis p i -ene er like og q i -ene er like, vil det komplette binære søketreet være det optimale. Men noen ord kan være oftere søkt etter enn andre (p i -ene ulike), derfor kan det lønne seg med skjeve trær og deltrær, for å få ord som det ofte blir søkt etter så høyt som mulig opp i treet. Vi ønsker å finne det optimale binære søketreet T over alle mulige, gitt søkesannsynlighetene (p i -ene og q i -ene). Dvs treet som minimerer gjennomsnittlig antall sammenlikninger A(T,n,p,q): min A( T, n, P, Q) T p i -ene og q i -ene er i utgangspunktet sannsynligheter (tall i intervallet [,], som summerer til ), men vi kan slakke på kravet og anta at de er positive reelle tall, det er uansett bare tall som sammenliknes. n La σ ( p, q) = + n p i q i i = i =

. Optimale søketrær Et binært tre T for nøklene K, K n- består av en rot med nøkkel K i, og to deltrær L og R. K i K,, K i - K i+,, K n - p,, p i - p i+,, p n - q,, q i p i+,, q n Vi må prøve alle mulige røtter K i for å finne hvor det er best å dele treet. t Hver mulige rot gir opphav til to delproblemer optimalisering av de korresponderende venstre og høyre deltrærne. Gjennomsnittlig antall operasjoner for treet T er gitt ved: A ( T, n, p, q ) A ( L, i, p,..., p, q,..., q ) + A ( R, n i +, p,..., p, q,..., q ) + σ ( p, q ) = i i i + n i + For enkelthets skyld skriver vi A(T) = A(L) + A(R) + σ(p,q) n

. Optimale søketrær La T ij være et søketre for nøklene K i,, K j, i, j n. (T ij er det tomme treet om j < i.) j j La + σ ( i, j) = + p k q k k = i k = i Formelen (rekursiv definisjon) for A(T i,j ) vil være som følger: A( T ) = min{ A ( T ) + A ( T )} + σ ( i, j ) ( ij = i, k k +, j j i k j A(T ii ) = + + σ(i,i) Kostnaden av det optimale treet finner vi i A(T,n- ).

./. Optimale søketrær En algoritme kan nå relativt enkelt lages ved å fylle ut en tabell med verdiene for A(T ij ) som definert av formelen (samme måte som for matrisemultiplikasjon): A( Tij ) = min{ A( Ti, k ) + A( Tk +, j )} + σ ( i, j) i k j A( T ii ) = + + σ ( i, j) I tillegg til verdien A(T ij ) må også en representasjon av de aktuelle trærne vedlikeholdes, slik at vi finner selve treet.

Fyller ut ulike typer tabeller Bottom up

Dynamisk Programering Utregning Dynamisk programmering er i realiteten en beregning av av en verdi bottom-up. Vi har fylt ut tabeller, meget regelmessig, men egentlig kan alle beregninger g som gjøres bottom-up i en rettet asyklisk graf (DAG) sees på som dynamisk programmering. (Trær er spesialtilfeller av DAG.)

Dynamisk Programering Utregning Dynamisk programmering er i realiteten en beregning av av en verdi bottom-up. Vi har fylt ut tabeller, meget regelmessig, men egentlig kan alle beregninger g som gjøres bottom-up i en rettet asyklisk graf (DAG) sees på som dynamisk programmering. (Trær er spesialtilfeller av DAG.)

(Partielle) k-trær

[ Blank ]

Korteste sti (alle til alle) Floyd Vi skal finne korteste sti mellom alle par av noder i en graf G=(V,E). Kantene har lengde, men vi antar at det ikke finnes negative sykler.. En sti p =<i <i, v,, v k, j > fra node i til node j består av endenodene i og j, og internnodene v,, v k. For alle par av noder i,, j, ser vi på korteste stier fra i til j som består av internnoder fra mengden {v,, v k }, og lar p være en av disse. Hvis v k er en internnode i p, består p av delstiene p (fra i til v k ) og p (fra v k til j). Delstiene p og p er stier med internnoder fra mengden {v,, v k - }; og p og p er korteste stier fra i til v k og fra v k til j, ellers ville ikke p vært en korteste sti fra i til j. Hvis k ikke er en internnode i p, er p en korteste sti fra i til j med internnoder fra mengden {v,, v k - }. (Optimalitetsprinsippet holder.)

Korteste sti (alle til alle) Floyd. La d (k) ij være lengden av korteste t sti fra i til j med dinternnoder fra mengden {v,, v k }. Når k = kan ikke stien bestå av internnoder i det hele tatt og d () ij vil altså tilsvare lengden av kanten ij. (Vi bruker w ij for lengden av kanten ij.) En rekursiv definisjon av d (k) ij vil være som følger: d ( k ) ij w ij min{ ( k ) = dij, v k ikke med ( k ) ( k ) div + d k v k j v k med i stien } hvis hvis k k = Matrisen D (n) = ( d (n) ij ), hvor n er antall noder i grafen, vil inneholde lengden av de korteste stiene mellom alle par av noder i, j. (Alle noder er nå lovlige mellomnoder.)

Korteste sti (alle til alle) Floyd. function FloydWarshall ( W ) n rows( W ) D () = W for k to n do for i to n do for j to n do d (k) ij min( d (k-) ij, d (k-) ik + d (k-) ik ) endfor endfor endfor return(d (n) ) end FloydWarshall

Korteste sti (alle til alle) Floyd 8-7 -5 5 6

Korteste sti (alle til alle) Floyd 8 8 7 - -5 7 8 D () = 5 6 6 5

Korteste sti (alle til alle) Floyd 8 8 7 - -5 D () = 7 8 5 6 6 5 5

Korteste sti (alle til alle) Floyd 8 8 7 - -5 D () = 5 7 8 5 6 6 5 5 5

Korteste sti (alle til alle) Floyd 8 8 7 - -5 D () = 5 7 8 5 6 6 5 5

Korteste sti (alle til alle) Floyd 8 7 - -5 D () = 5 7 5 6 6 5 8 5 5 7

Korteste sti (alle til alle) Floyd 8 7 - -5 D (5) = 5 7 5 6 6 5 8 5 5 7