public void CompleteInsert() { if (iAStarHeuristic == null) { iAStarHeuristic = new AStarManhattanHeuristic(); } this.RefreshLinksOfAllNodes(); if (binaryHeapUtils == null) { binaryHeapUtils = new BinaryHeapUtils(nodes.Count / 2); } else { binaryHeapUtils.Reset(); } }
/// <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); }