vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Suche Visual-Basic Code
A*-Pathfinder 
Autor: SnowWiesel
Datum: 16.05.04 18:54

Hallo!

Ich habe im Moment das Problem mit dem A-Star Algorithmus. Hat schon einmal einen einfachen VisualBasic-Code hierfür irgendwo gesehen?

Ich habe selbst schon viel probiert, aber ich komme auf kein Ergebniss. Aus diversen Informationen in Internet habe ich schon einen Algorithmus programmiert, der dem A-Star entspricht, aber es sind noch Fehler enthalten welche ich nicht finden kann. Alle Beschreibungen auf diesem Bereich die ich habe sind immer an wichtigen Punkten nicht eindeutig definiert und habe deswegen aus den verschiedensten Informationen einen Code programmiert der eben nicht laufen will seit Tagen.

Im Grunde benötige ich nur einen VB-Code, der die folgenden Eigenschaften besitzt:

a) 1 und 0 für ein Hinderniss
b) beliebige 2D-Matrix (Array) für alle Daten der Hindernisse
c) Ein Resultat des Wegs oder eine Information wenn kein Weg gefunden werden kann
d) evtl. noch eine Möglichkeit möglichst wenige Ecken zu gehen, also viele Geraden

Mehr dazu steht im nicht funktionierenden Code unten den ich geschrieben hatte.

MfG Wolfgang

Anbei noch den aktuellen Code. Ich habe es in Excel einmal geschrieben unter VBA um den Fehler zu finden. Ist aber auch unter VB lauffähig:

Wenn der kompletteCoe interessant sein sollte, dann kann man ihn auch unter http://www.wieselsworld-online.de/Astar.zip downloaden, da habe ich mal die "Baustelle" abgelegt.

Private Sub ASternRun()
 
  'A*-Algorithmus beginnen
 
  NodeStart.X = PAX                                              'Startpunkt im 
  ' Start Node merken
  NodeStart.Y = PAY
  NodeZiel.X = PBX                                               'Zielpunkt im 
  ' Ziel Node merken
  NodeZiel.Y = PBY
  NodeCurrent = NodeStart                                        'Start Node 
  ' dem Current Node zuweisen
  Call PutIntoOpenList(NodeStart)                                'Startpunkt in 
  ' die OPEN-List setzen
  Fertig = False                                                 'Solange die 
  ' OPEN-List nicht leer ist wiederholen
  Counter = 0
  Do While Not Fertig
    Nr = GetLowestNodeFromOpenListF                              'In der Liste 
    ' nach dem Node mit den geringsten F-Kosten suchen ...
    NodeCurrent = OpenList(Nr)                                   'Dieses Node 
    ' als als Current Node definieren
    If PointIsEqual(NodeCurrent, NodeZiel) Then Fertig = True    'Wenn das 
    ' Current Node gleich dem Ziel Node ist, dann ist der Weg gefunden
    Call MoveNodeFromOpenToCloseList(NodeCurrent)                'Das Current 
    ' Node von der OPEN-List in die CLOSE-List verschieben
    Call SearchSuccessNodes                                      'Alle 
    ' umliegenden Nodes ermitteln die begehbar sind
    If MaxNodeSuccessor > 0 Then                                 'Prüfen ob 
    ' ein begehbares Node vorhanden ist
      For AktNodeSuccessor = 1 To MaxNodeSuccessor               'Jedes der 
      ' gefundenen umliegenden Successor Nodes überprüfen
        NodeTest = NodeSuccessor(AktNodeSuccessor)
        If Not IsInOpenList(NodeTest) Then                       'Das Node ist 
        ' noch nicht in der OPEN-List
          Call PutIntoOpenList(NodeTest)                         'Das Node zur 
          ' OPEN-List hinzufügen
          MatrixKarte(PosArr(NodeTest)).X = NodeCurrent.X        'Die 
          ' Parent-Eigenschaft des Nodes auf das Current Node umschreiben
          MatrixKarte(PosArr(NodeTest)).Y = NodeCurrent.Y
          Call CalcKosts(NodeTest)                               'Berechnen der 
          ' Kosten für das Node
        Else
          OldG = MatrixKarte(PosArr(NodeTest)).G                 'Bisherige 
          ' G-Kosten des Nodes ermitteln
          NewG = CalcG(NodeTest)
          If NewG < OldG Then                                    'Wenn die 
          ' neuen G-Kosten geringer sind, dann die neuen übernehmen
            NodeCurrent.X = OpenList(Nr).X                       'Das Node als 
            ' neues Current Node definieren
            NodeCurrent.Y = OpenList(Nr).Y
            Call CalcKosts(NodeTest)                             'Berechnen der 
            ' Kosten für das Node
            Call SortOpenListByF                                 'Die OPEN-List 
            ' neu sortieren nach den F-Kosten
          End If
        End If
      Next AktNodeSuccessor
    End If
    If MaxOpenList = 0 Then Fertig = True
    Counter = Counter + 1
  Loop
End Sub
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
A*-Pathfinder1.427SnowWiesel16.05.04 18:54
Re: A*-Pathfinder856E717.05.04 16:52
Re: A*-Pathfinder770SnowWiesel17.05.04 21:30
Re: A*-Pathfinder755Unilein22.03.05 16:52
Re: A*-Pathfinder822E722.03.05 18:40

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel