你的代码我自己重新写了一遍,字母换了但字母顺序没有换
你的问题在于出现了重复累加的情况,举例:
显而易见3条路,原代码计算结果为5,因为(k1,k2,k)在(1,7,5),(1,5,2),(1,5,3),(1,7,6),(1,6,4)的时候各增加了一次可以看出多增加了两次(因为1257和1467这条两路在第二轮判断时各多加了一次),实际上每次处理过循环之后,都会多加一次,因此我加入判断变量k0,只要循环内经过递归,那么结束时就会减一(如k1=1,k2=5时,实际上此时已经加过一次,在k=2,3时又加了两次,此时就需要减掉一次)
感谢题主的思路,手头在做介数中心性,之前一直在考虑生成所有最短路径的矩阵,但计算规模巨大,远不如这种方法简单
function n=fun2(k1,k2,G,D)
%求最短路径数目
%k1表示第一个点,k2表示第二个点,D表示距离矩阵
num=size(G,1);
n=0;
k0=false;
for k = 1:num
if G(k,k2)&&D(k1,k2)==D(k1,k)+D(k,k2)%如果第k个点直接连通到k2且为k1,k2必经之点,则进入递归
n = n + fun2(k1,k,G,D);
k0=true; %如果循环内出现了递归则记为true
end
end
if k0,n=n-1;end %排除重复增加
n=n+1;
end
运行:
G=[false,true,true,true,false,false,false;true,false,false,false,true,false,false;true,false,false,false,true,false,false;true,false,false,false,false,true,false;false,true,true,false,false,false,true;false,false,false,true,false,false,true;false,false,false,false,true,true,false];
k1=1;k2=7;
D=[NaN,1,1,1,2,2,3;1,NaN,2,2,1,3,2;1,2,NaN,2,1,3,2;1,2,2,NaN,3,1,2;2,1,1,3,NaN,2,1;2,3,3,1,2,NaN,1;3,2,2,2,1,1,NaN];
n=fun2(k1,k2,G,D);
%由你给的矩阵A中四个元素知有5个点,按你的意思,构造这5个点的邻接矩阵A1;
A1=zeros(5,5);
A1(1,2)=5;
A1(2,3)=7;
A1(3,4)=8;
A1(4,5)=9;
A1=A1+A1';
A1(find(A1==0))=inf;
%用flody算法求任意两点的距离,构成矩阵A2,flody算法的matlab程序自己网上去搜,继续下面的
A2=[
10 5 12 20 29
5 10 7 15 24
12 7 14 8 17
20 15 8 16 9
29 24 17 9 18
];
%你后面的没说清楚,我的理解是小于20的记为1,大于或等于20的记为0,
%如理解错误,稍微修改下即可
B=A2<20
%求的矩阵B为
B=[
1 1 1 0 0
1 1 1 1 0
1 1 1 1 1
0 1 1 1 1
0 0 1 1 1
]
以上直接可以看出来哪些点之间的距离小于20了
flody算放如下,做成M文件后,在命令窗直接调用
function [D,path,min1,path1]=floyd(a,start,terminal)
D=a;n=size(D,1);path=zeros(n,n);
for i=1:n
for j=1:n
if D(i,j)~=inf
path(i,j)=j;
end, end, end
for k=1:n
for i=1:n
for j=1:n
if D(i,k)+D(k,j)<D(i,j)
D(i,j)=D(i,k)+D(k,j);
path(i,j)=path(i,k);
end, end, end,end
if nargin==3
min1=D(start,terminal);
m(1)=start;
i=1;
path1=[ ];
while path(m(i),terminal)~=terminal
k=i+1;
m(k)=path(m(i),terminal);
i=i+1;
end
m(i+1)=terminal;
path1=m;
end
用Dijkstra算法就可以了
以前的程序找不到了
也可以用Floyd算法,如下:
function[D,R]=floyd(a)
n=size(a,1);
D=a
for
i=1:n
for
j=1:n
R(i,j)=j;
end
end
R
for
k=1:n
for
i=1:n
for
j=1:n
if
D(i,k)+D(k,j)<D(i,j)
D(i,j)=D(i,k)+D(k,j);
R(i,j)=R(i,k);
end
end
end
k
D
R
存成Floydm
输入为带权邻接矩阵,最好自己找点资料,别人的程序都不如自己的好用
聚类分析的概念主要是来自多元统计分析,例如,考虑二维坐标系上有散落的许多点,这时,需要对散点进行合理的分类,就需要聚类方面的知识。模糊聚类分析方法主要针对的是这样的问题:对于样本空间P中的元素含有多个属性,要求对其中的元素进行合理的分类。最终可以以聚类图的形式加以呈现,而聚类图可以以手式和自动生成两种方式进行,这里采用自动生成方式,亦是本文的程序实现过程中的一个关键环节。 这里所实现的基本的模糊聚类的主要过程是一些成文的方法,在此简述如下: 对于待分类的一个样本集U=,设其中的每个元素有m项指标,则可以用m维向量描述样本,即:ui=(i=1,2,,n)。则其相应的模糊聚类按下列步骤进行:1) 标准化处理,将数据压缩至(0-1)区间上,这部分内容相对简单,介绍略。(参[1])2) 建立模糊关系:这里比较重要的环节之一,首先是根据逗距离地或其它进行比较的观点及方法建立模糊相似矩阵,主要的逗距离地有:Hamming 距离: d(i,j)=sum(abs(x(i,k)-x(j,k))) | k from 1 to m (| k from 1 to m表示求和式中的系数k由1增至m,下同)Euclid 距离: d(i,j)=sum((x(i,k)-x(j,k))^2) | k from 1 to m 非距离方法中,最经典的就是一个夹角余弦法: 最终进行模糊聚类分析的是要求对一个模糊等价矩阵进行聚类分析,而由相似矩阵变换到等价矩阵,由于相似矩阵已满足对称性及自反性,并不一定满足传递性,则变换过程主要进行对相似矩阵进行满足传递性的 *** 作。使关系满足传递性的算法中,最出名的,就是Washall算法了,又称传递闭包法(它的思想在最短路的Floyd算法中亦被使用了)。 算法相当简洁明了,复杂度稍大:O(log2(n)n^3),其实就是把一个方阵的自乘 *** 作,只不过这里用集合 *** 作的交和并取代了原先矩阵 *** 作中的和+ *** 作,如下:(matlab代码)%--washall enclosure algorithm--%unchanged=0;while unchanged==0 unchanged=1; %--sigma:i=1:n(combine(conj(cArr(i,k),cArr(k,j)))) for i=1:cArrSize for j=1:cArrSize mergeVal=0; for k=1:cArrSize if(cArr(i,k)<=cArr(k,j)&&cArr(i,k)>mergeVal) mergeVal=cArr(i,k); elseif(cArr(i,k)>cArr(k,j)&&cArr(k,j)>mergeVal) mergeVal=cArr(k,j); end end if(mergeVal>cArr(i,j)) copyCArr(i,j)=mergeVal; unchanged=0; else copyCArr(i,j)=cArr(i,j); end end end %--copy back--% for i=1:cArrSize for j=1:cArrSize cArr(i,j)=copyCArr(i,j); end endend
以上就是关于用matlab求两点间最短路径的数目,下面的程序有什么问题全部的内容,包括:用matlab求两点间最短路径的数目,下面的程序有什么问题、matlab 求助、求教各位高手:什么是MATLAB编程怎么用MATLAB程序求解最短路径谢谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)