一、题目描述
实验四 图与网络问题求解
实验属性: 设计型
实验目的
1.理解图的基本概念;
2.掌握运筹学软件的使用方法;
3. 掌握图中Dijkstra算法Matlab求解原理和方法。
实验内容
书本P347,以9.3.2节Dijkstra算法为例,给出实现Dijkstra算法的Matlab程序,写出具体算法步骤并对使用的符号进行注释说明。
1.记录实验步骤与结果
2.对结果作适当分析;
3.完成实验报告。
1. 实验过程与步骤:
二、实验内容
步骤1:使用MATLAB工具进行实验,构建Dijkstra算法函数
其中A是有向图D的邻接矩阵,(aij)指i到j的距离;n是矩阵的维数;s是起始点。
步骤2:初始化Dijkstra算法函数
其中S表示顶点是否在S中,第i个位置值为零表示顶点vi不在S中,反之则表示在S中,S(1)表示将始点v1放入S中。
r代替lambda,第i个位置的值表示在最短路径中该点的前一个顶点。
d的第i个位置表示v1到vi的最短距离。
步骤3:运行Dijkstra算法函数
其中进行n-1次循环即可结束该算法,经过判断S是否等于V来执行条件语句,而后即可进行运算,并通过disp命令语句将结果输出。
步骤4:命令行窗口调用Dijkstra算法函数
其中设置起始点为1,矩阵维数为9,并定义9阶矩阵初始化数据,随后调用Dijkstra算法函数输出运行结果。
步骤5:结果展示
由此我们得到本题中由起始点v1出发到其他各顶点的最短距离与最短路路径。
附有相关matlab的M文件代码:
function [d,r]=Dijkstra(A,n,s)
S=zeros(1,n);
S(1)=1;
P=zeros(1,n);T=zeros(1,n);
r=zeros(1,n);
d=zeros(1,n);
for i=1:n
if i~=s
T(i)=inf;
r(i)=100;
end
end
k=s;
for i=1:n-1
if all(S)==1
d=P;
disp('从始点v1出发到其他各顶点的最短距离为:');
disp(d);
disp('从始点v1出发到其他个顶点的最短路路径为:');
disp(r);
return;
else
m=inf;
e=0;
for j=1:n
if A(k,j)<inf && S(j)==0 && T(j)>P(k)+A(k,j)
T(j)=P(k)+A(k,j);
r(j)=k;
end
if S(j)==0 && T(j)<m
m=T(j);
e=j;
end
end
if m<inf
P(e)=T(e);
S(e)=1;
k=e
i=i+1;
else
d=P;
for j=1:n
if S(j)==0
d(j)=T(j);
end
end
disp('从始点v1出发到其他各顶点的最短距离为:');
disp(d);
disp('从始点v1出发到其他各顶点的最短路路径为:');
disp(r);
return;
end
end
end