最短路的算法
❶ Java中最短路算法如何实现
看看 这篇文章 它实现了
http://aloofqq.iteye.com/blog/1002174
❷ 求最短路问题的三种算法并说明使用条件
现在比较常用的最短路算法是dijkstra它的使用条件是你会写,且图中无负权边
SPFA是现在稀疏图上常用最短路算法,且无负环,而且你要会写
floyd是当前求多源最短路的常用算法
对于程序猿来说,dijkstra性能稳定比较changyong
对于oier来说,只要不是稠密图,一定写spfa,因为spfa在稀疏图上太快了
❸ 记录所有最短路径的最短路径算法
没有一个算法是万能的
Dijkstra:单源最短路径
Floyd:每对点最短路径
SPFA(Bellmanford+队列):快速单源最短路径(可负权)
还有很多求最短路径的算法,但是归其根本,无外乎:
Label Setting和Label Correcting两大类,其实就是搜索法+动态规划。
只要灵活地掌握了搜索法、动态规划和图论,这些算法就都会了。
❹ 帮忙讲一下最短路算法的过程,比如在一个图上怎么求出最短路,举个例子。
比如有一直线CD,CD是河,CD上边有AB两个点,分别到河边不同距离,现在要去河边打水,问从哪去打水距离最近?
从A出发的话以河为中间分界线,镜像A'到对面,然后A'-B连线,A'B直线跟CD交界点打水就是最近距离,如果由B出发的话原理一样,也可以镜像出B'连成AB'画出一交界点也是最近的打水点,
❺ 关于图的最短路算法
可以算出任意一个确定顶点到任意节点的单源最短路径.
要证明么?好像不太说的清楚....
写起来也确实比Dijkstra算法简单,而且是很标准的o(n^2),
但显然是Dijkstra算法的效率稍微高一些.....
❻ 求最短路算法的程序!!!!
% Dijkstra's Shortest Path
%
% final = dijkstra( A, x, y )
%
% Description: returns the shortest path from x to y given adjacency
% matrix A. Utilizes Dijkstra's shortest path algorithm.
%
% A = adjacency matrix of the graph (includes point x and y)
% x = intial node
% y = terminal node
% IN = set of nodes whose shortest path from x is known
% z,p = temporary nodes
% d = vector of lengths from initial point. i.e. d(p) = x to p
% s = vector of the previous node on a shortest path for any node
%
% Author: Josh Eads
% Date: 1/23/2006
function final = dijkstra( A, x, y )
%modify A so that lengths of 0 are invalid (-1)
A(find(A == 0)) = NaN;
%initialize IN to include only x
IN = x;
%initialize s
s = zeros(1,length(A));
%initialize d & d(x) (distance to self)
d = zeros(1,length(A));
d(x) = 0;
%loop through all the nodes in A
for z = 1:length(A)
%don't calculate values already in IN
%if ~(find(IN == z))
if ~isWithin(IN, z)
%grab the distance from x to z from A (-1 denotes unreachable)
d(z) = A(x,z);
%set the previous node to x
s(z) = x;
end
end
%process nodes into IN
%while y isn't in set IN
%while ~(find(IN == y))
while ~isWithin(IN, y)
tempMin = [];
%add the node not in IN with the minimum distance into IN
for z = 1:length(A)
%if z isn't in IN
%if ~(find(IN == z))
if ~isWithin(IN, z)
tempMin = [tempMin, d(z)];
end
end
%find the minimum value from tempMin
p = min(tempMin);
%find the minimum distance nodes
search = find(d == p);
%cycle through all the minimum distance nodes until one not in IN is
%found
for i = 1:length(search)
search = find(d == p);
%store in p if the node isn't in IN
if( ~isWithin(IN, search(i)) )
p = search(i);
break;
end
end
%add node p into IN
IN = [IN, p];
%recompute d for all non-IN nodes, and adjust s
for z = 1:length(A)
%if z isn't in IN
%if ~(find(IN == z))
if ~isWithin(IN, z)
oldDistance = d(z);
%if the new path is shorter for z, update d(z)
d(z) = min(d(z), d(p) + A(p,z));
%if the new and old distances don't match, update s(z)
if ~(d(z) == oldDistance)
s(z) = p;
end
end
end
end
%write the shortest path to final
final = y;
z = y;
while (z == x) == 0
final = [final, s(z)];
z = s(z);
end
final=fliplr(final);
% isWithin Function
% source = matrix to search through
% search = item to search for
%
% returns - true if search is within source
function truth = isWithin(source, search)
truth = 0;
for i = 1:length(source)
if(source(i) == search)
truth = 1;
end
end
❼ 图论:最短路算法有哪些以及它们的比较
弗洛伊德 n^3 的时间把n个点两两的最短路求出来
迪杰斯特拉 n^2的时间(用堆优化到Nlog(M),M是边数),单源最短路,但是不能对付有负权的图
SPFA,M*k的时间(K是一个常数),单源最短路,能对付有负权的图
感觉常用的就这三个了吧。。
❽ 最短路问题,关于Dijkstra 算法和A*算法的,求一个实例!
在网络里搜Dijkstra算法
❾ 最短路径算法
Dijkstra算法,A*算法和D*算法
Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式,Drew为了和下面要介绍的 A* 算法和 D* 算法表述一致,这里均采用OPEN,CLOSE表的方式。
大概过程:
创建两个表,OPEN, CLOSE。
OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
1. 访问路网中里起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查。
2. 从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。
3. 遍历考察这个点的子节点。求出这些子节点距起始点的距离值,放子节点到OPEN表中。
4. 重复2,3,步。直到OPEN表为空,或找到目标点。
提高Dijkstra搜索速度的方法很多,常用的有数据结构采用Binary heap的方法,和用Dijkstra从起始点和终点同时搜索的方法。
A*(A-Star)算法是一种启发式算法,是静态路网中求解最短路最有效的方法。
公式表示为: f(n)=g(n)+h(n),
其中f(n) 是节点n从初始点到目标点的估价函数,
g(n) 是在状态空间中从初始节点到n节点的实际代价,
h(n)是从n到目标节点最佳路径的估计代价。
保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:
估价值h(n)<= n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低。但能得到最优解。
如果 估价值>实际值, 搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
估价值与实际值越接近,估价函数取得就越好。
例如对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即f=g(n)+sqrt((dx-nx)*(dx-nx)+(dy-ny)*(dy-ny));这样估价函数f在g值一定的情况下,会或多或少的受估价值h的制约,节点距目标点近,h值小,f值相对就小,能保证最短路的搜索向终点的方向进行。明显优于Dijstra算法的毫无无方向的向四周搜索。
conditions of heuristic
Optimistic (must be less than or equal to the real cost)
As close to the real cost as possible
主要搜索过程:
创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
遍历当前节点的各个节点,将n节点放入CLOSE中,取n节点的子节点X,->算X的估价值->
While(OPEN!=NULL)
{
从OPEN表中取估价值f最小的节点n;
if(n节点==目标节点) break;
else
{
if(X in OPEN) 比较两个X的估价值f //注意是同一个节点的两个不同路径的估价值
if( X的估价值小于OPEN表的估价值 )
更新OPEN表中的估价值; //取最小路径的估价值
if(X in CLOSE) 比较两个X的估价值 //注意是同一个节点的两个不同路径的估价值
if( X的估价值小于CLOSE表的估价值 )
更新CLOSE表中的估价值; 把X节点放入OPEN //取最小路径的估价值
if(X not in both)
求X的估价值;
并将X插入OPEN表中; //还没有排序
}
将n节点插入CLOSE表中;
按照估价值将OPEN表中的节点排序; //实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。
}
A*算法和Dijistra算法的区别在于有无估价值,Dijistra算法相当于A*算法中估价值为0的情况。
动态路网,最短路算法 D*A* 在静态路网中非常有效(very efficient for static worlds),但不适于在动态路网,环境如权重等不断变化的动态环境下。
D*是动态A*(D-Star,Dynamic A*) 卡内及梅隆机器人中心的Stentz在1994和1995年两篇文章提出,主要用于机器人探路。是火星探测器采用的寻路算法。
主要方法:
1.先用Dijstra算法从目标节点G向起始节点搜索。储存路网中目标点到各个节点的最短路和该位置到目标点的实际值h,k(k为所有变化h之中最小的值,当前为k=h。每个节点包含上一节点到目标点的最短路信息1(2),2(5),5(4),4(7)。则1到4的最短路为1-2-5-4。
原OPEN和CLOSE中节点信息保存。
2.机器人沿最短路开始移动,在移动的下一节点没有变化时,无需计算,利用上一步Dijstra计算出的最短路信息从出发点向后追述即可,当在Y点探测到下一节点X状态发生改变,如堵塞。机器人首先调整自己在当前位置Y到目标点G的实际值h(Y),h(Y)=X到Y的新权值c(X,Y)+X的原实际值h(X).X为下一节点(到目标点方向Y->X->G),Y是当前点。k值取h值变化前后的最小。
3.用A*或其它算法计算,这里假设用A*算法,遍历Y的子节点,点放入CLOSE,调整Y的子节点a的h值,h(a)=h(Y)+Y到子节点a的权重C(Y,a),比较a点是否存在于OPEN和CLOSE中,方法如下:
while()
{
从OPEN表中取k值最小的节点Y;
遍历Y的子节点a,计算a的h值 h(a)=h(Y)+Y到子节点a的权重C(Y,a)
{
if(a in OPEN) 比较两个a的h值
if( a的h值小于OPEN表a的h值 )
{ 更新OPEN表中a的h值;k值取最小的h值
有未受影响的最短路经存在
break;
}
if(a in CLOSE) 比较两个a的h值 //注意是同一个节点的两个不同路径的估价值
if( a的h值小于CLOSE表的h值 )
{
更新CLOSE表中a的h值; k值取最小的h值;将a节点放入OPEN表
有未受影响的最短路经存在
break;
}
if(a not in both)
将a插入OPEN表中; //还没有排序
}
放Y到CLOSE表;
OPEN表比较k值大小进行排序;
}
机器人利用第一步Dijstra计算出的最短路信息从a点到目标点的最短路经进行。
D*算法在动态环境中寻路非常有效,向目标点移动中,只检查最短路径上下一节点或临近节点的变化情况,如机器人寻路等情况。对于距离远的最短路径上发生的变化,则感觉不太适用。
❿ 最短路径优先算法
从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径。解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法等。