图论模型-迪杰斯特拉算法和贝尔曼福特算法★★★★

news2024/11/26 19:28:57

该博客为个人学习清风建模的学习笔记,部分课程可以在B站:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili

目录

​1图论基础

1.1概念

1.2在线绘图

1.2.1网站

1.2.2MATLAB

1.3无向图的权重邻接矩阵 

1.4有向图的权重邻接矩阵

2迪杰斯特拉算法

2.1概念

2.2步骤

2.3问题

3贝尔曼福特算法

3.1概念

3.2负权回路

3.3代码

3.3.1计算最短路径

3.3.2返回任意两点的距离矩阵

3.3.3找给定范围内所有的点 

3.3.4示例代码 

 4总结


名称重要性难度
图论最短路径求解:迪杰斯特拉算法和贝尔曼福特算法★★★★★★★

1图论基础

1.1概念

图论中的图( Graph )是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事
物间具有这种关系。
一个图可以用数学语言描述为 G(V(G),E(G)) V(vertex) 指的是图的顶点集,E(edge) 指的是图的边集。
根据边是否有方向,可将图分为有向图和无向图。
另外,有些图的边上还可能有权值,这样的图称为有权图。

1.2在线绘图

1.2.1网站

https://csacademy.com/app/graph_editor/

1.2.2MATLAB

注:( 1 Matlab 做出来的图不是很漂亮,要是节点比较少,还是推荐大家使用在线作图。 2 )该函数在 2015b 之后的版本才支持,如果运行出错请下载新版本 Matlab

代码全部摘自清风老师: 

%% 注意:以下代码需要较新版本的matlab才能运行(最好是2016版本及以上哦)
% 如果运行出错请下载新版的matlab代码再运行

%% Matlab作无向图
% (1)无权重(每条边的权重默认为1)
% 函数graph(s,t):可在 s 和 t 中的对应节点之间创建边,并生成一个图
% s 和 t 都必须具有相同的元素数;这些节点必须都是从1开始的正整数,或都是字符串元胞数组。
s1 = [1,2,3,4];
t1 = [2,3,1,1];
G1 = graph(s1, t1);
plot(G1)
% 注意哦,编号最好是从1开始连续编号,不要自己随便定义编号
s1 = [1,2,3,5];
t1 = [2,3,1,1];
G1 = graph(s1, t1);
plot(G1)

% 注意字符串元胞数组是用大括号包起来的哦
s2 = {'学校','电影院','网吧','酒店'};
t2 = {'电影院','酒店','酒店','KTV'};
G2 = graph(s2, t2);
plot(G2, 'linewidth', 2)  % 设置线的宽度
% 下面的命令是在画图后不显示坐标
set( gca, 'XTick', [], 'YTick', [] );  

% (2)有权重
% 函数graph(s,t,w):可在 s 和 t 中的对应节点之间以w的权重创建边,并生成一个图
s = [1,2,3,4];
t = [2,3,1,1];
w = [3,8,9,2];
G = graph(s, t, w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 
set( gca, 'XTick', [], 'YTick', [] );  

%% Matlab作有向图
% 无权图 digraph(s,t)
s = [1,2,3,4,1];
t = [2,3,1,1,4];
G = digraph(s, t);
plot(G)
set( gca, 'XTick', [], 'YTick', [] );  

% 有权图 digraph(s,t,w)
s = [1,2,3,4];
t = [2,3,1,1];
w = [3,8,9,2];
G = digraph(s, t, w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 
set( gca, 'XTick', [], 'YTick', [] );  

1.3无向图的权重邻接矩阵 

Inf指代权重为无穷

1.4有向图的权重邻接矩阵

2迪杰斯特拉算法

2.1概念

算法讲解视频地址:
https://www.bilibili.com/video/av54668527

2.2步骤

2.3问题

按照该算法,从1到2的最短路径为2,路径为1\rightarrow 2,但实际从1\rightarrow 3\rightarrow 2的距离为1,才是真正的最短路径。

3贝尔曼福特算法

3.1概念

为了解决迪杰斯特拉算法不能应用于负权重问题,引入贝尔曼福特算法。

该算法不支持含有负权回路的图。

 有兴趣的同学可以参考下面两份资料弄懂其实现原理:

https://blog.csdn.net/a8082649/article/details/81812000
https://www.bilibili.com/video/av43217121

3.2负权回路

含有负权重的无向图都是负权回路

3.3代码

3.3.1计算最短路径

Method可选参数
选项说明
'auto' 默认值)
'auto'  选项会自动选择算法:
'unweighted'  用于没有边权重的 graph  digraph  输入。
'positive'  用于具有边权重的所有 graph  输入,并要求权
重为非负数。此选项还用于具有非负边权重的 digraph 
入。
'mixed'  用于其边权重包含某些负值的 digraph  输入。图
不能包含负循环。
'unweighted'
广度优先计算,将所有边权重都视为 1
'positive' 
Dijkstra 算法,要求所有边权重均为非负数。
'mixed' 仅适用于 digraph即有向图
适用于有向图的 Bellman‐Ford  算法,要求图没有负循环。
尽管对于相同的问题, 'mixed'  的速度慢于 'positive' ,但
'mixed'  更为通用,因为它允许某些边权重为负数。

3.3.2返回任意两点的距离矩阵

3.3.3找给定范围内所有的点 

3.3.4示例代码 

代码全部摘自清风老师

%% 注意:以下代码需要较新版本的matlab才能运行(最好是2016版本及以上哦)
% 如果运行出错请下载新版的matlab代码再运行

% 注意哦,Matlab中的图节点要从1开始编号,所以这里把0全部改为了9
% 编号最好是从1开始连续编号,不要自己随便定义编号
s = [9 9 1 1 2 2 2 7 7 6 6  5  5 4];
t = [1 7 7 2 8 3 5 8 6 8 5  3  4 3];
w = [4 8 3 8 2 7 4 1 6 6 2 14 10 9];
G = graph(s,t,w);
plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) 
set( gca, 'XTick', [], 'YTick', [] );  
[P,d] = shortestpath(G, 9, 4)  %注意:该函数matlab2015b之后才有哦

