グラフ理論モデルのコードでMatlabの最短経路問題

最短経路問題の基本的な内容

最短経路の研究は、接続によって形成されるドット間のネットワーク図、一定量(2点間の距離として理解することができる)所与の対応するパスであり、そして任意の2点間を歩く方法を算出し、パス最短問題。ここでの距離には、種々の点の間のオーバーヘッドタスクのいくつかの種類として解釈することができます。

画像

ネットワークダイアグラム


モデルの呼び出し

最短経路問題を解決し、撮影することができdijkstra、またはfloyd、以下のようにモデルフォームを呼び出し、2つのモデル:

[mydist,mypath]=mydijkstra(a,sb,db) % dijkstra模型
[mydist,mypath]=myfloyd(a,sb,db) % floyd模型

その中でも、

  • 隣接行列であります
  • 出発点番号などのSB
  • ラベルを終了するデシベル
  • mydist最短経路長
  • mypathで最短経路


モデルの完全なコード

ダイクストラモデルコード

function [mydistance,mypath]=mydijkstra(a,sb,db);
% 输入:a—邻接矩阵,a(i,j)是指i到j之间的距离,可以是有向的
% sb—起点的标号, db—终点的标号
% 输出:mydistance—最短路的距离, mypath—最短路的路径
n=size(a,1); visited(1:n) = 0;
distance(1:n) = inf; distance(sb) = 0; %起点到各顶点距离的初始化
visited(sb)=1; u=sb;  %u为最新的P标号顶点
parent(1:n) = 0; %前驱顶点的初始化
for i = 1: n-1
     id=find(visited==0); %查找未标号的顶点
     for v = id           
         if  a(u, v) + distance(u) < distance(v)
             distance(v) = distance(u) + a(u, v);  %修改标号值 
             parent(v) = u;                                    
         end            
     end
     temp=distance;
     temp(visited==1)=inf;  %已标号点的距离换成无穷
     [t, u] = min(temp);  %找标号值最小的顶点 
     visited(u) = 1;       %标记已经标号的顶点
 end
mypath = [];
if parent(db) ~= 0   %如果存在路!
    t = db; mypath = [db];
    while t ~= sb
        p = parent(t);
        mypath = [p mypath];
        t = p;      
    end
end
mydistance = distance(db);

フロイドのモデルコード

function [dist,mypath]=myfloyd(a,sb,db);
% 输入:a—邻接矩阵,元素(aij)是顶点i到j之间的直达距离,可以是有向的
% sb—起点的标号;db—终点的标号
% 输出:dist—最短路的距离;% mypath—最短路的路径
n=size(a,1); path=zeros(n);
for k=1:n
    for i=1:n
        for j=1:n
            if a(i,j)>a(i,k)+a(k,j)
                a(i,j)=a(i,k)+a(k,j);
                path(i,j)=k;
            end
        end
    end
end
dist=a(sb,db);
parent=path(sb,:); %从起点sb到终点db的最短路上各顶点的前驱顶点
parent(parent==0)=sb; %path中的分量为0,表示该顶点的前驱是起点
mypath=db; t=db;
while t~=sb
        p=parent(t); mypath=[p,mypath];
        t=p;
end


ケース・プレゼンテーション

上記ネットワーク図、Dへの最短パスの

画像

仕上げ隣接行列

最初のポイントと関係の接続点を整理隣接行列に来ます。

ソートポイントがあると仮定します。

点数 A B1 B2 C1 C2 C3 D
いいえ。 1 2 3 4 5 6 7

7 * 7隣接行列を整理:

画像

完全なコード

% 构造邻接矩阵
a = zeros(7);
a(1,2) = 2; a(1,3) = 4;
a(2,4) = 3; a(2,5) = 3; a(2,6) = 1;
a(3,4) = 2; a(3,5) = 3; a(3,6) = 1;
a(4,7) = 1;
a(5,7) = 3;
a(6,7) = 4;
a = a + a';
a(a==0) = inf; % 零元素换成inf
a(eye(7,7)==1)=0; % 对角线换成 0 

[mydist1,mypath1]=mydijkstra(a,1,7) % dijkstra模型求解
[mydist2,mypath2]=myfloyd(a,1,7) % floyd 模型求解

業績

mydist1 =

     6


mypath1 =

     1     2     4     7


mydist2 =

     6


mypath2 =

     1     2     4     7

ポイント数、すなわち最短経路A→B1→C1→Dに還元

おすすめ

転載: www.cnblogs.com/gshang/p/11512005.html
おすすめ