StartAlgorytmyAlgorytmy grafoweWyznaczanie najkrótszej drogi w grafie dla znanej odległości
Baza Wiedzy
Wersja offline serwisu przeznaczona na urządzenia z systemem Android.

Darowizny
darowiznaWspomóż rozwój serwisu


Nagłówki RSS
Kanał artykuły
Kanał implementacje
Kanał komentarze
Kanał forum


Bookmarki









Sonda
Implementacji w jakim języku programowania poszukujesz?
 
Wyznaczanie najkrótszej drogi w grafie dla znanej odległości
Ocena użytkowników:++++- / 9
SłabyŚwietny 
Wpisany przez Michał Knasiecki
wtorek, 09 sierpnia 2005 20:30
Poniższy algorytm służy do wyznaczania w grafie ciągu wierzchołków us, us+1...ut tworzących drogę między wierzchołkami us i ut o długości d(us,ut). jest on najczęściej używany razem z algorytmem wyznaczania najmniejszej odległości między wierzchołkami (algorytm Forda-Bellmana, algorytm Dijkstry). Po wyznaczeniu najkrótszej odległości d(us,ut) między parą wierzchołków w grafie możemy skonstruować drogę między tymi wierzchołkami taką, że suma wag jej krawędzi jest równa d(us,ut).
Chcemy wyznaczyć drogę między wierzchołkami us i ut o najkrótszej długości.
Załóżmy więc, że dla danego grafu opisanego za pomocą macierzy wag krawędzi A wywołaliśmy algorytm wyznaczania najkrótszej odległości od ustalonego wierzchołka (us) do wszystkich pozostałych i w jego wyniku otrzymaliśmy wektor D- tablicę tych odległości. Z wektora tego odczytujemy najmniejszą odległość między wierzchołkami us i ut: D[ut]=d(us, ut).
Po wykonaiu poniższego algorytmu na stosie otrzymamy ciąg wierzchołków us...ut będących drogą między wierzchołkiem us i ut o długości d(us, ut).
Algorytm przebiega w sposób następujący:
  1. Zainicjuj stos S, odłóż na stos wierzchołek końcowy, czyli ut, podstaw v=ut
  2. while v<>us do
  3. {
  4. znajdź wierzchołek u taki, że D(v)=D(u)+A[u,v]
  5. odłóż u na stosie S
  6. podstaw v=u
  7. }
Przeanalizujmy teraz prosty przykład:
oto graf i jego reprezentacja w postaci macierzy wag krawędzi.
Przyjmujemy Us=1, symbol "*" oznacza nieskończoność:

Image Image
Jak widać z macierzy wag graf ten ma krawędzie o ujemnych wagach, musimy więc zastosować algorytm Forda-Bellmana. W wyniku jego działania otrzymamy wektor D postaci: D[1]=0, D[2]=2, D[3]=4, D[4]=2, D[5]=5, D[6]=4. W implementacji umieszczonej na stronie wierzchołkiem, względem którego wyznacza się najkrótsze odległości jest wierzchołek o indeksie 1, dlatego też D[1]=0. Musimy teraz wybrać drugi wierzchołek- końcowy, niech będzie to wierzchołek nr. 5. Z wektora D odczytujemy najmniejszą odległość między wierzchołkami 1 i 5 D[5]=d(1,5)=5. chcemy wyznaczyć drogę łączącą wierzchołek 1 i 5 o długości równej 5.
Po wykonaniu pierwszej linii algorytmu otrzymamy anstępujące parametry:
Stos={5}v=5D[v]=5u=?D[u]+A[u,v]=?
Poszukujemy teraz wierzchołka u. Logika nakazuje sprawdzanie wartości D[u]+A[u,v] tylko dla tych wierzchołków u, które są poprzednikami wierzchołka v. W naszym przypadku poprzednikami wierzchołka 5 są wierzchołki 2, 3 i 6. Sprawdzamy więc: D[2]+A[2,5]=2+4=6<>D[5], D[3]+A[3,5]=4+3=7<>D[5] a D[6]+A[6,5]=4+1=5=D[5]. Znależliśmy wierzchołek u=6 wykonujemy zatem instrukcje 5 i 6 algorytmu:
Stos={5,6}v=6D[v]=4u=?D[u]+A[u,v]=?
Tym razem nie mamy zbyt dużego wyboru, gdyż jedynym poprzednikiem wierzchołka nr. 6 jest 4. A więc D[4]+A[4,6]=2+2=4=D[6], zatem m=4. Dalej algorytm przebiega podobnie:
Stos={5,6,4}v=4D[v]=2u=3D[u]+A[u,v]=4+(-2)=4
Stos={5,6,4,3}v=3D[v]=4u=1D[u]+A[u,v]=0+4=4
Tu algorytm się kończy, gdyż w następnej iteracji v=1. A zatem droga między wierzchołkiem 1 i 5 o długości 5 jest następująca: (1,3,4,6,5)



Autor Język programowania Komentarz Otwórz Pobierz Ocena
Michał Knasiecki C/C++
Implementacja w C/C++
Implementacja w C/C++
+++-- / 3
 
Dodaj własną implementację tego algorytmu
  • Zaloguj się na stronie
Plik:
Język programowania:
Komentarz:
  By móc dodać implementacje zaloguj się na stronie



Poprawiony: czwartek, 27 maja 2010 18:51

Dodaj komentarz

Kod antysapmowy
Odśwież