本人matlab小白,如有错误,希望大家批评指正。
本例子来源于司守奎老师《数学建模算法与应用》
算法如下:
例子:
书中已给出matlab程序,本人在此将自己的注释附上,供大家参考,并在提出一个问题与自己的分析:
clc,clear
a=zeros(6);%设置一个6*6的矩阵(邻接矩阵)
a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10;
a(2,3)=15;a(2,4)=20;a(2,6)=25;
a(3,4)=10;a(3,5)=20;
a(4,5)=10;a(4,6)=25;
a(5,6)=55;%上三角矩阵元素
a=a+a';%邻接矩阵为对称阵
a(find(a==0))=inf;%其余元素,包括对角线元素设为无穷大
pb(1:length(a))=0;pb(1)=1;index1=1;index2=ones(1,length(a));
d(1:length(a))=inf;d(1)=0;temp=1;%第一次标号,temp为当前向外探查的点
while sum(pb)<length(a)%所有点都被标记为止
tb=find(pb==0);%找出未被标记的点
d(tb)=min(d(tb),d(temp)+a(temp,tb));%由第一点向外探查,暂时记下其余点的最短路
tmpb=find(d(tb)==min(d(tb)));%T集合中最小的点,可能不止一个
temp=tb(tmpb(1));%更新探查点
pb(temp)=1;%已被标记
index1=[index1,temp];%标号顶点顺序
temp2=find(d(index1)==d(temp)-a(temp,index1));%找标记点的前一个点,可能不止一个
index2(temp)=index1(temp2(1));
end
d, index1, index2
脚本执行结果如下:
问题是:
temp2=find(d(index1)==d(temp)-a(temp,index1))一句中a(temp,index1)为何不是a(index1,temp)?若变换则报错,超出矩阵维度。
思考:
为此,我在命令窗口,进行如下实验:
可见,问题在于a(temp,index1)为行向量,a(index1,temp)为列向量。所以亦可将d(index1)改为d(index1)',将其从行向量改为一列向量。即:
temp2=find(d(index1)'+a(index1,temp)==d(temp));%找标记点的前一个点,可能不止一个
运行结果一样。