예제 #1
0
        public override void InitPath()
        {
            //Setup Startnode's Info
            IPathNode startPNode = Handler.GetPathnode(m_StartNode);

            startPNode.Node   = m_StartNode;
            startPNode.PathID = Handler.PathID;
            startPNode.Parent = null;
            startPNode.Cost   = 0;
            startPNode.G      = 0;
            startPNode.H      = CalculateHScore(m_StartNode);

            startPNode.Open(this, Handler);
            m_SearchIndex++;

            PartialBestNode = startPNode;

            if (Handler.Heap.IsEmpty)
            {
                if (CalculatePartial)
                {
                    CompleteState = PathCompleteState.PartialComplete;
                    Trace(PartialBestNode);
                }
                else
                {
                    //Todo: Error
                }
            }

            CurNode = Handler.Heap.Dequeue();
        }
예제 #2
0
        public override void Process(long targetTick)
        {
            int counter = 0;

            while (CompleteState == PathCompleteState.NotCalculated)
            {
                m_SearchIndex++;
                var heap = Handler.Heap;

                if (PartialBestNode.H > CurNode.H)
                {
                    PartialBestNode = CurNode;
                }

                CurNode.Open(this, Handler);

                if (heap.IsEmpty)
                {
                    if (CalculatePartial && PartialBestNode != null)
                    {
                        CompleteState = PathCompleteState.PartialComplete;
                        Trace(PartialBestNode);
                    }
                    else
                    {
                        //Todo: Error
                    }
                }

                CurNode = heap.Dequeue();

                if (counter > 500)
                {
                    if (System.DateTime.UtcNow.Ticks >= targetTick)
                    {
                        return;
                    }
                    counter = 0;
                    if (m_SearchIndex > 1000000)
                    {
                        throw new System.Exception("Probable infinite loop. Over 1,000,000 nodes searched");
                    }
                }

                counter++;
            }

            if (CompleteState == PathCompleteState.Complete)
            {
                Trace(CurNode);
            }
            else if (CompleteState == PathCompleteState.PartialComplete)
            {
                Trace(PartialBestNode);
            }
        }