运筹学图与网络部分。可以直接使用。注意输入三个参数。
function [min,path]=dijkstra(w,start,terminal)
% w赋权矩阵,要求不可达权值为inf
% start起点,terminal终点
n=size(w,1);
label(start)=0;
f(start)=start;
for i=1:n
if i~=start
label(i)=inf;
end
end
s(1)=start;
u=start;
while length(s)<n %要求遍历所有点
for i=1:n
if ~ismember(i,s)
if label(i)>(label(u)+w(u,i))
label(i)=(label(u)+w(u,i));
%将Xbar中可连接X的点找出
%保留其最优的label值
%比如,1是起始点
%在第二次迭代中,4指向2的值小于1指向2的值
%那么label(2)的值就更新
f(i)=u; %f表示各点指向,f中坐标值指向f坐标值的相应值
end
end
end
k=inf;
for i=1:n
if ~ismember(i,s)
if k>label(i)
k=label(i); %把比k小的留下
v1=i;
end
end
end
s(end+1)=v1;
u=v1;
end
min=label(terminal);
path(1)=terminal;
i=1;
%下面是根据各点间最优指向关系,利用f值指向,求解最佳路径path
while path(i)~=start
path(i+1)=f(path(i));
i=i+1;
end
L=length(path);
path=path(L:-1:1);
第一次看程序也许会有些烧脑,想理解的话看图可能会有些帮助:
这是程序运行的时的一个片段。
label就是[x,y]中的x,f就是y。
此时,
label=[0,5,3,4,……]
f=[1,3,1,1]。
多用脑用手捋一捋程序就懂了。