Пример #1
0
 public Track(Track PreviousTrack, SimRoute Transition)
 {
     if (_Target == null) throw new InvalidOperationException("You must specify a target Node for the Track class.");
     Queue = PreviousTrack;
     _Cost = Queue.Cost + Transition.Cost;
     _NbArcsVisited = Queue._NbArcsVisited + 1;
     EndNode = Transition.EndNode;
 }
Пример #2
0
 public Track(SimWaypoint GraphNode)
 {
     if (_Target == null) throw new InvalidOperationException("You must specify a target Node for the Track class.");
     _Cost = 0;
     _NbArcsVisited = 0;
     Queue = null;
     EndNode = GraphNode;
 }
Пример #3
0
 private SimWaypoint[] GoBackUpNodes(Track T)
 {
     int Nb = T.NbArcsVisited;
     SimWaypoint[] Path = new SimWaypoint[Nb + 1];
     for (int i = Nb; i >= 0; i--, T = T.Queue)
         Path[i] = T.EndNode;
     return Path;
 }
Пример #4
0
 private void Propagate(Track TrackToPropagate)
 {
     foreach (SimRoute A in TrackToPropagate.EndNode.OutgoingArcs)
     {
         if (A.Passable && A.EndNode.IsPassable)
         {
             Track Successor = new Track(TrackToPropagate, A);
             int PosNF = _Closed.IndexOf(Successor, SameNodesReached);
             int PosNO = _Open.IndexOf(Successor, SameNodesReached);
             if (PosNF > 0 && Successor.Cost >= ((Track)_Closed[PosNF]).Cost) continue;
             if (PosNO > 0 && Successor.Cost >= ((Track)_Open[PosNO]).Cost) continue;
             if (PosNF > 0) _Closed.RemoveAt(PosNF);
             if (PosNO > 0) _Open.RemoveAt(PosNO);
             _Open.Add(Successor);
         }
     }
 }
Пример #5
0
        /// <summary>
        /// Use for a 'step by step' search only. This method is alternate to SearchPath.
        /// The algorithm must have been initialize before.
        /// </summary>
        /// <exception cref="InvalidOperationException">You must initialize AStar before using NextStep().</exception>
        /// <returns>'true' unless the search ended.</returns>
        public bool NextStep()
        {
            if (!Initialized) throw new InvalidOperationException("You must initialize AStar before launching the algorithm.");
            if (_Open.Count == 0) return false;
            _NbIterations++;

            int IndexMin = _Open.IndexOfMin();
            Track BestTrack = (Track)_Open[IndexMin];
            _Open.RemoveAt(IndexMin);
            if (BestTrack.Succeed)
            {
                _LeafToGoBackUp = BestTrack;
                _Open.Clear();
            }
            else
            {
                Propagate(BestTrack);
                _Closed.Add(BestTrack);
            }
            return _Open.Count > 0;
        }
Пример #6
0
 /// <summary>
 /// Use for a 'step by step' search only. This method is alternate to SearchPath.
 /// Initializes AStar before performing search steps manually with NextStep.
 /// </summary>
 /// <exception cref="ArgumentNullException">StartNode and EndNode cannot be null.</exception>
 /// <param name="StartNode">The node from which the path must start.</param>
 /// <param name="EndNode">The node to which the path must end.</param>
 public void Initialize(SimWaypoint StartNode, SimWaypoint EndNode)
 {
     if (StartNode == null || EndNode == null) throw new ArgumentNullException();
     _Closed.Clear();
     _Open.Clear();
     Track.Target = EndNode;
     _Open.Add(new Track(StartNode));
     _NbIterations = 0;
     _LeafToGoBackUp = null;
 }