图论模型-Dijkstra算法


图论模型-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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值