Exemple #1
0
 public void CompleteInsert()
 {
     if (iAStarHeuristic == null)
     {
         iAStarHeuristic = new AStarManhattanHeuristic();
     }
     this.RefreshLinksOfAllNodes();
     if (binaryHeapUtils == null)
     {
         binaryHeapUtils = new BinaryHeapUtils(nodes.Count / 2);
     }
     else
     {
         binaryHeapUtils.Reset();
     }
 }
Exemple #2
0
    /// <summary>
    /// 搜索路径
    /// </summary>
    /// <returns><c>true</c>, if base binary heap was searched, <c>false</c> otherwise.</returns>
    /// <param name="startNode">Start Node.</param>
    /// <param name="endNode">End Node.</param>
    /// <param name="nowCheckNum">Now check number.</param>
    private bool SearchBaseBinaryHeap(AStarNode startNode, AStarNode endNode, int nowCheckNum)
    {
        var statusClosed = nowCheckNum + 1;

        _binaryHeapUtils.Reset();

        startNode.G = 0;
        startNode.F = startNode.G +
                      _iAStarHeuristic.Heuristic(startNode.NodeX, startNode.NodeY, endNode.NodeX, endNode.NodeY);
        startNode.SearchPathCheckNum = statusClosed;

        var node = startNode;

        while (node != endNode)
        {
            var links = node.Links;
            foreach (var link in links)
            {
                var nodeItem = link.Node;
                var g        = node.G + link.Cost;

                // 如果已被检查过
                if (nodeItem.SearchPathCheckNum >= nowCheckNum)
                {
                    if (nodeItem.G <= g)
                    {
                        continue;
                    }
                    nodeItem.F = g +
                                 _iAStarHeuristic.Heuristic(nodeItem.NodeX, nodeItem.NodeY, endNode.NodeX,
                                                            endNode.NodeY);
                    nodeItem.G          = g;
                    nodeItem.ParentNode = node;
                    if (nodeItem.SearchPathCheckNum == nowCheckNum)
                    {
                        _binaryHeapUtils.ModifyNode(nodeItem.BinaryHeapNode);
                    }
                }
                else
                {
                    nodeItem.F = g +
                                 _iAStarHeuristic.Heuristic(nodeItem.NodeX, nodeItem.NodeY, endNode.NodeX, endNode.NodeY);
                    nodeItem.G          = g;
                    nodeItem.ParentNode = node;

                    nodeItem.BinaryHeapNode     = _binaryHeapUtils.InsertNode(nodeItem);
                    nodeItem.SearchPathCheckNum = nowCheckNum;
                }
            }
            if (_binaryHeapUtils.HeadNode != null)
            {
                node = _binaryHeapUtils.PopNode();

                node.SearchPathCheckNum = statusClosed;
            }
            else
            {
                return(false);
            }
        }
        return(true);
    }