matlab弗洛伊德算法
Ⅰ 求解答以下Matlab Floyd算法代码的含义
暴力循环搜索。如果i,j之间存在k,使得i到j的距离大于i到k的距离加上k到j的距离,说明i-->k--j距离短,并把最短距离赋值给dij。很经典的最短路程序,只需要把距离矩阵套进去就行。
Ⅱ matlab floyd 算法注释
A矩阵是邻接矩阵,对角线上为o,其余位置数字表示的是两点之间距离,比如A(1,2)=2,表示从第一个点到第二个点的距离为2.inf是无穷大的意思,这里表示没有直接沟通这两点的路。
n=length(D);设定n为D矩阵的长度。
接下来的两重循环,得到的R矩阵是n*n的矩阵,它每个数据表示的是路径,比如:R(1,3)=1;表示路径为:1-1-3.这里是初始化路径了。
后面的三重循环是floyd算法的关键所在,就是更新路线了。里面的那个判断指的是:
假设有3个点,1
2
3;如果我从1-2-3之间总距离小于1-3的距离,那么我R(1,3)=2;这就是选取更近的路线了。
最后的两个判断是为了不让曾经走过的点再次被遍历。就是不回头的意思了,这个一般都可以忽略了,你照打上去就是了。
不知道这样的解释你是否满意。
Ⅲ matlab实现弗洛伊德算法的代码,。
function
[d,r]=floyd(a)
%floyd.m
%采用floyd算法计算图a中每对顶点最短路
%d是矩离矩阵
%r是路由矩阵
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)
评论
0
0
0
加载更多
Ⅳ 求matlab高手,帮我解决一下floyd算法!!急急急
//假期在家做的,网上这类算法很多,思想都差不多
#include<iostream>
using namespace std;
int N;        //顶点个数
int max = 10000;     //max代表两点之间没有路径存在
float ** inPut(){
 int edge,m,n,w,i;
 cout<<"请输入顶点数:";
 cin>>N;
 N = N+1;      //矩阵(数组)下标从1开始计数,方便操作
 float **C = new float*[N];  //矩阵C为图的初始邻接矩阵       
 for(i = 1; i<N; i++)
  *(C+i) = new float[N];
    
 for( i = 1; i<N; i++)   //邻接矩阵初始化
  for(int j = 1; j<N; j++){
   if(i == j)
    C[i][j] = 0;  //矩阵对角线上的值初始为0,其他为max
   else C[i][j] = max;
  } 
 
 cout<<"请输入边数:";
 cin>>edge;
 cout<<"请输入边及权值:"<<endl;
 for(i = 0; i<edge; i++){
  cin >> m >> n >> w;
  C[m][n] = w;
 }
 return C;
}
void Floyd(float **C){
 int i,j;
 float **A = new float*[N];  //矩阵A最终存放修改后的路径长度
 int **path = new int*[N];  //矩阵path记录两点之间的路径
 for(i = 1; i<N; i++)
  *(A+i) = new float[N]; 
 for(i = 1; i<N; i++)
  *(path+i) = new int[N]; 
 for(i = 1; i<N; i++)   //设置矩阵A和path的初值
  for(j = 1; j<N; j++){
   if(C[i][j] != max)
     path[i][j] = j; //存在路径,记录下终点下标值
   else path[i][j] = -1; //不存在路径用-1表示
 
   A[i][j] = C[i][j];
  }
 //修改路径长度(矩阵A)和路径(矩阵path)
 for(int k = 1; k<N; k++)  //试图将顶点k扩充到最短路径path矩阵中
  for(i = 1; i <N; i++)
   for(j = 1; j<N; j++)
    if( A[i][j] > ( A[i][k]+A[k][j] ) ){//判断顶点i到j的权值是否大于从i经k到j的权值,取二者较小者记录下来
     A[i][j] = ( A[i][k]+A[k][j]);
     path[i][j] = path[i][k];  //记录下中间顶点k值
    }
 
 cout << endl << endl;
 cout << "初始邻接矩阵C[N][N]" << endl;
 for( i = 1; i<N; i++){
  for(j = 1; j<N; j++){
   cout << C[i][j] << "\t";
  } 
  cout << endl;
 }
 cout << endl << endl;
 cout << "修改后的路径长度矩阵" << endl;
 for( i = 1; i<N; i++){
  for(j = 1; j<N; j++){
   cout << A[i][j] << "\t";
  } 
  cout << endl;
 }
 cout << endl;
 cout << endl;
 cout<<"路径矩阵"<<endl;
 for( i = 1; i<N; i++){
  for(j = 1; j<N; j++){
   cout << path[i][j] << "\t";
  } 
  cout << endl;
 }
 cout << endl << endl;
 cout << "所有顶点对之间的最短路径的权值及其路径" << endl;
 for(i = 1; i<N; i++){
  cout << endl;
  for(j = 1; j<N; j++){
   cout << A[i][j] << "\t";  //输出i-->j的权值
   int next = path[i][j];   //顶点i到j的路径,i后的第一个后继顶点
   if(next == -1)     //路径不存在
    cout << i << " 到 " << j << " 没有路径" << endl;
   else {
    cout<<i;     //起点
    while(next != j){   //i、j之间存在中间顶点
     cout << "-->" << next;
     next = path[next][j]; //寻找下一个中间顶点
    }
    cout << "-->" << j << endl; //终点
   }
  } 
 }   
}
int main(int argc, char* argv[]){ 
 float **C;
 C = inPut(); //邻接矩阵的初始化
 Floyd(C);
 return 0;
}
/*
1 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60
*/
Ⅳ matlab!!!!
a=[0 15 inf inf 24 inf 18 inf inf inf inf inf;
15 0 22 inf inf inf inf inf inf inf inf inf;
inf 22 0 18 16 inf inf inf 20 inf inf inf;
inf inf 18 0 inf 12 inf inf inf inf inf inf;
24 inf 16 inf 0 inf inf 12 24 inf inf inf;
inf inf inf 12 inf 0 inf inf 12 inf inf 22;
18 inf inf inf inf inf 0 15 inf 22 inf inf;
inf inf inf inf 12 inf 15 0 30 inf 25 inf;
inf inf 20 inf 24 12 inf 30 0 inf 19 19;
inf inf inf inf inf inf 22 inf inf 0 19 inf ;
inf inf inf inf inf inf inf 25 19 19 0 21;
inf inf inf inf inf 22 inf inf 19 inf 21 0];
>> [D,path]=floyd(a)
D =
     0    15    37    55    24    60    18    33    48    40    58    67
    15     0    22    40    38    52    33    48    42    55    61    61
    37    22     0    18    16    30    43    28    20    58    39    39
    55    40    18     0    34    12    61    46    24    62    43    34
    24    38    16    34     0    36    27    12    24    49    37    43
    60    52    30    12    36     0    57    42    12    50    31    22
    18    33    43    61    27    57     0    15    45    22    40    61
    33    48    28    46    12    42    15     0    30    37    25    46
    48    42    20    24    24    12    45    30     0    38    19    19
    40    55    58    62    49    50    22    37    38     0    19    40
    58    61    39    43    37    31    40    25    19    19     0    21
    67    61    39    34    43    22    61    46    19    40    21     0
