matlab的开方算法_matlab实现最短路径算法(Dijkstra算法)

最优化问题一直是人们最想解决的问题,怎样解决旅行商问题、邮递员问题?欧拉为了解决七桥问题,创建了图论。后人在它的基础上解决最短路径问题,也就是我们的邮递员问题,为了解决此问题,创建Dijkstra算法解决了从定点x0到目标点的最短路径问题。

在学习matlab的过程中,还得学学python,对于提高自己的编程能力有很好的锻炼。

点击下方链接获取python编程资料!

给出定点x0到u的最短距离在网络图之中,程序如下:

clc

clear

%问题:对于无向图实现最短距离

%初始值

%Dijkstra算法应用到网络中的最短距离

%求解出父亲点、最短路径

%创建时间:2020.10.18

w=[0 1 1 1 inf inf inf inf; %创建邻接矩阵

1 0 inf 1 1 inf inf inf;

1 inf 0 1 inf inf 1 inf;

1 1 1 0 1 1 1 inf;

inf 1 inf 1 0 1 inf 1;

inf inf inf 1 1 0 1 1;

inf inf 1 1 inf 1 0 1;

inf inf inf inf 1 1 1 0];

n=size(w,1);

w1=w(1,:);

for i =1:n

l(i)=w1(i); %赋初值l(v),l(u0)=0,l(u1)=2,l(u2)=1,l(u3)=8,l(u4)=inf,...

z(i)=1; %这里所求的z(i)-1就是父亲点的意思

end

s=[];

s(1)=1; %1代表u0

u=s(1); %这里对于我们的u的初始值选取

k=1;

%进行循环更新l(v)、z(v)

while k

%更新l(v)、z(v)

for i=1:n

for j=1:k

if i~=s(j)

if l(i)>l(u)+w(u,i)

l(i)=l(u)+w(u,i);

z(i)=u;

end

end

end

end

%第n次更新

ll=l; %将更新后的l赋值给ll

for i=1:n

for j=1:k

if i~=s(j) %点集出列,不能选择

ll(i)=ll(i); %边权不改变

else

ll(i)=inf; %无关联的情况下当前点与其余点的边权为无穷

end

end

end

lv=inf; %边权赋予给无穷

for i=1:n %循环v0到v7寻找v0到v7的最短路

if ll(i)

lv=ll(i);

v=i; %顶点集更新,并且赋予给i

end

end

lv; %输出边权

v; %输出顶点集

s(k+1)=v; %出列点

k=k+1;

u=s(k);

end

l

z

输出结果:

l =

0 1 1 1 2 2 2 3

z =

1 1 1 1 2 4 3 5

其中l代表的是最短路径距离,z表示的是最短路径走向。从上述结果可知,路径为,

v1--v2-v5-v8;其最短距离为1+2+3=6;所以得知该网络图的最短路距离径为6。

对于Dijkstra算法得理解父亲点与距离权重,这是理解算法原理的基础!此代码的好处在于,你根据自己的问题,相应的把邻接矩阵改了就可以用!

欢迎关注知乎,留言交流!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你实现Dijkstra算法Matlab代码,并计算最短路径值。 Dijkstra算法是一种用于解决带权重有向图或者无向图的单源最短路径问题的贪心算法。下面是Dijkstra算法Matlab实现代码,注释中包含了详细的解释: ```matlab function [dist, path] = dijkstra_algorithm(graph, source_node) % graph: 一个n*n的矩阵,表示有向图或无向图的邻接矩阵 % source_node: 源节点 % dist: 从源节点到其他所有节点的最短距离 % path: 从源节点到其他所有节点的最短路径 n = length(graph); % 获取图中节点的个数 dist = Inf(1, n); % 初始化所有节点到源节点的距离为无穷大 visited = false(1, n); % 初始化所有节点的访问状态为未访问 prev = zeros(1, n); % 记录最短路径中每个节点的前一个节点 dist(source_node) = 0; % 源节点到自己的距离为0 for i = 1:n min_dist = Inf; u = -1; % 找到当前未访问节点中距离源节点最近的节点 for j = 1:n if ~visited(j) && dist(j) < min_dist u = j; min_dist = dist(j); end end if u == -1 % 当前没有未访问的节点,退出循环 break end visited(u) = true; % 将最近的节点标记为已访问 % 更新与最近节点相邻的未访问节点的距离 for v = 1:n if ~visited(v) && graph(u, v) ~= Inf && dist(u) + graph(u, v) < dist(v) dist(v) = dist(u) + graph(u, v); prev(v) = u; end end end path = cell(1, n); % 初始化路径 for i = 1:n if i == source_node % 源节点到自己的路径为自己 path{i} = num2str(i); elseif prev(i) == 0 % 源节点到该节点没有路径 path{i} = 'No path exists'; else % 从源节点到该节点的路径 path{i} = num2str(i); j = i; while j ~= source_node j = prev(j); path{i} = [num2str(j) ' -> ' path{i}]; end path{i} = [num2str(source_node) ' -> ' path{i}]; end end ``` 现在我们可以使用上面的代码来计算最短路径。假设我们有以下的邻接矩阵: ```matlab graph = [0, 7, Inf, 5; 7, 0, 8, 9; Inf, 8, 0, Inf; 5, 9, Inf, 0]; ``` 源节点是1,我们可以调用dijkstra_algorithm函数来计算最短路径: ```matlab [source_dist, source_path] = dijkstra_algorithm(graph, 1); ``` 这将返回源节点到每个节点的最短距离和最短路径

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值