[laenge,weg]=kuerzesterweg(anfang,ende,entfernung,babnr,name)

Werbung
function [laenge,weg]=kuerzesterweg(anfang,ende,entfernung,babnr,name)
k=size(entfernung,1);
A_0=zeros(1,k); %Indexvektor der Knoten,
A_0(anfang)=1; %Der Minimalabstand zum Anfang ist bekannt (=0)
B=zeros(1,k); %Indexvektor der Knoten,
Erste=zeros(k); %Indexmatrix der Kanten
Zweite=zeros(k); %%Indexmatrix der Kanten
A_1=anfang; %Knoten in A_0, von dem aus weitergesucht wird.
M=Inf*ones(1,k); %gibt die Minimalabstände an
L(anfang)=0;
B_0=0; %B_0 gibt später an, ob B leer ist, oder nicht.
while A_0(ende)~=1
S=find(entfernung(A_1,:)< Inf); %alle Kanten, die mit A_1 beginnen
for i=1:length(S) %für Lange alle Kanten in S:
if B(S(i))==1
if L(A_1)+entfernung(A_1,S(i))<L(S(i))
L(S(i))=L(A_1)+entfernung(A_1,S(i)); % Minimalabstand
m=1;
while zwiete(m,S(i))~=1
m=m+1;
end % m ist so gewählt, dass (m,S(i)) in zweite liegt
zweite(m,S(i))=0; %Entferne die Kante (m,S(i)) aus zweite
zweite(A_1,S(i))=1; %(A_1,S(i)) ist jetzt zweite
end
else
if B(S(i))==0 & A_0(S(i))==0
B(S(i))=1;
L(S(i))=L(A_0)+entfernung(A_1,S(i));
Zweite (A_1,S(i))=1;
end
end
if B==0
B_0=1; %B ist leer
break
else
S=find(B==1);
[a b]=min(L(S)); %L(S(b)) ist minimal für alle i mit B(S(i))=1
u=S(b); % L(u) minimal über alle elemente von B
b=1;
while zweite(b,u)~=1
b=b+1; % b ist jetzt der Knoten,
end
erste(b,u)=1;
zwiete(b,u)=0; %(k,u) wurde von zweite nach erste bewegt
A_0(u)=1;
B(u)=0; %u wurde von B nach A_0 bewegt
A_1=u;
%
end
end
if B_0==1 %heisst: Erreichbarkeit ist nicht gegeben
weg=[];
laenge=Inf;
disp([' kein Weg von ' name(anfang,:)]);
disp(['nach ' name(ende,:)]);
else
weg=zeros(1,k);
weg(k)=ende; % Aufbau des kürzesten Wegs von 'anfang' nach 'ende'
n=k;
while weg(n)~=anfang
w=find(erste(:,weg(n))==1); %Suche nach der Kante in erste,
weg(n-1)=w(1);
weg(k-1)
n=n-1;
end
weg=weg(n:k); %Schneide den überflüssigen Anfangsstück ab. Resultat
%ist: weg(1)=anfang
laenge=M(ende); %hier ist A_1=ende, somit ist L(A_1) der gesuchte Abstand
disp(['Von ' name(weg(1),:)]);
for i=1:length(weg)-1;
disp(['
auf der Autobahn A_0 ' int2str(babnr(weg(i), weg(i+1))) '
' name(weg(i+1),:)]);
end
end
bis
Herunterladen