최단 경로 문제의 기본 내용
최단 경로에 대한 연구가 연결하여 형성되는 점 사이의 네트워크도, 해당하는 경로 (두 점 사이의 거리로 이해 될 수있는) 소정의 가중치를 부여하고, 임의의 두 지점, 경로 사이에 걸어 어떻게 계산 짧은 문제. 여기에 거리에서 다양한 지점 사이의 오버 헤드 작업의 일종으로 해석 될 수있다.
모델 호출
최단 경로 문제를 해결하고, 취할 수 dijkstra
또는 floyd
다음과 같이 모델 형태를 호출, 두 가지 모델 :
[mydist,mypath]=mydijkstra(a,sb,db) % dijkstra模型
[mydist,mypath]=myfloyd(a,sb,db) % floyd模型
그 중,
- A는 인접 행렬이고
- 시작 지점 번호와 같은 SB
- 라벨을 종료 DB
- 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 | 디 |
---|---|---|---|---|---|---|---|
아니오. | 1 | 이 | 삼 | 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