path =
     1     2     2     2     5     5     7     7     5     7     7     5
     1     2     3     3     3     3     1     1     3     1     3     3
     2     2     3     4     5     4     5     5     9     9     9     9
     3     3     3     4     3     6     3     3     6     6     6     6
     1     3     3     3     5     9     8     8     9     8     8     9
     9     4     4     4     9     6     9     9     9     9     9    12
     1     1     8     8     8     8     7     8     8    10     8     8
     7     7     5     5     5     9     7     8     9     7    11    11
     5     3     3     6     5     6     8     8     9    11    11    12
     7     7    11    11     7    11     7     7    11    10    11    11
     8     9     9     9     8     9     8     8     9    10    11    12
     9     9     9     6     9     6    11    11     9    11    11    12
Ⅵ 怎么根据Floyd算法 从多个顶点中选出几个,使其他点到选出点距离最短
先用floyd求出距离矩阵D,即以下代码中的矩阵B。
以下matlab程序为从12个点中选出3点,可以此类推。
clear all;
A=[combntns(1:12,3)]; %列出12个居民点选3个缴费点的所有情况。
for i=1:nchoosek(12,3) %for……end, 循环,计算以上列出所有情况下所有居民需要行走的总路程!
A2=A(i,:); 
A3=A2(1,1); %读取选取3个居民点
A4=A2(1,2);
A5=A2(1,3); 
People=[15 10 12 18 5 24 11 16 13 22 19 20];  %每个居民点的人数的矩阵。
B=[
0 15 37 55 24 60 18 33 48 40 58 67;
15 0 22 40 38 52 33 48 42 55 61 61;
37 22 0 18 16 30 43 28 20 58 39 39;
55 40 18 0 34 12 61 46 24 62 43 34;
24 38 16 34 0 36 27 12 24 49 37 43;
60 52 30 12 36 0 57 42 12 50 31 22;
18 33 43 61 27 57 0 15 45 22 40 61;
33 48 28 46 12 42 15 0 30 37 25 46;
48 42 20 24 24 12 45 30 0 38 19 19;
40 55 58 62 49 50 22 37 38 0 19 40;
58 61 39 43 37 31 40 25 19 19 0 21;
67 61 39 34 43 22 61 46 19 40 21 0 ;
]; %居民到其他居民点所有最短的距离。 
B1=B(:,A3); %居民点到所选的缴费点的理论最短距离。
B2=B(:,A4);
B3=B(:,A5); 
C=[B1 B2 B3]; 
D=sort(C,2); 
Shortjourney=D(:,1); %每位居民选择缴费点后需要行走的最短路程。 
Sum(i)=People*Shortjourney; %所有居民所要行走的路程总和。
end 
E=[reshape(Sum,nchoosek(12,3),1)]; %将以上得到的数组转为矩阵。 
minposition=find(E==min(E)); %找出最小值在矩阵的位置。
A=[combntns(1:12,3)]; %A的顺序与E的一致!
position=A(minposition,:) %最佳的缴费点的选择。
Ⅶ matlab实现floyd算法 已知距离矩阵和权值矩阵 求最短路径
希望可以帮到你。
function [D,path]=floyd(a)
n=size(a,1);
D=a;
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
function [L,R]=router(D,path,s,t)
L=zeros(0,0);
R=s;
while 1
    if s==t
        L=fliplr(L);
        L=[0,L];
        return
    end
    L=[L,D(s,t)];
    R=[R,path(s,t)];
    s=path(s,t);
end
Ⅷ matlab floyd算法怎样以矩阵形式输出路径替代过程
你得到的R矩阵就是路径的矩阵,那么怎么看路径呢,假如你需要找出从点3到点8的路径,那么首先你查看R矩阵中R(3,8)是什么,比如是7,那么接下来就查看R(3,7),依次类推,直到R(3,i)=3,那么这条路径就是3.....7,8
Ⅸ 求matlab大神告诉我floyd算法的matlab实现,,,以及我目前出现的各种报错原因
存在负权的图中没有最短路的概念。负权回路本来就没有最短路。因为可以绕着负环一直转下去。有两个顶点:,->-->-然后我再由->那就成了-。
