图论模型-Dijkstra算法
这是网上的Dijkstra算法流程
这是我根据dijkstra算法思想编写的matlab代码
function [P,Path]=dijkstra(w,start)
%输入,邻接矩阵w,起始点start
%输出,P从起始点到目标各点的最短距离
%输出 Path从起始点到目标各点的最短距离的路径
n=length(w);
isT=[start];%已经访问过的顶点序号
isP=setdiff(1:n,isT);%还没有被访问的顶点序号
P=w(start,:);%对于还没有被访问的点,从起点到对应所需距离
[Path{1:n}]=deal(start);%到达各顶点的最短路径
while length(isT)<n%当所有点都访问过,结束循环
[~,seq]=min(P(isP));
isT=[isT isP(seq)];%更新已经访问过的节点序号
if w(isT(end-1),isT(end))==inf
Path{isT(end)}=[Path{isT(end-1)}(1:end-1) isT(end) ];
else
Path{isT(end)}=[Path{Path{isT(end)}(end)} isT(end) ];
end
isP=setdiff(1:n,isT);%更新还没有被访问的顶点序号
if ~isempty(isP)
%更新P
seque=find(w(isT(end),isP)~=inf);
for i=seque
if P(isT(end))+w(isT(end),isP(i))<P(isP(i))
[P(isP(i))]=P(isT(end))+w(isT(end),isP(i));%取原距离和新路径的距离的最小值
Path{isP(i)}=[Path{isT(end)} ];
end
end
else
break;
end
end
for i=1:length(Path)
plot(Path{i},P(Path{i}));
hold on;
end
xlabel('路径');
ylabel('路径长度');
grid on;
hold off;
end
程序结果:
下面是另一道题:
使用上面的程序得到的结果如下:
使用lingo动态规划求解此问题
程序如下;
model:
SETS:
CITIES/S,A1,A2,A3,B1,B2,C1,C2,T/:L; !可以用字母枚举,也可以用数字 1..7 ;
ROADS(CITIES,CITIES)/ !定义稀疏集合的方法;
S,A1 S,A2 S,A3
A1,B1 A1,B2 A2,B1 A2,B2 A3,B1 A3,B2
B1,C1 B1,C2 B2,C1 B2,C2
C1,T C2 T
/:D;
ENDSETS
DATA:
D=6 3 3
6 5 8 7 7 4
6 7 8 9
5 6;
L=0, , , , , , , ,; !一个逗号代表一个数据,预留内存;
ENDDATA
!动态规划思想求解;
@FOR(CITIES(I)| I#GT# @INDEX(CITIES,S):L(I)=@MIN(ROADS(J,I):L(J)+D(J,I)));
end