최단 경로 : 매핑 소프트웨어는 여행의 최적의 경로를 계산하는 방법은?

최단 경로 : 매핑 소프트웨어는 여행의 최적의 경로를 계산하는 방법은?

오른쪽 에지가 각 그래프의 중량을 갖는 것을 볼 수 있도록, 그 방법 (중량 최소 후에 오른쪽), 두 지점 사이의 최단 경로를 계산하는 방법? 경로 계획 소프트웨어 맵에서 최단 경로 알고리즘을보고

알고리즘 분석

이 세 가지 최적화 문제이다 : 최단 경로, 시간의 최소 최소한의 신호등과

가장 단순한는 가장 중요한 방법 추상 데이터 구조에 대한 구체적인 데이터 구조에 추상적 인 복잡한 시나리오 모델링입니다 소프트웨어 개발에 실질적인 문제를 해결하는 가장 짧은 경로입니까? 도 최적의 맵 추상적 분기점은 엣지로 간주 경로 포크 포크 사이의 꼭지점 각이 도로 일방향 도로와 같이, 도로의 길이는 에지의 가중치는, 인 두 정점 비디오 방향성 에지 사이도 서로 다른 두 방향의 영상 측에 두 꼭지점 사이의 양방향 거리도라는 제목으로 추상화 될 수있다도록, 경우이다.

즉, 도면을받을 두 정점 사이의 최단 경로 :

public class Graph{    //有向有权图的邻接表表示
	private LinkedList<Edge> adj[]; //邻接表
	private  int v;   //顶点个数
	
	public Graph(int v ){
		this.v = v;
		this.adj = new LinkedList[v];
		for(int i = 0 ; i < v ; ++i){
			this.adj[i] = new LinkedList<>();
		}
	}
	
	public void addEdge(int s , int  t , int w ){    //添加一条边
		this.adj[s].add( new Edge(s,t,w));
	}
	
	private class Edge{
		public int sid;   //边的起始顶点编号
		public int tid;  //边的终止顶点编号
		public int w ;  // 权重
		public Edge(int sid, int tid ,int w){
			this.sid = sid ;
			this.tid = tid ;
			this.w = w ;
		}
	}
	//下面这个类是为了dijkstra实现用的
	private class Vertex {
		public int id ;  ///顶点编号ID
		public int dist ; //从起始顶点到这个顶点的距离
		public Vertex(int id ,int dist){
			this.id = id ;
			this.dist = dist;
		}
	}
}

최단 경로 알고리즘은 단일 소스 최단 경로 알고리즘 (a 정점 정점) 가장 잘 알려진 익스트라 알고리즘

//因为Java提供的优先级队列,没有暴露更新数据的接口,所以要重新实现一个
private class PriorityQueue{   //根据vertex.dist构建小顶堆
	private Vertex[] nodes;
	private int count;
	public PriorityQueue(int v){
		this.nodes = new Vertex[v+1];
		this.count = v;
	}
	public Vertex poll(){……}
	public void add(Vertex vertex){……}
	//更新结点的值,并从下往上堆化,重新符合堆的定义,时间复杂度O(Logn)
	public void update(Vertex vertex){……}
	public boolean isEmpty(){……}
}

public void dijkstra(int s ,int t){   //从顶点s到顶点t的最短路径
	int[] predecessor = new int[this.v]; //用来还原最短路径
	Vertex[] vertexes = new Vertex[this.v];
	for(int i = 0 ; i < this.v ; ++i){
		vertexes[i] = new Vertex( i , Integer.MAX_VALUE);
	}
	PriorityQueue queue = new PriorityQueue(this.v);//小顶堆
	boolean[] inqueue = new boolean[this.v];  //标记是否进入过队列
	vertexes[s].dist = 0 ;
	queue.add(vertexes[s]);
	inqueue[s] = true;
	while(!queue.isEmpty()){
		Vertex minVertex = queue.poll();  //取堆顶元素并删除
		if(minVertex.id == t) break;//最短路径产生
		for(int i = 0 ; i < adj[minVertex.id].size();++i){
			Edge e  = adj[minVertex.id].get(i);  //取出一条minVertex相连的边
			Vertex nextVertex - vertexes[e.tid];  //minVertex -> nextVertex
			if(minVertex.dist + e.w < nextVertex.dist){   //更新next的dist
				nextVertex.dist = minVertex.dist + e.w;
				predecessor[nextVertex.id] = minVertex.id;
				if(inqueue[nextVertex.id]  ==  true){
					queue.update(nextVertex);  //更新队列中的dist值
				}else{
					queue.add(nextVertex);
					inqueue[nextVertex.id] = true;
				}
			}
		}
	}
	//输出最短路径
	System.out.print(s);
	print(s , t, predecessor);
}

private void print (int s , int t ,int []  precessor){
	if( s == t) return ;
	print(s , predecessor[t] , predecessor);
	System.out.print("->" + t);
}

