『實踐』Matlab實現Flyod求最短距離及存儲最優路徑


Matlab實現Flyod求最短距離及存儲最優路徑

一、實際數據

  已知圖中所有節點的X、Y坐標。

     圖中的節點編號:矩陣中的編號

       J01-J62:1-62;

    F01-F60:63-122;

    Z01-Z06:123-128;

    D01-D02:129-130.

 

二、Floyd求所有節點間的最小距離及通過矩陣存儲最優路徑的節點

 

 

 1 function [ optimal,path,maxnum ] = Floyd( distance,liantong,num,p,q )
 2 %Author:ljy 
 3 %Date:20170919
 4 %弗洛伊德算法求最優路徑和記錄下最優路徑中的節點信息
 5 %distance為節點間的連通距離。通過已知的節點的X、Y坐標和連通矩陣計算而得。其中Inf為不連通節點間的距離。連通節點間的距離為正數(非Inf),連通情況通過連通(liantong)矩陣判斷所得。  
 6 %num為所有節點個數
 7 %p和q為不考慮路徑的兩端節點編號。例如p=[129,129];q=[9,10];表示129到9、129到10的路不連通。
 8 %optimal為最優路徑的距離信息
 9 %path為最優路徑的路徑信息,行和列都為節點編號。path(i,j)為i到j的節點編號。例如:節點1到節點3的最優路徑為1-》2-》3,那么path(1,3)=2;path(2,3)=3.
10 %maxnum:最長的最優路徑的節點總數 11 %liantong:節點間的連通情況,0為不連通,1為連通。
12 maxnum = 2;
13 
14 
15 %將distance變為鄰接矩陣
16 for i = 1:num
17     for j = 1:num
18         if distance(i,j) == 0 & i ~= j
19             distance(i,j) = Inf;
20         end
21     end
22 end
23 
24 %將p與q之間的路徑的權重賦值為Inf,即不考慮p與q之間這條路徑的最優路徑。p、q為0表示沒有不考慮的路徑
25 for i = 1:size(p)
26     for j = 1:size(q)
27         if p(i) > 0 & q(j) > 0
28             distance(p(i),q(j)) = Inf;
29             distance(q(j),p(i)) = Inf;
30             liantong(p(i),q(j)) = 0;
31             liantong(q(j),p(i)) = 0;
32         end
33     end
34 end
35 
36 %核心算法 37  for k = 1:num
38     for i = 1:num
39         for j = 1:num
40             r = 2;%最優路徑所包含的節點個數
41             if distance(i,j) > distance(i,k) + distance(k,j)
42                 distance(i,j) = distance(i,k) + distance(k,j);
43                 %存儲最優路徑中的節點
44                 p = i;
45                 if liantong(p,j) ~= 0
46                     while liantong(i,j) ~= liantong(p,k) & p ~= k
47                         liantong(p,j) = liantong(p,k);
48                         p = liantong(p,k);
49                         r = r + 1;
50                     end
51                 else
52                     liantong(p,j) = liantong(p,k);
53                     r = r + 1;
54                 end
55             end
56             if r > maxnum
57                 maxnum = r;
58             end
59         end
60     end
61  end
62  
63 %返回數據
64 optimal = distance;
65 path = liantong;
66 end

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM