/// <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); }
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); }
public DijkstraNode(ChannelInfo channel, DijkstraNode parent) { Channel = channel; Parent = parent; }