用MATLAB求最短路径(graphshortestpath)和求最小生成树(minspantree),代码演示

求最短路径(graphshortestpath),求最小生成树(minspantree)

1、最短路径问题

最短路径:从图中的某个顶点出发,到达另外一个顶点的所经过的边的权重之和最小的一条路径。

  • 图:边和节点组成的结构,在数学建模中例如本题中道路和城市。
  • 边:带有方向的是有向图,否则为无向图。
  • 权重:每条边都有与之对应的值,本题中边道路,边的权重就是道路长度,当然是越小越好。

MATLAB求解最短路径:**Dijkstra算法,或MATLAB的graphshortestpath**函数

例:image-20240105134622985

%sparse生成稀疏矩阵,也就是除了注明的几个元素外,其余都是0
%spare里第一个和第二个矩阵相同位置的元素值就是非零元素的索引
%非零元素的值
%w是每条边的权值
w=[10,5,2,1,4,6,7,3,9,2]
DG = sparse([1,1,2,2,3,4,4,5,5,5],[2,5,5,3,4,3,1,2,3,4],w)
% 没有就默认为零,这样快速生成一个稀疏矩阵

生成image-20240105134301179

% dist是最短路径的值, path是最短路径的节点顺序
% pred是到每一个节点的最短路径的终点前一个节点
% 如果求节点1到其他所有节点的最短路径呢?
[dist,path,pred] = graphshortestpath(DG,1,3)  %后面的数字参数是起点和终点,然后计算最短路径

显示

% biograph生成图对象; view显示该图
point_name =["城市1", "城市2", "城市3","城市4", "城市5"]
h = view(biograph(DG,point_name, 'Showweights', 'on'))

优化

% 将最短路径的节点和边缘标记为红色并增加线宽
% getedgesbynodeid得到图h的指定边的句柄
% 第一个参数是图,第二个是边的出点,第三个是边的入点%句柄确保能找到对应的东西
% get查询图的属性,h.Nodes(path), 'ID'得到图h中最短路径的
% set函数设置图形属性
edges = getedgesbynodeid(h,get(h.Nodes(path),'ID')); %选取最短路径,并找到ID 
set(edges,'LineColor', [1 0 0])% RGB数值,红绿蓝
set(edges,'Linewidth',2)

最终结果:image-20240105135745136

2、最小生成树

  • 最短路径的区别:最短路径是针对某一顶点作为起点而言的,最小生成树是所有顶点连通总路径最小

  • 最小生成树的求解:

    MATLAB的minspantree函数求解最小生成树,还有克鲁斯卡尔(Kruskal)算法,和普利姆(Prim)算法。

image-20240105141235495

minspantree函数演示:

s = [1,1,2,2,3,3,4,4,4,5];
t = [2,3,4,5,4,7,5,6,7,6];
weights = [50,60,65,40,52,45,50,30,42,70];
%生成无向图,其中s和t对应元素代表着边,weights是权值
G= graph(s,t,weights);
%求出最小生成树,得到的T包含最小生成树的节点和对应边的权
T= minspantree(G);

% p = plot(G)就能把图片展现出来,后面是为了美观设置字体等
p = plot(G, 'EdgeLabel ',G.Edges.weight,"MarkerSize",8,'NodeFontSize',16,'EdgeFontSize',16)

%highlight突出显示绘制的图中的节点和边
highlight(p,T,'EdgeColor','red',"Linewidth",3)  