우선, 각 DIST의 정점 시작 정점으로부터의 거리를 기록하여 정점 어레이 모든 정점이 무한대로 초기화 DIST, 즉, 상기 코드는 Integer.MAX_VALUE는 출발 정점 DIST 값을 배치하는, 0으로 초기화 우선 순위 큐

DIST minVertex 더한 우측 및 minVertex nextVertex 중량의 값 W는 즉,의 존재 DIST nextVertex의 전류 값보다 작은 경우 우선 순위 큐 DIST minVertex 정점 작은로부터 제거하고, 그 후, 모든 정점에 도달 정점 (nextVertex)을 조사 minVertex nextVertex, nextVertex 통해 minVertex 업데이트 DIST DIST의 값에 도달하는 다른 짧은 경로는 그 정점 종료 큐를 발견 할 때까지 과정을 반복하면 비어 있거나 t 승 플러스

프로세스 (processor) 어레이로 환원 최단 경로 마침내 전구체 정점마다 정점 재귀 의해 인쇄 경로 기록

정점은 우선 순위 큐에 나타난 경우 DIST의 정점의 값을 업데이트하는 반복 우선 순위 큐에 부가 정점을 피하기 위해 INQUEUE 배열 한 후, 반복을 추가하지

어떻게 최적의 여행 경로를 계산?

그냥지도가 큰 있지만, 차선책이 될 수있는 실행 가능한 해결책을 강구해야하지만, 우리는 작은 블록을 그냥 더 큰지도를 통해 작은 블록을 그릴 수 있도록 두 점 사이의 최단 경로는 매우 분기 아니다 이 셀 블록에 다 익스트라 알고리즘을 실행하고, 두 점을 커버 할 수 있지만, 잘되지 않습니다

어떻게 도로 차량의 기간을 계산?

각 한쪽 후, 신호등을 통과하기, 신호등이 최소 프로그램에, 단지 가중치를 1로 변경되어 모든 가장자리를 필요로하고 다 익스트라의 알고리즘을 계속 사용할 경우, 계산 된 두 점을 폭 우선 탐색 알고리즘을 사용할 수 있습니다 사이의 경로는 두 점하는 유사한 추론 검색 알고리즘을 사용하여 실제지도 소프트웨어 사이의 최단 경로입니다 *

확장 요약

, 번역 만하면 전체 문장을 번역 할 경우, 문장의 요구는, 하나의 단어로 분할 될 각 단어의 번역 시스템을 제공, 하나의 단어에 대해 수행 할 수있는 번역 시스템이 있습니다, 시스템이 번역의 옵션 세트의 목록을 반환, 각 번역에 대한 포인트는이 번역의 신뢰성을 대표하는 히트

문장 : ABC는 세 단어 A, BC을 포함

AA : {a0,8}, {a1,6}, {a2,3}

B -> 번역 시스템 -> B : {b0,6}, {B1, 5}, {b2,4}, {} b3,2

CC : {C0,9}, {C1,6}

각 단어가 목록에서 선택할 수 있습니다를 들어, 어떻게 프로그램, 번역의 조합이 전체 문장의 희망에 대한 첫 번째 K 번역 결과 가장 높은 점수 계산 전체 문장의 번역이며, 선택?

비아 다 익스트라의 알고리즘 점수의 내림차순에 따라 각 단어의 수 선택적으로 번역, 가장 높은 결합 된 점수는 각각의 우선 순위 큐에서 객체로 우선 순위 큐에이를 넣어, 그 결과 a0b0c0입니다 확장이 조합 주어진 가장 높은 포트폴리오의 점수 등을 제거한 후, 확장 전략은 각 단어의 번역은 a0b0c0 확장 후와 같이 다음 단어의 번역으로 대체됩니다, 당신은 세 a1b0c0, a0b1c0, a0b0c1 확장의 조합을 얻을 것이다 조합이 프로세스는 변환이 취득 될 때까지 K 큐가 비어 반복하거나 조합 인 우선 순위 큐에 적용

최단 경로 여행 시간을 계산에서 어떻게 도로 시간을 얻으려면?

시간과 도로, 교통 혼잡, 교통 신호등 및 기타 관련 수의 경로 길이의 요인에 의해 요인을 획득 한 후 시간을 추정하는 회귀 모형을 설정하려면

가정이 자동차로 그 여행, 버스 여행은 경우? 혼합 대중 교통은 도보? 어떻게 경로를 계획하려면?

메트로 시간표가 버스가 허용되지 않을 때, 추정 될 수 있지만, 대략적인 시간 추정하기 쉽고, 도로의 길이에 실질적으로 비례 도보 시간을 추정 할 수 있고, 고정

게시 75 개 원래 기사 · 원의 찬양 9 · 전망 9177

추천

출처blog.csdn.net/ywangjiyl/article/details/104717981