% 在图中高亮我们的最短路径
myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2);  %首先将图赋给一个变量
highlight(myplot, P, 'EdgeColor', 'r')   %对这个变量即我们刚刚绘制的图形进行高亮处理(给边加上r红色)

% 求出任意两点的最短路径矩阵
D = distances(G)   %注意:该函数matlab2015b之后才有哦
D(1,2)  % 1 -> 2的最短路径
D(9,4)  % 9 -> 4的最短路径

% 找出给定范围内的所有点  nearest(G,s,d)
% 返回图形 G 中与节点 s 的距离在 d 之内的所有节点
[nodeIDs,dist] = nearest(G, 2, 10)   %注意:该函数matlab2016a之后才有哦

 4总结

该章节主要是为了解决图论中最短路径问题的两种算法,迪杰斯特拉算法是基于贪心思想的一种算法,但是不能够解决含有负权值的问题,而贝尔曼福特算法可以解决迪杰斯特拉算法的不足,但是同样不能解决含有负权回路的最短路径问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1941232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的校园疫情防控系统(带1w+文档)

基于SpringBootVue的校园疫情防控系统(带1w文档) 基于SpringBootVue的校园疫情防控系统(带1w文档) 主要对首页、个人中心、学生管理、疫情动态管理、知识信息管理、防疫教育管理、健康打卡管理、请假申请管理、出校登记管理、入校登记管理、核酸报告管理、交流论坛、系统管理的…

MySQL的建表及查询

