求各位高手Matlab dijkstra 算法的使用方法。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求各位高手Matlab dijkstra 算法的使用方法。相关的知识,希望对你有一定的参考价值。
D =
0 5 6 3 2 1
5 0 3 4 5 1
6 3 0 2 1 0
3 4 2 0 1 1
2 5 1 1 0 1
1 1 0 1 1 0
s=1;
dijkstra(D,s); %执行dijkstra(D,s)
程序就一直busy,请问这是不是不正常?
附dijkstra函数是从用的matlab开源版本的:
function [d,DD]=dijkstra(D,s)
%Dijkstra最短路算法Matlab程序用于求从起始点s到其它各点的最短路
%D为赋权邻接矩阵
%d为s(图中顶点)到其它各点最短路径的长度
%DD记载了最短路径生成树
[m,n]=size(D);
d=inf.*ones(1,m);
d(1,s)=0;
dd=zeros(1,m);
dd(1,s)=1;
y=s;
DD=zeros(m,m);
DD(y,y)=1;
counter=1;
while length(find(dd==1))<m
for i=1:m
if dd(i)==0
d(i)=min(d(i),d(y)+D(y,i));
end
end
ddd=inf;
for i=1:m
if dd(i)==0&&d(i)<ddd
ddd=d(i);
end
end
yy=find(d==ddd);
counter=counter+1;
DD(y,yy(1,1))=counter;
DD(yy(1,1),y)=counter;
y=yy(1,1);
dd(1,y)=1;
end
D已经改为:
D =
0 5 6 3 2 1
5 0 3 4 5 1
6 3 0 2 1 Inf
3 4 2 0 1 1
2 5 1 1 0 1
1 1 Inf 1 1 0
但仍然是busy..
function [l,t]=dijkstra(A,v)
%dijkstra最短路算法,某个顶点v到其余顶点的最短路
% 例:A=[0 2 8 1 inf inf inf inf
%2 0 6 inf 1 inf inf inf
% 8 6 0 7 5 1 2 inf
% 1 inf 7 0 inf inf 9 inf
% inf 1 5 inf 0 3 inf 8
% inf inf 1 inf 3 0 4 6
% inf inf 2 9 inf 4 0 3
% inf inf inf inf 8 6 3 0];
n=length(A);%顶点个数
V=1:n;%顶点集合
s=v;%已经找到最短路的点集,初始为v
l=A(v,:);%当前v点到各个点的距离,初始为直接距离
t=v.*ones(1,n);%当前距离时点的父顶点,初始都为v
ss=setdiff(V,s);nn=length(ss);%还没有找到最短路的点集
for j=1:n-1%一共进行n-1次迭代
k=ss(1);
for i=1:nn%对还没有找到最短路的点
if l(k)>l(ss(i))
k=ss(i);
l(k)=l(ss(i));%在当前一行距离中取最小值
end
end
if l(k)==inf%如果当前行最小值是无穷大,则结束
break;
else%否则k点的最短路找到
s=union(s,k);
ss=setdiff(V,s);
nn=length(ss);
end
if length(s)==n%全部点的最短路都找到
break;
else
for i=1:nn%以k为生长点,如果通过k点会更短,则更改当前最短距离
if l(ss(i))>l(k)+A(k,ss(i))
l(ss(i))=l(k)+A(k,ss(i));
t(ss(i))=k;
end
end
end
end
%附:运行上面程序后,如果想更清楚的观看点v到点vv的最短距离与路径可用下面小程序:
% v=3;%v要与上面的v一致
% vv=4;k=vv;tt=vv;
% while(1)
% if k==v
% tt %路径vv <--...<-- v
% l(vv) %距离
% break;
% else
% k=t(k);
% tt=[tt,k];
% end
%end 参考技术A 你用这个函数吧,A是邻接矩阵(无关系的用0,不用inf),得到的是从第x个点到第y个点的最短路走法
function final = dijkstra( A, x, y )
A(find(A == 0)) = NaN;
IN = x;
s = zeros(1,length(A));
d = zeros(1,length(A));
for z = 1:length(A)
if ~isWithin(IN, z)
d(z) = A(x,z);
s(z) = x;
end
end
while ~isWithin(IN, y)
tempMin = [];
for z = 1:length(A)
if ~isWithin(IN, z)
tempMin = [tempMin, d(z)];
end
end
p = min(tempMin);
search = find(d == p);
for i = 1:length(search)
search = find(d == p);
if( ~isWithin(IN, search(i)) )
p = search(i);
break;
end
end
IN = [IN, p];
for z = 1:length(A)
if ~isWithin(IN, z)
oldDistance = d(z);
d(z) = min(d(z), d(p) + A(p,z));
if ~(d(z) == oldDistance)
s(z) = p;
end
end
end
end
final = y;
z = y;
while (z == x) == 0
final = [final, s(z)];
z = s(z);
end
final=fliplr(final);
function truth = isWithin(source, search)
truth = 0;
for i = 1:length(source)
if(source(i) == search)
truth = 1;
end
end
用Dijkstra算法求最短路径的MATLAB程序
问题描述:边界的范围是a*b,把这a*b的范围网格化,将这介质剖面剖分成M*N个矩形网格单元,从网格的x轴上某一点激发射线,在网格的y轴上接收到从激发点激发的射线(x轴是正方向的,y轴是负方向的)
基本要求:
一 用DIJKSTRA算法求从某一激发点到某一接收点的最短路径(为了提高计算精度,需要在每个网格单元边界上内插S*T个节点),激发点为X轴上某点(源点),接收点可以是y轴上的任一点(目标点)。
二 用户输入源点和目标点后,程序应输出源点到目标点的最短路径,并画出射线穿越图,计算出这条射线经过每个网格的长度和所穿越网格的编号(共有M*N个网格)。
在线等!~ Q859413982
你做一个M函数用吧。
function [d,path]=dijkstra(W,s,t)
[n,m]=size(W);ix=(W==0);W(ix)=inf;
if n~=m,error('Square W required');end
visited(1:n)=0; dist(1:n)=inf;parent(1:n)=0;dist(s)=0;d=inf;
for i=1:(n-1),%求出每个节点与起始点的关系
ix=(visited==0);vec(1:n)=inf;vec(ix)=dist(ix);
[a,u]=min(vec);visited(u)=1;
for v=1:n,if (W(u,v)+dist(u)<dist(v)),
dist(v)=dist(u)+W(u,v);parent(v)=u;
end;end;end
if parent(t)~=0,path=t;d=dist(t);%回溯最短路径
while t~=s,p=parent(t);path=[p path];t=p;end;
end;
希望对你有用
是否可以解决您的问题?追问
不要复制粘贴的
参考技术A 这个挺好做的,有现有的算法,递归一下就好了,我现在没有现成的.m文件,不过可以告诉你怎么弄,你自己写一下就好了,c++ 大概3 4百行追问我要MATLAB程序写的,会吗?
追答MATLAB不熟,可以给你传本书看看,是c的,我想很容易转成matlab语言的吧,具体不知道,这个对你很重要吗?
以上是关于求各位高手Matlab dijkstra 算法的使用方法。的主要内容,如果未能解决你的问题,请参考以下文章
最短路求两点间最短路径的改进的Dijkstra算法及其matlab实现