基于点割集的最短路径算法程序(核心代码)
一、算法程序1:经典Dijkstra算法(matlab 实现)
function [ dist, index1, index2 ] = dij( a )
%两点间最短路的Dijkstra算法
% a 表示图的权值矩阵
% dist 表示所求最短路的权和
% index1 表示标号顶点顺序
% index2 表示标号顶点索引
%参数初始化
M=max(max(a));
pb(1:length(a))=0;
pb(1)=1;
index1=1;
index2=ones(1,length(a));
dist(1:length(a))=M;dist(1)=0;temp=1;
%更新l(v),同时记录顶点顺序和顶点索引
while sum(pb)<length(a)
tb=find(pb==0);
dist(tb)=min(dist(tb),dist(temp)+a(temp,tb)); %更新l(v)
tmpb=find(dist(tb)==min(dist(tb)));
temp=tb(tmpb(1));
pb(temp)=1;
index1=[index1,temp]; %记录标号顺序
index=index1(find(dist(index1)==dist(temp)-a(temp,index1)));
if length(index)>=2
index=index(1);
end
index2(temp)=index; %记录标号索引
end
dist
index1
index2
end
二、算法程序2:最短路径绘图(matlab实现)
%有向图寻找最短路径
%不一定经过所有点
W=[3 4 2 4 4 4 6 6 4 4 5 2 2 3 4 3 6 4 4 2 3 7 3];%边的权重
DG = sparse([1 1 2 2 3 3 4 4 5 6 6 6 7 8 9 10 10 11 12 12 12 13 14],[2 3 3 4 7 8 7 5 6 7 11 10 9 9 10 11 12 12 13 14 15 15 15],W,15,15)
%边权重所对应的结点
%要根据实际情况改变最后两位数,代表矩阵维数
h=view(biograph(DG,[],'ShowWeights','on'))%作图
[dist,path1,pred] = graphshortestpath(DG,1,12)
[dist,path2,pred] = graphshortestpath(DG,11,12)
%调用函数,dist为最短路径长度
%path为经过的结点
set(h.Nodes(path1),'Color',[1 0.4 0.4])%设置结点颜色
edges1=getedgesbynodeid(h,get(h.Nodes(path1),'ID'));
set(edges1,'LineColor',[1 0 0])%设置边颜色
set(edges1,'LineWidth',1.5)%设置边线粗度
set(h.Nodes(path2),'Color',[1 0.2 0.2])%设置结点颜色
edges2=getedgesbynodeid(h,get(h.Nodes(path2),'ID'));
set(edges2,'LineColor',[0 0 0])%设置边颜色
set(edges2,'LineWidth',1.5)%设置边线粗度
%无向图寻找最短路径
UG = tril(DG + DG')%化为下三角矩阵形式处理
h = view(biograph(UG,[],'ShowArrows','off','ShowWeights','on'))%作图
[dist,path1,pred] = graphshortestpath(UG,1,12,'directed',false)%调用函数求相应值
[dist,path2,pred] = graphshortestpath(UG,11,12,'directed',false)%调用函数求相应值
set(h.Nodes(path1),'Color',[1,0.4,0.4])%设置颜色
fowEdges1 = getedgesbynodeid(h,get(h.Nodes(path1),'ID'));
revEdges1 = getedgesbynodeid(h,get(h.Nodes(fliplr(path1)),'ID'));
edges1 = [fowEdges1;revEdges1];
set(edges1,'LineColor',[1 0 0])
set(edges1,'LineWidth',1.5)
set(h.Nodes(path2),'Color',[0,0.7,0.7])%设置颜色
fowEdges2 = getedgesbynodeid(h,get(h.Nodes(path2),'ID'));
revEdges2 = getedgesbynodeid(h,get(h.Nodes(fliplr(path2)),'ID'));
edges2 = [fowEdges2;revEdges2];
set(edges2,'LineColor',[0 0.7 0.7])
set(edges2,'LineWidth',1.5)
三、点割集搜寻算法
四、基于割点的Dijkstra算法(C语言实现)
五、基于点割集的Dijkstra算法(C语言实现)
目前更新算法一与算法二,我们会不断更新该文内容,对后续算法三、四、五进行补充说明。