一。建立表 mysql> create table student(id int(10) not null unique primary key,name varchar(20) not null,sex varchar(4),birth year,department varchar(20),address varchar(50)); mysql> create table score(id int(10) not null unique primary key auto_incr…

精明选择施工项目管理工具的实用建议

国内外主流的10款施工项目进度管理软件对比:PingCode、Worktile、Contractor Foreman、建设工程项目管理平台(JSGC)、智慧工地综合管理系统、工程项目信息管理系统(GCXX)、Buildertrend、Procore、Autodesk Constructi…

Edge侧边栏copilot消失

Edge侧边栏copilot消失 当前环境 自己ip问题已解决,edge中已登录账号,地区已设置为美国,语言已设置为英文。具体可以通过空白页右上角的setting验证 解决方案 首先,打开“任务管理器”,在其中找到 Microsoft Edge…

【C语言】动态内存管理(下)(realloc函数)

文章目录 前言1. realloc2. realloc函数在调整空间时的细节2.1 针对情况1(realloc后面有足够的内存空间)2.2 针对情况2(realloc后面没有足够的内存空间)2.3 realloc函数使用的注意事项2.4 realloc的使用实例2.5 realloc函数的补充…

ubuntu安装mysql8.0

文章目录 ubuntu版本安装修改密码取消root跳过密码验证 ubuntu版本 22.04 安装 更新软件包列表 sudo apt update安装 MySQL 8.0 服务器 sudo apt install mysql-server在安装过程中,系统可能会提示您设置 root 用户的密码,请务必牢记您设置的密码。…

产线中有MES系统 还有安装SCADA的必要吗?

MES系统即制造执行系统(Manufacturing Execution System),是一种面向车间层的管理信息系统,旨在通过信息传递优化从订单下达到产品完成的全过程管理。 MES可以为企业提供包括制造数据管理、计划排程管理、生产调度管理、库存管理、…

网路布线和数值转换

文章目录 信号的分类数字信息的优势双绞线分类双绞线标准与分类 光纤的特点光纤分为单模光纤和多模光纤 光纤接口双绞线的连接规范EIA/TIA-568A和568B 线缆的连接综合布线系统无线电波的传输方式 数制转换十进制转二进制计算机的数值 信号的分类 1.模拟信号 2.数字信号 数字信…

动态住宅IP和静态住宅IP使用上有差异吗?

在互联网连接的世界中,IP地址是我们识别和访问网络资源的关键。住宅IP地址,特别是动态住宅IP和静态住宅IP,是两种不同类型的IP分配方式,它们在使用和功能上存在显著差异。 1. IP地址的稳定性 动态住宅IP:这种IP地址是…

七月份信息课总结

总结 七月份信息课总结算法记录线性代数:数论(这是信竞生和数竞生都最难跨出的一步):动态规划(~~DP万岁!!!~~)组合数学(恶心,但我很喜欢&#xff…

Python爬虫-淘宝搜索热词数据

前言 本文是该专栏的第70篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细针对“亚马逊Amazon搜索热词”数据采集的详细介绍,对此感兴趣的同学,可以往前翻阅《Python爬虫-某跨境电商(AM)搜索热词》进行查看。 而在本文,笔者将以淘宝为例,获取…

Linux----Mplayer音视频库的移植

想要播放视频音乐就得移植相关库到板子上 Mplayer移植需要依赖以下源文件:(从官网获取或者网上) 1、zlib-1.2.3.tar.gz :通用的内存空间的压缩库。 2、libpng-1.2.57.tar.gz :png格式图片的压缩或解压库 3、Jpegsrc.v9b.tar.gz : jpeg格式图片的压…

linux配置podman阿里云容器镜像加速器

1.下载podman yum install -y podman systemctl status podman systemctl start podman 2.获取阿里云个人容器镜像加速器地址 访问阿里云官网:首先,您需要访问阿里云(Alibaba Cloud)的官方网站。阿里云官网的URL是:…

医疗器械维修人员培训的重要性及其操作策略

医疗器械维修人员培训的重要性及其操作策略是确保医疗器械持续、安全、有效运行的关键。以下是对其重要性的解释以及相应的操作策略: 医疗器械维修人员培训的重要性 确保患者安全 经过培训的维修人员能够更准确地诊断问题,及时修复设备,避…

【IntelliJ IDEA】一篇文章集合所有IDEA的所有设置

IntelliJ IDEA 是一款功能强大的集成开发环境(IDE),其设置涵盖了多个方面,以满足不同开发者的需求和偏好。由于 IDEA 的设置相当复杂和详尽,这里无法在一篇简短的文章中详细介绍所有设置。然而,我可以提供一…

轻松掌握:两个方法合并ZIP分卷压缩包

在文件传输和存储过程中,为了绕过文件大小限制或优化下载速度,我们常常会将大型文件分割成多个较小的ZIP分卷压缩包。然而,在接收这些分卷后,如何正确地将它们合并回原始的ZIP文件,可能是许多用户面临的一个问题。本文…

LeetCode两数相加

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。…

JAVA JUC学习笔记

基础知识 1、进程和线程的对比 进程基本上相互独立的,而线程存在于进程内,是进程的一个子集进程拥有共享的资源,如内存空间等,供其内部的线程共享进程间通信较为复杂 同一台计算机的进程通信称为 IPC(Inter-process …

前端面试 vue 按钮级的权限控制

方案一 按钮权限也可以用v-if判断 但是如果页面过多,每个页面页面都要获取用户权限role和路由表里的meta.btnPermissions,然后再做判断 这种方式就不展开举例了 方案二 使用自定义指令实现 按钮级的权限控制 思维导图 心就是自定义指令的书写 首先…

exo 大模型算力共享;Llama3-70B是什么

目录 exo 大模型算力共享 exo框架的特点 如何使用exo框架 注意事项 结论 Llama3-70B是什么 一、基本信息 二、技术特点 三、性能与应用 四、未来发展 exo 大模型算力共享 exo框架的特点 异构支持:支持多种不同类型的设备,包括智能手机、平板电脑、笔记本电脑以及高…