AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

wegsuche in delphi?

Ein Thema von sweetmusic · begonnen am 18. Mai 2004 · letzter Beitrag vom 19. Mai 2004
Antwort Antwort
Tryer

Registriert seit: 16. Aug 2003
200 Beiträge
 
#1

Re: wegsuche in delphi?

  Alt 19. Mai 2004, 18:19
Hier findst Du ein recht gutes Tutorial zum A*-Algorithmus, auf dessen Basis hab ich selber auch erfolgreich eine Wegsuche realisiert. Falls Du danach festgestellt hast das der Algorithmus für Dich brauchbar ist hilft Dir das folgende vielleicht etwas weiter.

Der A* Algorithmus an sich ist eine Kombintion verschiedener anderer Algorithmen, er hat den Vorteil recht schnell zu sein und findet den Weg zum Ziel auf jeden Fall (so es denn einen gibt). Wenn er einen Weg findet dann ist das auf jeden Fall auch der günstigste Weg (entsprechend der Definition der Wegkosten).

Durch die Reihenfolge in der man neue potentielle Wegpunkte während der Suche aufnimmt lässt sich in gewissem Rahmen die Form des Weges (mgl. eckig (handlich für Browsergames), mgl. diagonal, ..) beeinflussen.
Die Übernahme neuer potentieller Wegpunkte ist der Knackpunkt des Algorithmus. Hier lassen sich auch leicht Erweiterungen wie z.B. Wurmlöcher oder Strassen (k.A. was Du für ein Spiel proggst)mit einpflegen die dann in die Berechnung des optimalen Weges mit einfliessen.

Du solltest in jedem Fall dem Hinweis im Tutorial folgen und einen binären Suchbaum (BinHeap) für die offenen Wegpunkte verwenden, das bringt einiges an Performance.
Wenn zu einem Zeitpunkt immer nur ein Weg gesucht werden soll dann bietet es sich an innerhalb der Map auch sofort die Daten für die Wegsuche mit abzulegen, das kostet zwar Speicherplatz aber es beschleunigt die Suche nochmal enorm da nicht immer wieder Referenzen zwischen Kartendaten und Wegdaten hergestellt werden müssen.

Ich habs bei mir so realisiert:
Delphi-Quellcode:
  TCoords = packed record
    case LongInt of
     0: (Y, X: Word);
     1: (XY: DWord);
  end;

  PPMapItem = ^PMapItem;
  PMapItem = ^TMapItem;
  TMapItem = record
    Parent: PMapItem; // Feld von dem dieses Feld erreicht wurde (>Weg<)
    Coord: TCoords; // Map-Koordinaten (entspricht Array-Index)
    GCost: Byte; // Fixe Einflugkosten für dieses Feld (Terrainkosten)
    GWCost: LongWord; // Flugkosten vom Start zu diesem Punkt
    HCost: LongWord; // angenommene Flugkosten bis Ziel (Heuristic)
    Region: Byte; // Durchflugberechtigung?
    BinHeapPos: LongWord; // Position im BinHeap (für schnelleres ReSort nach Änderung von GWCost)
    IsClosed: Boolean; // Feld als Wegpunkt übernommen?
  end;

  TMapArray = array of array of TMapItem;
Durch das "IsClosed" spare ich mir zusätzlich auch die Liste der übernommenen Wegpunkte, das bringt nochmal einiges an Performance da ich bei neu übernommenen Wegpunkten nicht suchen muss ob diese bereits einmal erreicht wurden.

MfG,
Tryer
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz