Musterlösung Breitensuche

breitensuche.m
% Breitensuche
%
% Die Breitensuche startet an einem Punkt. Es muss überprüft werden, ob der
% Punkt bereits das gesuchte Objekt ist. Ist dies nicht der Fall, so werden
% die Nachbarn dieses Punktes in einen Zwischenspeicher geschrieben, welcher
% alle Punkte enthält, die noch besucht werden müssen. Dies geschieht aber
% nur dann, wenn der neu erfasste Nachbarpunkt noch nicht in der Liste
% aufgetaucht ist.
%
% Anschliessend wird der nächste Punkt im Zwischenspeicher/Puffer
% ZuBesuchen untersucht.
%

global Graph
% Parameter definieren
StartID = 1; % Startpunkt
SucheObj = 'G'; % Was wird gesucht

ZuBesuchen = [StartID];

Gefunden = false;
AktKnoten = StartID;

%% Suche Starten
% In dieser Sektion wird die eigentliche Suche ausgeführt. Die Reihenfolge,
% in der die Knoten besucht werden, ergibt sich aus den Nachbarn der schon
% besuchten Knoten. Am Anfang befindet sich nur der Startknoten in der
% Suchliste ZuBesuchen.

jj = 1;
while ~Gefunden
% Gefunden?
if strcmp(Graph(AktKnoten).Name,SucheObj)
break
end

% Wenn Nachbarknoten noch nicht auf der Suchliste, dann hinzufügen
for ii = 1:length(Graph(AktKnoten).Nachbarn)
if ~(any(ZuBesuchen == Graph(AktKnoten).NachbarnID(ii)))
ZuBesuchen = [ZuBesuchen Graph(AktKnoten).NachbarnID(ii)];
end
end

% Visualisierung
figure(1)
hold on
ph = plot([Graph(AktKnoten).x Graph(ZuBesuchen(jj)).x],[Graph(AktKnoten).y Graph(ZuBesuchen(jj)).y], ...
'ro ');
set(ph,'MarkerSize',22)
hold off
waitforbuttonpress

%nächster Knoten
AktKnoten = ZuBesuchen(jj);
disp(['Jetzt zu ' Graph(AktKnoten).Name])
jj = jj+1;
end

%% Abschluss
disp('Suchobjekt gefunden')


Der Aufruf in MatLab erfolgt mit:

>> makegraph
>> breitensuche % mehrmals die Eingabetaste betätigen, um den Ablauf der Breitensuche vom Knoten A zum Knoten G zu visualisieren!!!

Auch die Breitensuche hätte rekursiv programmiert werden können, worauf wir hier aber verzichten.