最短経路ダイクストラアルゴリズムの原則は一般的で詳細であり、Matlabコード分析

1.ダイクストラアルゴリズム:指定された2つの頂点間の短いパス

      異なる点間の隣接行列は無向グラフであり、a(i、j)は点iから点jまでの距離を表し、2つの点が接続されていない場合は無限大で表されます。具体的な例を次の表に示します。

       

       私の理解によると、アルゴリズムの原理は、nノード間の検索(複雑度n \ times n \ times n \ times n \ cdots n = n ^ {n})を、nノードの2つのセット(検索セットと未検索セット)間の検索(複雑度に変換することです。n \ times n特定のプロセス:開始点から最初は、貪欲アルゴリズムの戦略が採用されており、開始点に最も近く、訪問されていない頂点の、隣接するノードに移動するたびに、終了点まで延長されます。

       以下に示すように(プログラムの場合とは異なり)より具体的にするには、ノード1からノード6へのすべての最短ルートを見つけます。

         ダイクストラアルゴリズムがアニメーションプロセスを実行する

       1.ノード1から検索を開始し、ノード1を検索セットPに入れ、残りのノード2、3、4、5、6を未検索セットWに入れます。

         

       2、Wのセットは、(距離が図から分かるように、最も近いノードからセットに隣接する集合P 1で発見されていない7,9に対応する6つのノードを検索し\無限\無限14 7が最も小さく、ノード2に参加し、ノード3、4)を更新し、最も近いノード2をPに追加し、ノード1から各ノードまでの距離を更新します。ここでは、2に接続されているノード3と4の間の最短距離を更新します。

         ノード3の最短距離なので、1→2は7です。ノード2から開始して、2→3からの最短距離は10です。したがって、ノード1〜3間の最短パスは、古いパスと新しいパスの比較です。

          1→2→3:元の最短距離、1→3:9;ステップ2 は新しいパスの最短距離 7 + 10 = 17を生成するため、最小値は9です

         ノード4:1→2の最短距離は7なので。ノード2から開始して、2→4からの最短距離は15です。したがって、ノード1から4の間の最短パスは、古いパスと新しいパスの比較です。

          1→2→3:元の最短距離、1→4 \無限:;ステップ2 は新しいパスの最短距離 7 + 15 = 22を生成するため、最小値は22です。

         

        3.手順2を最後まで繰り返します(上の図から、\無限ノード3、4、5、および6に対応する距離が9、22 および14の最小であることがわかります。ノード3、更新4および6を追加します)

          

         (上記の図から、\無限20、14、14が最小で、ノード6、更新5を追加することがわかります)

          

         (上の図から、20が20と23の中で最小であることがわかります。ノード4を追加して5を更新します)

         

          最後に、5が追加されます。このとき、見つからなかったコレクション要素は0で、最後です!

2、Matlabコードと分析

      主な機能:

        メイン関数は隣接行列を作成します。最初に、ノード1から2、3、4、5、6までの距離を見つけ、次にノード2から3、4、5、6、そしてノード6までの距離を見つけます。サブ関数dijkstraを実行して、ノード1からノード4への最短経路を見つけ、出力します。

clc;
close all
clear all
a=zeros(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(a==0)=inf; 
[distance,path]=dijkstra(a,1,4);
p=num2str(path);
sprintf('最短距离为%d\n具体路线为%s。',distance,p)

        サブ機能:

function [mydistance,mypath]=dijkstra(a,sb,db);
% 输入:a—邻接矩阵(aij)是指i到j之间的距离,无向矩阵
% sb—起点的标号, db—终点的标号
% 输出:mydistance—短路的距离, mypath—短路的路径
n=size(a,1);         %找出节点个数n
visited(1:n)=0;      %构建初步的查找矩阵visited,0代表未查找,1代表查找过
distance(1:n)=inf;   %保存起点到各顶点的短距离
distance(sb)=0;      %从起点sb到起点的距离为0
parent(1:n)=0;       
for i=1:n-1                   %循环查找n-1次   
    temp=distance;            %将distance中的值赋给temp,避免运算时丢失原值
    id1=find(visited==1);     %查找已经标号的点
    temp(id1)=inf;            %已标号点的距离换成无穷
    [t,u]=min(temp);          %找标号值小的顶点
    visited(u)=1;             %标记已经标号的顶点
    id2=find(visited==0);     %查找未标号的顶点
    for v=id2                 
        if  a(u,v)+distance(u)<distance(v)
            distance(v)=distance(u)+a(u,v);  %修改标号值
            parent(v)=u;
        end
    end
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);
return

コードは本のケースです。詳細はJiang Qiyuanを参照してください数学モデル(第2版)[M] //数学モデル(第2版)高等教育出版局、1987年。

おすすめ

転載: blog.csdn.net/weixin_41971010/article/details/107666810