Autor Beitrag
missy
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 09.04.05 17:03 
hallo, ich will den kürzesten Weg berechnen, weiß nich so recht wie ich das anstellen soll, könntet ihr mir vllt tipps geben?? der erklären wie ich das machen soll?

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
  procedure versuch(x,y:Integer);
   var neuesx, neuesy, z: Integer;
       Nachbarpunkte: Array[1..4of TPunkt;

  begin
     z:=1;
     Nachbarpunkte[1].xKo:=x;
     Nachbarpunkte[1].yKo:=y-1;
     Nachbarpunkte[2].xKo:=x-1;
     Nachbarpunkte[2].yKo:=y;
     Nachbarpunkte[3].xKo:=x;
     Nachbarpunkte[3].yKo:=y+1;
     Nachbarpunkte[4].xKo:=x+1;
     Nachbarpunkte[4].yKo:=y;
     repeat
      neuesx:=Nachbarpunkte[z].xKo;
      neuesy:=Nachbarpunkte[z].yKo;
      if (StringGrid1.cells[neuesx,neuesy] <> 'Schildk.'and
         (StringGrid1.cells[neuesx,neuesy] <> 'Wand'and
         (StringGrid1.cells[neuesx,neuesy] <> 'X'then
      begin
       If StringGrid1.cells[neuesx,neuesy] = 'Apfel' then
         begin
           ShowMessage('Lösung gefunden');
           anzahl := anzahl + 1;
           edit1.text := inttostr(anzahl);
         end
       else  {freier Weg}
         begin
           StringGrid1.cells[neuesx,neuesy] := 'X';
           delay(200);
           versuch(neuesx, neuesy);  {rekursiver Aufruf}
           StringGrid1.cells[neuesx,neuesy] := ' ';
           delay(200);
         end;
      end;
      z := z + 1;
     until (z = 5);
     end;



Moderiert von user profile iconChristian S.: Topic aus Multimedia / Spiele / Grafik verschoben am So 10.04.2005 um 00:33
Leto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

XP
D7 Enterprise
BeitragVerfasst: Sa 09.04.05 22:58 
ich gebe zu mich nicht tiefer in den Coide hineingelesen zu haben... Willst du den kürzesten Weg in einem Wegeenetz (Knoten & Kanten) suchen?
Dann würd ich sagen: Entfernungsmatrix erstellen und Dijkstra oder Nichelson-Algorithmus rüberprügeln lassen.

_________________
Carpe Noctem
missy Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 09.04.05 23:44 
ich freu mich über eine antwort !!! =) ohjee aber was bidde?? hmm also entweder du bist so nett und liest denn code dochma durch, oder überfliegst ihn ;o) oder hmm erläutern? oder ich mach mich mit deinen vorschägen shclau bei google oder so..
is momentan etwas späd muss noch lernen, schaue morgen.... ich muss das hier bis dienstag fertig machen,also binw irklich über jede hilfe dankbar!!
Leto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

XP
D7 Enterprise
BeitragVerfasst: So 10.04.05 00:17 
Au... ich hätt den Code wirklich erstmal angucken sollen. Sieht mir also ja eher danach aus, als ob dein "Wegenetz" nicht wirklich aus Knoten und Kanten besteht, sondern du eher eine Art StringGitter als Karte benutzt mit einzelnen String als Kartenobjekte. Jetzt verstehe ich also richtig, dass du von einem gegeben Startpunkt aus (also ein bestimmtes feld im Gitter) den küresten Weg zu einem anderen Feld suchst (durch X kann man durchgehen, durch alles andere nicht, zum Apfel will man...)?

Prinzipiell ist der Dikstra immer noch möglich, aber vielleicht nicht unbedingt optimal, eine Entfernungsmtarix aufzustellen.
Da wirst du bei der Rekusrion bleiben müssen, dnke ich. Hiermal ein Schnellschuss:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
Bewertungsfunktion(newX, newY, oldX, oldY): Integer;
begin
  //Wenn neues Feld = Wand dann liefere -1 zurück und exit.
  //Wenn neues feld = Ziel, dann liefere 0 zurück und exit
  //Rufe rekuriv Bewertungsfunktion für Nachbarfelder auf (aber nicht die alte Position) und merke dir die Rückgabewerte
  //Gebe den Wert der niedrigten Bewerungsfunktion zurück + 1 (-1 sind Sachgassen, also nicht zurückliefern, außer wenn alles Sackgassen)
end;


Die Bewertungsfunktion prüft also für jedes feld die Wegstrecken zum Ziel. Der Startaufruf wäre also GesamtLangeZumZiel := Bewertungsfunktion(PosX, PosY, -1, -1), wobei die -1 nur bedeutet, dass beim ersten Mal alle Nachbarn geprüft werden müssen. Das gibt dir also die Länge zum Ziel zurück. Wenn du den Weg auch noch brauchst, müsst du dir bei jeweilgen günstigsten Pfad die entsprechende Position in einer Liste merken, so dass ma Ende eine List mit den entsprechenden Pfadpositionen der Reihenfolge nach entsteht.
Es ist spät, kann sein, dass ich grad nen Denkfehler habe...

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.

_________________
Carpe Noctem
missy Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mo 11.04.05 15:38 
hmmm :?: ob das hinkrieg :oops:
HolgerB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 91

Win XP
D6 Pers
BeitragVerfasst: Mo 11.04.05 15:50 
Hallo,

schau dir mal hier das erste und dritte Tutorial an:

www.dsdt.info/tutorials/index.php?cat=8

Gruß
Holger
Leto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

XP
D7 Enterprise
BeitragVerfasst: Do 14.04.05 18:42 
Nach dem ich heute meinen eigenen Post nochmal durchgelesen habe, muss ich feststellen, das dein problem NICHT durch einfaches Backtracking gelöst werden kann, weil die Rekusrion nicht zielgerichtet ist, sondern unedlich verlaufen kann.

Daher ist der Dijkstra wohl eine bessere Wahl als zuerst angenommen.

Andernfalls (was wieder mal stark in die Richtung von Rekursion geht), solltest du dir die Idee der Spannbäume mal anschauen, mir deren Hilfo soetwas sicherlich gut gelöst werden kann.

_________________
Carpe Noctem