protected new static void Init(Dictionary <Node, int> nodesMap)
        {
            CostDict.Clear();
            RoadDict.Clear();
            open_List.Clear();
            close_List.Clear();
            NodesMap  = nodesMap;
            NodeCount = NodesMap.Count;

            var enumerator = NodesMap.GetEnumerator();

            try
            {
                while (enumerator.MoveNext())
                {
                    var current = enumerator.Current.Key;
                    CostDict[current] = int.MaxValue;
                    RoadDict[current] = new Queue <Node>();
                }
            }
            finally
            {
                enumerator.Dispose();
            }
        }
        /// <summary>
        /// 获取该地形的通过费用
        /// </summary>
        /// <param name="terrain"></param>
        /// <returns></returns>
        public static int GetCost(this Terrain terrain)
        {
            if (CostDict.TryGetValue(terrain, out int result) == false)
            {
                Debug.LogError($"存在未配置的地形类型:{terrain}");
                throw new ArgumentException($"存在未配置的地形类型:{terrain}");
            }

            return(result);
        }
Exemple #3
0
        protected new static void Init(Dictionary <Node, int> nodesMap)
        {
            CostDict.Clear();
            NodesMap          = nodesMap;
            NodeCount         = NodesMap.Count;
            reachCostLeave    = new Dictionary <Node, int>();
            canGetMinNodelist = new List <Node>();

            var enumerator = NodesMap.GetEnumerator();

            try
            {
                while (enumerator.MoveNext())
                {
                    var current = enumerator.Current.Key;
                    reachCostLeave[current] = -1;
                }
            }
            finally
            {
                enumerator.Dispose();
            }
        }
Exemple #4
0
        /// <summary>
        /// 最短経路を探す.
        /// </summary>
        /// <returns>The saitan.</returns>
        /// <param name="nodeMap">Node map.</param>
        /// <param name="startKey">Start key.</param>
        /// <param name="goalKey">Goal key.</param>
        /// <param name="loopout">計算を諦めるしきい値</param>
        /// <param name="costDict">Cost dict.</param>
        /// <param name="route">Route.</param>
        public static int GetShortestRoute(NodeMap nodeMap, string startKey, string goalKey, int loopout, out CostDict costDict, out LinkedList <string> route)
        {
            costDict = new CostDict(nodeMap.nodeMap.Count);
            var stack     = new SortedSet <CostDataForStack>(new CostDataForStack.myReverserClass());
            var startNode = nodeMap.nodeMap[startKey];
            var goalNode  = nodeMap.nodeMap[goalKey];

            {
                var openNodeCostData = new CostData
                {
                    cost          = 0.0f,
                    heuristicCost = Vector3.Distance(startNode.Position, goalNode.Position),
                    parent        = null
                };
                costDict[startKey] = openNodeCostData;
                CostDataForStack costDataForStack = new CostDataForStack
                {
                    cost     = openNodeCostData.cost,
                    score    = openNodeCostData.cost + openNodeCostData.heuristicCost,
                    nodeName = startKey
                };
                stack.Add(costDataForStack);
            }

            while (stack.Count != 0 && 0 < loopout)
            {
                loopout--;
                var parent = stack.First();
                stack.Remove(parent);
                var parentName = parent.nodeName;
                var parentNode = nodeMap.nodeMap[parentName];
                var parentCost = costDict[parentName];

                foreach (var openNodeName in parentNode.Graph)
                {
                    if (costDict.ContainsKey(openNodeName))
                    {
                        continue;
                    }

                    var openNode         = nodeMap.nodeMap[openNodeName];
                    var openNodeCost     = parentCost.cost + Vector3.Distance(openNode.Position, parentNode.Position);
                    var hCost            = Vector3.Distance(openNode.Position, goalNode.Position);
                    var openNodeCostData = new CostData
                    {
                        cost          = openNodeCost,
                        heuristicCost = hCost,
                        parent        = parentName
                    };
                    var costDataForStack = new CostDataForStack
                    {
                        cost     = openNodeCostData.cost,
                        score    = openNodeCostData.cost + openNodeCostData.heuristicCost,
                        nodeName = openNodeName
                    };
                    costDict[openNodeName] = openNodeCostData;
                    stack.Add(costDataForStack);
                    CostDataForStack.Dump(costDataForStack);
                }

                if (costDict.ContainsKey(goalKey))
                {
                    break;
                }
            }

            if (costDict.ContainsKey(goalKey))
            {
                route = new LinkedList <string>();
                var node = costDict[goalKey];

                while (node.parent != null)
                {
                    route.AddFirst(node.parent);
                    node = costDict[node.parent];
                }

                return(route.Count);
            }
            else
            {
                route = null;
                return(0);
            }
        }
Exemple #5
0
 /// <summary>
 /// 最短経路を探す.
 /// </summary>
 /// <returns>The saitan.</returns>
 /// <param name="nodeMap">Node map.</param>
 /// <param name="startKey">Start key.</param>
 /// <param name="goalKey">Goal key.</param>
 /// <param name="costDict">Cost dict.</param>
 /// <param name="route">Route.</param>
 public static int GetShortestRoute(NodeMap nodeMap, string startKey, string goalKey, out CostDict costDict, out LinkedList <string> route)
 {
     return(GetShortestRoute(nodeMap, startKey, goalKey, 10000, out costDict, out route));
 }