Programmierung des Dijkstra-Algorithmus

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Alci
Beiträge: 29
Registriert: Mi 27. Mai 2009, 08:48
OS, Lazarus, FPC: Linux (L 0.9.26.2-0 FPC 2.2.2)
CPU-Target: 32Bit

Programmierung des Dijkstra-Algorithmus

Beitrag von Alci »

Ich habe für die Schule versucht den Dijkstra-Algorithmus zu programmieren, doch bin ich mit meinem Latein am Ende.
Ich kann eine Adjazenzmatrix erstellen. Der Graph ist als Klasse definiert und der Algorithmus sieht wie folgt aus:

Code: Alles auswählen

function TGraph.Dijkstra(Startknoten :  integer) : TWeg;                                                                           
var Vorgaenger, Distanz: array[1..MAXKNOTEN] of integer;                                                                           
    Erledigt: array[1..MAXKNOTEN] of boolean;                                                                                      
    Matrix: TAdjazenzmatrix;                                                                                                       
    AktKnoten, MinKnoten: integer;                                                                                                 
    i: integer;                                                                                                                    
 
    function Knoten_mit_kleinster_Distanz: integer;                                                                                
    var i: integer;                                                                                                                
        mindistanz: integer;                                                                                                       
    begin                                                                                                                          
      mindistanz:= maxEntfernung;                                                                                                  
      result:= -1;                                                                                                                 
      for i:= 1 to Knotenanzahl                                                                                                    
      do if (Distanz[i] < mindistanz) and (not Erledigt[i])                                                                        
         then begin                                                                                                                
                result:= i;                                                                                                        
                mindistanz:= Distanz[i];                                                                                           
              end;                                                                                                                 
    end;                                                                                                                           
 
begin                                                                                                                              
  Matrix:= Adjazenzmatrix;                                                                                                         
  for i:= 1 to Knotenanzahl                                                                                                        
  do begin                                                                                                                         
       Distanz[i]:= maxEntfernung;                                                                                                 
       Vorgaenger[i]:= 0;                                                                                                          
       Erledigt[i]:= false;                                                                                                        
     end;                                                                                                                          
  Distanz[Startknoten] := 0;                                                                                                       
  for i:= 1 to Knotenanzahl                                                                                                        
  do begin                                                                                                                         
       MinKnoten:= Knoten_mit_kleinster_Distanz;                                                                                   
       If MinKnoten <> -1                                                                                                          
       then begin                                                                                                                  
              Erledigt[MinKnoten]:= true;                                                                                          
              for AktKnoten:= 1 to Knotenanzahl                                                                                    
              do if (not Erledigt[AktKnoten]) and (Distanz[MinKnoten]+Matrix[MinKnoten,AktKnoten] < Distanz[AktKnoten])            
                 then begin                                                                                                        
                        Distanz[AktKnoten]:= Distanz[MinKnoten]+Matrix[MinKnoten,AktKnoten];                                       
                        Vorgaenger[AktKnoten]:= MinKnoten;                                                                         
                      end;                                                                                                         
            end;                                                                                                                   
     end;                                                                                                                          
  result.Anzahl:= 0;                                                                                                               
  for i:= 1 to Knotenanzahl                                                                                                        
  do begin                                                                                                                         
       if i <> Startknoten                                                                                                         
       then begin                                                                                                                  
              inc(result.Anzahl);                                                                                                  
              result.Kanten[result.Anzahl].Start:= Knoten[i];                                                                      
              result.Kanten[result.Anzahl].Ziel:= Knoten[Vorgaenger[i]];                                                           
            end;                                                                                                                   
     end;                                                                                                                          
end;

Code: Alles auswählen

procedure TForm1.MenuItem10Click(Sender: TObject);
var Graph: TGraph;
    Weg: TWeg;
    Ausgabe: String;
    i: integer;
    Startknoten: string;
    Zahl : integer;
begin
  Graph:= GetGraphFromForm;
  Startknoten := InputBox('Startknoten','Von wo starten?','');
  Ausgabe := '';
  if Startknoten <> '' then
  begin
    for i := 0 to Graph.Knotenanzahl do
    begin
      if Memo2.Lines[i] = Startknoten then
        Zahl := i;
    end;
    Weg := Graph.Dijkstra(i);
    for i := 1 to Graph.Kantenanzahl
    do Ausgabe:= Ausgabe+Weg.Kanten[i].Start+Weg.Kanten[i].Ziel+'-';
    ShowMessage(Ausgabe);
  end;
  Graph.free;
end;
Doch erhalte ich als Ergebnis immer nur das gleiche, ich hoffe mir kann jemand helfen oder einen Tipp geben. :)
Vielen Dank im Voraus!
Alci

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1620
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Programmierung des Dijkstra-Algorithmus

Beitrag von corpsman »

mir ist das zugegeben zu viel Code zum durchlesen, aber evtl hilft dir das weiter.
--
Just try it

Alci
Beiträge: 29
Registriert: Mi 27. Mai 2009, 08:48
OS, Lazarus, FPC: Linux (L 0.9.26.2-0 FPC 2.2.2)
CPU-Target: 32Bit

Re: Programmierung des Dijkstra-Algorithmus

Beitrag von Alci »

corpsman hat geschrieben:mir ist das zugegeben zu viel Code zum durchlesen, aber evtl hilft dir das weiter.
Ja es ist wirklich viel Code :(
Das Programm kenne ich schon habe es bei Google gefunden, kann mir aber nicht wirklich weiterhelfen. :(
Aber trotzdem danke für deine Mühe ;)

u-boot
Beiträge: 308
Registriert: Do 9. Apr 2009, 10:10
OS, Lazarus, FPC: Ubuntu 9.10 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 785..

Re: Programmierung des Dijkstra-Algorithmus

Beitrag von u-boot »

Mir ist es auch zu viel zum durchlesen. Werde aber in nächster Zeit selber den Dijkstra wohl implementieren. Evtl kann ich da was von abtreten, wenns wen interessiert
Ubuntu 9.10 (L 0.9.28 FPC 2.4.x)

Antworten