Example #1
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);
            }
        }
Example #2
0
 public static void Dump(CostDataForStack costDataForStack)
 {
     // Debug.Log(string.Format("Name: {0}, Cost: {1}, score:{2}", costDataForStack.nodeName, costDataForStack.cost, costDataForStack.score));
 }