Einzelnen Beitrag anzeigen

Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

A-Stern funktioniert nicht...

  Alt 6. Jan 2006, 13:03
Hallo,

mal wieder eine C#-Frage von mir.

Ich habe mir nach Anleitung von http://www.policyalmanac.org/games/a...torial_de.html aus einer A*-Klasse, die leider nicht funktionierte, selber was zusammengeschwartet... das allerdings nix findet, sprich endlos loopt.

Code:
   FStartNode = AStartNode;
   FGoalNode = AGoalNode;
   FOpenList.Add(FStartNode); //FOpenList ist alway-sorted

        while (FOpenList.Count > 0)
            {
                // Move best node to closed list
                AStarNode NodeCurrent = (AStarNode)FOpenList.Pop();
                FClosedList.Add(NodeCurrent);

                // investigate Successors
                ArrayList ASuccessors = new ArrayList(4);
                NodeCurrent.GetSuccessors(ASuccessors);
                foreach (AStarNode NodeSuccessor in ASuccessors)
                {
                    //If Node is Goal, write path and leave
                    if (NodeSuccessor.IsSameState(FGoalNode))
                    {
                        FSolution.Clear();
                        AStarNode Node = NodeSuccessor;
                        while (Node != null)
                        {
                            FSolution.Insert(0, Node);
                            Node = Node.Parent;
                        }
                        FOpenList.Clear(); // to exit main loop
                        break;
                    }

                    //If Node in Closed List, we skip it
                    bool SkipNode = false;
                    foreach (AStarNode NodeClosed in FClosedList)
                    {
                        if (NodeClosed.IsSameState(NodeSuccessor)) //IsSameState überprüft, ob die Nodes den gleichen Ort haben
                        {
                            SkipNode = true;
                            break;
                        }
                    }
                    if (SkipNode)
                        continue;

                    //If Node in Open List and cost higher, change it, else skip it
                    AStarNode NodeOpen = null;
                    foreach (AStarNode N in FOpenList)
                    {
                        if (N.IsSameState(NodeSuccessor))
                            NodeOpen = N;
                    }
                    if (NodeOpen != null && NodeOpen.Cost > NodeSuccessor.Cost)
                        NodeOpen = NodeSuccessor;
                    else if (NodeOpen == null)
                    {
                        FOpenList.Add(NodeSuccessor);
                    }
                }
            }
      }
Wäre vielleicht jemand so nett, das mal anzusehen und mir zu sagen, ob ich da Fehler drin hab?

EDIT: hach, das funzt ja sogar
kaum lässt mans mal 10 Minuten laufen....
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat