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
 
#6

Re: A-Stern funktioniert nicht...

  Alt 6. Jan 2006, 17:56
Sodele... Algo geändert. Er funktioniert auch, aber nicht immer... Das Ding hat bis gerade ganz schöne Kapriolen geschlagen, aber wie soll es auch anders, wenn ich ihm für Bloodstreams negative Kosten geb
Die Kosten sollten jetzt alle stimmen, aber manchmal kommt er leer zurück:

Code:
FStartNode = AStartNode;
   FGoalNode = AGoalNode;
   FOpenList.Add(FStartNode);

        while (FOpenList.Count > 0)
            {
                // Get best node and move to closed list
                AStarNode NodeCurrent = (AStarNode)FOpenList.Pop();
                FClosedMatrix[((NetNode)NodeCurrent).Coords.X, ((NetNode)NodeCurrent).Coords.Y] = true;
                //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))
                        {
                            SkipNode = true;
                            break;
                        }
                    }
                    if (SkipNode)
                        continue;
                    */
                    /*if (FClosedList.Contains(NodeSuccessor))
                        continue;*/
                    if (FClosedMatrix[((NetNode)NodeSuccessor).Coords.X, ((NetNode)NodeSuccessor).Coords.Y])
                       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);
                    }
                }
            }
Das ganze auskommentierte Zeug liegt daran, dass ich hier meine Closed-Liste ein wenig umgebaut habe(siehe Link in vorigem Post).
Fällt jemandem ein Fehler auf?
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