Ejemplo n.º 1
0
        /// <summary>
        /// Dijkstra Algorithm 을 이용한 최단거리 탐색
        /// </summary>
        /// <param name="start"></param>
        /// <param name="dest"></param>
        /// <returns></returns>
        public List <ChannelInfo> GetPath(PathNodeInfo start, PathNodeInfo dest)
        {
            DijkstraNode seedNode     = new DijkstraNode(new ChannelInfo(new PathNodeInfo(), start, 0, 0), null);
            DijkstraNode shortestPath = SearchPath(seedNode, dest);

            if (shortestPath == null)
            {
                return(null);
            }

            return(shortestPath.ChannelList);
        }
Ejemplo n.º 2
0
        private DijkstraNode SearchPath(DijkstraNode node, PathNodeInfo dest)
        {
            DijkstraNode resultNode = null;

            if (node.Node == dest)
            {
                // node가 목표 노드일 경우 현 노드의 탐색 종료
                return(node);
            }

            foreach (ChannelInfo channel in node.Node.Channels.Values)
            {
                DijkstraNode childnode = new DijkstraNode(channel, node);
                if (!childnode.CycleCheck())
                {
                    // 싸이클링 되지 않는 경우에만 노드 검색을 계속 한다.
                    DijkstraNode searchedNode = SearchPath(childnode, dest);
                    if (searchedNode != null)
                    {
                        if (resultNode == null)
                        {
                            // 기 검색된 노드가 없을 경우 새노드를 결과 노드로...
                            resultNode = searchedNode;
                        }
                        else
                        {
                            // 이전 결과 노드와 새 노드의 거리 비교
                            if (resultNode.PathLength > searchedNode.PathLength)
                            {
                                resultNode = searchedNode;
                            }
                            else if (resultNode.PathLength == searchedNode.PathLength)
                            {
                                // 이전 결과노드와 새노드 거리가 같을 경우는 경로 수 비교
                                if (resultNode.PathCount > searchedNode.PathCount)
                                {
                                    resultNode = searchedNode;
                                }
                            }
                        }
                    }
                }
            }
            return(resultNode);
        }
Ejemplo n.º 3
0
 public DijkstraNode(ChannelInfo channel, DijkstraNode parent)
 {
     Channel = channel;
     Parent  = parent;
 }