예제 #1
0
        //从PlanCourse取出一个当前累积权值最小并没有被处理过的节点
        public static Node GetMinWeightRouteNode(PlanCourse planCourse, List <Node> NodeList, string OriginID)
        {
            double minWeight = double.MaxValue;
            Node   destNode  = null;


            foreach (Node node in NodeList)
            {
                if (node.ID == OriginID)
                {
                    continue;
                }
                PassedPath pPath = planCourse[node.ID]; //寻找出节点的最短路径
                if (pPath.BeProcessed)
                {
                    continue;
                }
                if (pPath.SumWeight < minWeight)
                {
                    minWeight = pPath.SumWeight;
                    destNode  = node;
                }
            }
            return(destNode);
        }
예제 #2
0
        //获取从起点到终点的权值最小的路径,DIJSTRA算法
        public PlanCourse Plan(List <Node> NodeList, string OriginID)
        {
            //获取源点到与其相邻点的路径和权重值
            PlanCourse planCourse = new PlanCourse(NodeList, OriginID);
            //获取当前累积权重值最小,并且没有被处理过的节点
            Node curNode = GetMinWeightRouteNode(planCourse, NodeList, OriginID);

            while (curNode != null)
            {
                PassedPath curPath = planCourse[curNode.ID];
                foreach (Edge edge in curNode.EdgeList)
                {
                    if (edge.EndNodeID != OriginID)
                    {
                        PassedPath targetPath = planCourse[edge.EndNodeID];
                        double     tempWeight = curPath.SumWeight + edge.Weight;
                        if (tempWeight < targetPath.SumWeight)
                        {
                            targetPath.SumWeight = tempWeight;
                            targetPath.PathIDList.Clear();
                            for (int i = 0; i < curPath.PathIDList.Count; i++)
                            {
                                targetPath.PathIDList.Add(curPath.PathIDList[i].ToString());
                            }
                            targetPath.PathIDList.Add(curNode.ID);
                        }
                    }
                }
                //标记该节点已经处理了
                planCourse[curNode.ID].BeProcessed = true;
                ///获取下一个累积权重值最小,并且没有被处理过的节点
                curNode = GetMinWeightRouteNode(planCourse, NodeList, OriginID);
            }

            PlanCourse resultplancourse = planCourse;

            return(resultplancourse);
            //RoutePlanResult[] result = new RoutePlanResult[DestID.Length];
            //for (int i = 0; i < DestID.Length; i++)
            //{
            //    if (!DestID[i].Equals(OriginID))
            //    {
            //        result[i] = GetResult(planCourse, DestID[i]);
            //    }
            //    else
            //    {
            //        string[] passedNodeID = new string[1];
            //        passedNodeID[0] = DestID[i];
            //        result[i] = new RoutePlanResult(passedNodeID, 0);
            //    }

            //}

            //return result;

            //return GetResult(planCourse,DestID);
        }
 private void InitializeWeight(Node OriginNode)
 {
     if ((OriginNode.EdgeList == null) || (OriginNode.EdgeList.Count == 0))
     {
         return;
     }
     foreach (Edge edge in OriginNode.EdgeList)
     {
         PassedPath pPath = (PassedPath)htPassedPath[edge.EndNodeID];
         if (pPath == null)
         {
             continue;
         }
         pPath.PathIDList.Add(OriginNode.ID);
         pPath.SumWeight = edge.Weight;
     }
 }
예제 #4
0
        public static RoutePlanResult GetResult(PlanCourse planCourse, string destID)
        {
            PassedPath pPath = planCourse[destID];

            if (pPath.SumWeight == double.MaxValue)
            {
                RoutePlanResult routePlanResult = new RoutePlanResult(null, double.MaxValue);
                return(routePlanResult);
            }

            string[] passedNodeIDs = new string[pPath.PathIDList.Count];
            for (int i = 0; i < passedNodeIDs.Length; i++)
            {
                passedNodeIDs[i] = pPath.PathIDList[i].ToString();
            }
            RoutePlanResult result = new RoutePlanResult(passedNodeIDs, pPath.SumWeight);

            return(result);
        }
예제 #5
0
        //获取权值最小的路径,DIJISTRA算法
        public RoutePlanResult Plan(List <Node> nodeList, string originID, string destID)
        {
            PlanCourse planCourse = new PlanCourse(nodeList, originID);           //获得源点到与其相邻点的路径和权值

            Node curNode = GetMinWeightRouteNode(planCourse, nodeList, originID); //当前累积权值最小,并且没有被处理过的节点


            while (curNode != null)
            {
                PassedPath curPath = planCourse[curNode.ID];
                foreach (Edge edge in curNode.EdgeList)
                {
                    if (edge.EndNodeID != originID)
                    {
                        PassedPath targetPath = planCourse[edge.EndNodeID];//选取没有被处理并且当前累积权值最小的节点TargetNode
                        double     tempWeight = curPath.SumWeight + edge.Weight;
                        if (tempWeight < targetPath.SumWeight)
                        {
                            targetPath.SumWeight = tempWeight; //以此点为终点的路径长度
                            targetPath.PathIDList.Clear();     //将之前的路径清空

                            for (int i = 0; i < curPath.PathIDList.Count; i++)
                            {
                                targetPath.PathIDList.Add(curPath.PathIDList[i].ToString());
                            }

                            targetPath.PathIDList.Add(curNode.ID);
                        }
                    }
                }

                //标志为已处理
                planCourse[curNode.ID].BeProcessed = true;
                //获取下一个未处理节点
                curNode = GetMinWeightRouteNode(planCourse, nodeList, originID);
            }


            //表示规划结束
            return(GetResult(planCourse, destID));
        }
        public Hashtable htPassedPath;//定义一个哈希表存储各节点的路径表

        public PlanCourse(List <Node> NodeList, string OriginID)
        {
            htPassedPath = new Hashtable();
            Node OriginNode = null;

            foreach (Node node in NodeList)
            {
                if (node.ID == OriginID)
                {
                    OriginNode = node;
                }
                else
                {
                    PassedPath pPath = new PassedPath(node.ID);
                    htPassedPath.Add(node.ID, pPath);
                }

                if (OriginNode == null)
                {
                    continue;
                }
            }
            InitializeWeight(OriginNode);
        }