在上述的代码中,T里面存的就是最小的生成树,而后续的操作只是为了更加的美观。
运行结果:
image-20240105152003423

  • 15
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Dijkstra算法是一种用于计算一个节点到其他所有节点的最短路径的算法。在MATLAB实现Dijkstra算法可以使用现成的函数,如graphshortestpath()或dijkstra()。也可以自己编写代码实现。 ### 回答2: Dijkstra算法是解带权有向图最短路径问题的经典算法之一,也是Matlab中常用的算法之一。Dijkstra算法的基本思想是:从一个起点开始,通过不断更新节点的距离信息,在未遍历的节点中选取当前距起点最近的节点,然后以该节点为起点,继续遍历直到到达目标节点或无法继续遍历为止。 在Matlab中,可以使用graph对象来表示带权有向图,使用shortestpath函数来最短路径。具体步骤如下: 1. 构建带权有向图 在Matlab中,可以使用graph函数创建一个带权有向图对象。graph函数的输入为邻接矩阵或邻接表,表示图中各点之间的连接关系。邻接矩阵中每个元素表示相应边的权重,若边不存在则为0。例如,对于以下的有向图: ![image-20211215094858573](https://i.loli.net/2021/12/15/MXQFigwL5sekzRO.png) 可以使用如下代码创建graph对象: ```matlab G = graph([1 1 2 2 3 3 3 4 4],[2 3 3 4 4 5 6 5 6],[3 2 6 1 5 4 2 4 6]); LWidths = 5*G.Edges.Weight/max(G.Edges.Weight); figure; H = plot(G,'LineWidth',LWidths); ``` 2. 使用dijkstra算法最短路径Matlab中,可以使用shortestpath函数来最短路径。该函数的输入为起点和终点的节点编号,以及表示有向图的graph对象。例如,将以上图中1号节点为起点,6号节点为终点的最短路径出: ```matlab path = shortestpath(G,1,6); highlight(H,path,'LineWidth',2) ``` 最终输出结果为: ![image-20211215095119398](https://i.loli.net/2021/12/15/qt3K9bsJ5kwRX4H.png) 可以看到,从1号节点到6号节点的最短路径为[1 3 6],路径长度为8。 ### 回答3: Dijkstra算法是一种经典的最短路径算法,适用于所有边的非负权值图。在MATLAB中,我们可以使用Dijkstra算法来寻找图中指定两个点之间的最短路径。 首先,需要定义一个图的邻接矩阵表示。对于一个n个节点的图,邻接矩阵A,表示节点i和j之间的权值为wij。如果节点i和j之间没有边相连,则wij为无穷大。 接下来,我们需要定义一个起点。我们将起点的最短路径设置为0,其他点的最短路径初始化为无穷大。 然后,我们可以开始使用Dijkstra算法来寻找最短路径。在每次迭代中,我们选择当前未被访问的节点中最短路径最小的一个节点。然后,我们更新与该节点相邻的节点的最短路径,如果新路径比原路径更短,则更新该节点的最短路径。我们将这个被更新的节点标记为已访问。 重复上述步骤,直到我们找到了终点或没有更多节点可以访问。 最后,我们可以通过检查终点节点的最短路径来确定最短路径的长度,以及使用存储已访问节点的列表来确定最短路径的具体路径。 在MATLAB中,我们可以通过编写Dijkstra算法的代码实现这个过程。具体实现的步骤可以参考以下示例代码: function [path, shortest_dist] = dijkstra(A, start_node, end_node) n = size(A, 1); dist = inf(1, n); visited = false(1, n); dist(start_node) = 0; for i = 1 : n-1 curr_node = find_node(dist, visited); visited(curr_node) = true; if visited(end_node) break; end for j = 1 : n if ~visited(j) && A(curr_node,j) > 0 && dist(curr_node) + A(curr_node,j) < dist(j) dist(j) = dist(curr_node) + A(curr_node,j); end end end shortest_dist = dist(end_node); % reconstructing the path path = end_node; curr_node = end_node; while curr_node ~= start_node for j = 1 : n if A(j, curr_node) > 0 && dist(j) + A(j,curr_node) == dist(curr_node) path = [j path]; curr_node = j; break; end end end end function curr_node = find_node(dist, visited) n = length(dist); min_dist = inf; curr_node = -1; for i = 1 : n if dist(i) < min_dist && ~visited(i) curr_node = i; min_dist = dist(i); end end end 此代码使用邻接矩阵A、起点和终点节点来计算最短路径,并返回路径和最短距离。在上面的代码中,我们使用了find_node函数来寻找当前未被访问的节点中最短路径最小的一个节点。 综上所述,使用Dijkstra算法来最短路径问题是一种有效和常用的方法,Matlab中也提供了丰富的函数和工具来简化这一过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曼诺尔雷迪亚兹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值