1.ダイクストラアルゴリズム:指定された2つの頂点間の短いパス
異なる点間の隣接行列は無向グラフであり、a(i、j)は点iから点jまでの距離を表し、2つの点が接続されていない場合は無限大で表されます。具体的な例を次の表に示します。
私の理解によると、アルゴリズムの原理は、nノード間の検索(複雑度)を、nノードの2つのセット(検索セットと未検索セット)間の検索(複雑度)に変換することです。特定のプロセス:開始点から最初は、貪欲アルゴリズムの戦略が採用されており、開始点に最も近く、訪問されていない頂点の、隣接するノードに移動するたびに、終了点まで延長されます。
以下に示すように(プログラムの場合とは異なり)より具体的にするには、ノード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年。