当前位置: 首页 > news >正文

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

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

文章目录

    • 求最短路径(graphshortestpath),求最小生成树(minspantree)
      • 1、最短路径问题
      • 2、最小生成树

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

相关文章:

  • 使用“反向代理服务器”的优点是什么?
  • 从零学Java 集合概述
  • 【Flutter 开发实战】Dart 基础篇:常见的数据类型
  • 232.【2023年华为OD机试真题(C卷)】计算三叉搜索树的高度(JavaPythonC++JS实现)
  • 在React里面使用mobx状态管理详细步骤
  • Linux内核--进程管理(十二)LinuxIO基础知识与概念
  • uniapp自定义顶部导航并解决打包成apk后getMenuButtonBoundingClientRect方法失效问题
  • 华为“纯血”鸿蒙加速进场 高校、企业瞄准生态开发新风口
  • 安防监控EasyCVR视频融合/汇聚平台大华热成像摄像机智能告警上报配置步骤
  • 计算机算法贪心算法
  • 爆肝整理,接口测试+为什么要做接口测试总结,策底贯通...
  • 9.spring aop 原理
  • C++学习笔记(三十二):c++ 堆内存与栈内存比较
  • 什么是原生ip和广播ip
  • 记录汇川:H5U与Fctory IO测试8
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 2017年终总结、随想
  • HTML5新特性总结
  • JAVA 学习IO流
  • JavaScript HTML DOM
  • JavaScript设计模式系列一:工厂模式
  • JAVA并发编程--1.基础概念
  • Terraform入门 - 3. 变更基础设施
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • ------- 计算机网络基础
  • 力扣(LeetCode)965
  • 强力优化Rancher k8s中国区的使用体验
  • 深度学习中的信息论知识详解
  • 我有几个粽子,和一个故事
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • # 数据结构
  • # 数论-逆元
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • $L^p$ 调和函数恒为零
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (算法二)滑动窗口
  • (转)Google的Objective-C编码规范
  • (转)mysql使用Navicat 导出和导入数据库
  • (状压dp)uva 10817 Headmaster's Headache
  • *1 计算机基础和操作系统基础及几大协议
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 使用配置文件
  • .net连接MySQL的方法
  • .net中调用windows performance记录性能信息
  • .sh
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [BSGS算法]纯水斐波那契数列
  • [C#]winform部署yolov5-onnx模型
  • [C++]类和对象【下】
  • [CF494C]Helping People