Musterlösung Tiefensuche
Die Tiefensuche gliedert sich auf in ein Startskript und eine Funktion, die dann rekursiv aufgerufen wird.
tiefensuche.m
%% Tiefensuche
% Die Tiefensuche schreit nach einer rekursiven Programmierung.
clc
global Gefunden
% Parameter definieren
StartID = 1; % Startpunkt
SucheObj = 'N'; % Was wird gesucht
Gefunden = false;
TiefensucheFkt(StartID,SucheObj);
%% Finale Ausgabe
if Gefunden
disp('Suche erfolgreich')
else
disp('Suche nicht erfolgreich')
end
Rekursive Funktion:
tiefensucheFkt.m
function tiefensucheFkt(AktKnoten,SucheObj)
%% Rekursiver Teil der Tiefensuche
%
global Graph Gefunden SchonBesucht
disp(['Jetzt bei ' num2str(AktKnoten) ' => ' Graph(AktKnoten).Name ])
SchonBesucht = [SchonBesucht AktKnoten];
if strcmp(Graph(AktKnoten).Name,SucheObj)
Gefunden = true;
disp('Gefunden !!!')
end
%% Visualisierung
figure(1)
hold on
ph = plot(Graph(AktKnoten).x,Graph(AktKnoten).y,'ro');
set(ph,'MarkerSize',22)
hold off
waitforbuttonpress
%% Zugriff auf die verschiedenen Nachbarn unter div Bedingungen
% 1. Ist das Objekt schon gefunden?
% 2. Sind schon alle Nachbarn abgearbeitet?
% 3. Ist der nächste Knoten schon besucht worden?
jj = 1;
while ( ~Gefunden && length(Graph(AktKnoten).Nachbarn) >= jj )
if ~(any(SchonBesucht == Graph(AktKnoten).NachbarnID(jj)))
disp([' von ' Graph(AktKnoten).Name ' nach ' Graph(AktKnoten).Nachbarn(jj)])
tiefensucheFkt(Graph(AktKnoten).NachbarnID(jj),SucheObj)
end
jj = jj+1;
end
Der Aufruf in MatLab erfolgt mit:
>> makegraph
>> tiefensuche % mehrmals die Eingabetaste betätigen, um den Ablauf der Tiefensuche vom Knoten A zum Knoten N zu visualisieren!!!
bzw.:
>> makegraph
>> tiefensucheFKT(startID z.B. 1, Zielbuchstabe als String z.B. 'J') % mehrmals die Eingabetaste betätigen, um den Ablauf zu visualisieren!!!
Viel Erfolg beim Ausprobieren.