INF 295 Forelesning 19 Dynamisk programmering Korteste vei

  • Slides: 7
Download presentation
INF 295 Forelesning 19 Dynamisk programmering Korteste vei alle til alle (Floyd) Hans Fr.

INF 295 Forelesning 19 Dynamisk programmering Korteste vei alle til alle (Floyd) Hans Fr. Nordhaug (Ola Bø)

Dynamisk programmering (DP) l l l Kan gi optimale løsninger. Problemer som ser ut

Dynamisk programmering (DP) l l l Kan gi optimale løsninger. Problemer som ser ut til å kreve eksponentiell tid, kan løses i polynomisk tid. Algoritmene som oppstår ved bruk av DP er som regel ganske enkle med nøstede forløkker for utfylling av en tabell. Floyds algoritme er et eksempel på DP

Dynamisk programmering l l l Problemet må kunne deles opp (gjentatte ganger) i enkle

Dynamisk programmering l l l Problemet må kunne deles opp (gjentatte ganger) i enkle delproblem som kan defineres lett og dermed lagres i en tabell. Løsning (optimum) for problemet må kunne settes sammen av løsning for delproblem. Løsninger til ikke-relaterte delproblem kan inneholde felles delproblem.

Korteste vei alle til alle Floyds algoritme l l Beregnes korteste vei mellom alle

Korteste vei alle til alle Floyds algoritme l l Beregnes korteste vei mellom alle par av punkter i en rettet graf O(|V|3) Samme problem kan løses ved å kjøre korteste vei fra en til alle (Dijkstra) i alle noder O(|V|3) Floyd er trolig raskere ved tette grafer pga korte sløyfer Grunntanke: l Hvis veien fra i til k er ik og veien fra k til j er kj, så går det en vei fra i gjennom k til j med lengde ik+kj

Floyds algoritme l l Start med avstand mellom noder lik vekten til kanten som

Floyds algoritme l l Start med avstand mellom noder lik vekten til kanten som binder dem sammen eller uendelig hvis det ikke er noen direkte kant. Trinn 0 se etter forbedringer med node 0 som mellomledd Trinn k: Avstanden mellom to noder er den korteste veien som bare bruker nodene 0, 1, . . . , k Forbedring ved å gå gjennom k bygger på avstanden fra i til k og fra j til k som bruker nodene 0, 1, . . k-1 Avstanden mellom noder lagres i en |V|*|V| array