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

该博客为个人学习清风建模的学习笔记,部分课程可以在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.mzph.cn/diannao/48853.shtml

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

相关文章

15现代循环神经网络—GRU与LSTM

目录 1.门控循环单元 GRU关注一个序列门候选隐状态(candidate hidden state)隐状态总结从零开始代码实现代码简洁实现2.长短期记忆网络 LSTM门候选记忆单元(candidate memory cell)记忆单元隐状态代码1.门控循环单元 GRU GRU 是最近几年提出来的,在 LSTM 之后,是一个稍微简…

关于 windows系统中双精度double除法编译优化导商变量不变化(代码调整+volatile) 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140592209 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

Python爬虫(2) --爬取网页页面

文章目录 爬虫URL发送请求UA伪装requests 获取想要的数据打开网页 总结完整代码 爬虫 Python 爬虫是一种自动化工具,用于从互联网上抓取网页数据并提取有用的信息。Python 因其简洁的语法和丰富的库支持(如 requests、BeautifulSoup、Scrapy 等&#xf…

Redis 主从复制、哨兵机制关键参数与命令

建立主从连接 【命令】replicaof <服务器 A 的 IP 地址> <服务器 A 的 Redis 端口号> 形成主服务器节点和从服务器节点的关系&#xff0c;也可以让从节点成为二级主节点分摊压力。 【命令】psync 进行数据同步命令&#xff0c;会携带 runID 和 offset。 从节点…

基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF.仿真输出误差收敛曲线和误差协方差收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022…

laravel框架基础通识-新手

常用目录及其解析 routes 该目录为路由目录 一般根据api uri可以反向查找对应路由及其controller&#xff0c;目录下的文件名一般和url的第一级对应为了规范&#xff0c;然后根据根据里面具体分组和别名对应拼接对应路由url&#xff0c;后面对应的则是controller&#xff0c…

springboot 配置 spring data redis

1、在pom.xml引入父依赖spring-boot-starter-parent&#xff0c;其中2.7.18是最后一版支持java8的spring <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.18</…

HTML5+ push消息推送

HTML5 push消息推送 push消息推送关键 API 介绍plus.pushaddEventListenerclearcreateMessagegetAllMessagegetClientInfosetAutoNotificationremove 实践消息推送开启权限 push消息推送 HTML5 的 Push 消息推送功能是一个强大的特性&#xff0c;它允许开发者在 Web 应用中实现…

助燃新质生产力,魔珐科技亮相IMC2024制造业数字科技大会展示有言AIGC视频工具价值

2024年7月19日&#xff0c;IMC2024第八届制造业数字科技大会在上海盛大开幕&#xff0c;本次大会以《向“智”而行》为主题&#xff0c;250智能制造行业数字化转型企业、行业领军者及实践者共聚一堂&#xff0c;共同助力企业增强技术“硬核力”&#xff0c;为新质生产力蓄势赋能…

Matlab仿真教程

什么是仿真&#xff1f; 仿真是一种使用数学模型和算法来模拟和分析实际系统或过程的技术。仿真可以帮助我们更好地理解系统的行为、优化系统的性能和预测系统的结果。 Matlab仿真 Matlab是一种广泛使用的仿真和分析工具。它提供了丰富的函数库和工具&#xff0c;可以用来解…

buuctf web 第五到八题

[ACTF2020 新生赛]Exec 这里属实有点没想到了&#xff0c;以为要弹shell&#xff0c;结果不用 127.0.0.1;ls /PING 127.0.0.1 (127.0.0.1): 56 data bytes bin dev etc flag home lib media mnt opt proc root run sbin srv sys tmp usr var127.0.0.1;tac /f*[GXYCTF2019]Pin…

最新全新UI异次元荔枝V4.4自动发卡系统源码

简介&#xff1a; 最新全新UI异次元荔枝V4.4自动发卡系统源码 更新日志&#xff1a; 1增加主站货源系统 2支持分站自定义支付接口 3目前插件大部分免费 4UI页面全面更新 5分站可支持对接其他分站产品 6分站客服可自定义 7支持限定优惠 图片&#xff1a; 会员中心截图&…

多类支持向量机损失(SVM损失)

(SVM) 损失。SVM 损失的设置是&#xff0c;SVM“希望”每个图像的正确类别的得分比错误类别高出一定幅度Δ。 即假设有一个分数集合s[13,−7,11] 如果y0为真实值&#xff0c;超参数为10&#xff0c;则该损失值为 超参数是指在机器学习算法的训练过程中需要设置的参数&#xf…

学习并测试SqlSugar的单库事务功能

SqlSugar支持单库事务、多租户事务、多库事务&#xff0c;本文学习并测试单库事务的基本用法。   使用SqlSugarClient类、ISqlSugarClient接口都可以创建SqlSugarClient数据库操作实例&#xff0c;其区别在于&#xff0c;针对单库而言&#xff0c;SqlSugarClient类支持调用Be…

【python】NumPy运行报错分析:IndexError——数组索引越界问题

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Android init.rc的启动流程

Android开机优化系列文档-CSDN博客 Android 14 开机时间优化措施汇总-CSDN博客Android 14 开机时间优化措施-CSDN博客根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客Android系统上常见的性能优化工具-CSDN博客Android上如何使用perfetto分析systrace-CSDN博客A…

C++中的atomic:原子

在多线程编程中&#xff0c;原子操作是一种重要的技术&#xff0c;可以确保在并发环境中进行无锁操作。C11 引入了 std::atomic<>&#xff0c;提供了一种无锁的机制来操作变量&#xff0c;确保在并发环境中访问和修改变量时没有数据竞争。本文将介绍 std::atomic<>…

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号1

本来打算找到工作再整理高级的题库&#xff0c;但一直没什么面试机会。宅在家里也不知道干些什么。索性就把高级的题库整理出来了。也算有头有尾。高级的题库更新之后&#xff0c;专业性更强了&#xff0c;不是真正从事这一行的&#xff0c;很难做出来。本人就是个小菜鸡&#…

【.NET全栈】ASP.NET开发Web应用——用户控件和绘图

文章目录 前言一、用户控件1、创建用户控件2、使用用户控件3、在web.config中注册用户控件4、用户控件中公开属性5、用户控件事件6、动态加载用户控件 二、动态绘图1、基本绘图2、绘制一个自定义的图片3、在Web页面放置自定义图片4、图片格式和质量5、一个Web绘图示例程序 前言…

matlab simulink气隙局部放电仿真技术研究

1、内容简介 略 87-可以交流、咨询、答疑 2、内容说明 略 为了解决目前国内外局部放电仿真方法难以计算气隙局部放电暂态过程的问题 , 利用 MATLAB (SIMULINK ) 的公共模块库和电力系统专业模块库 , 根据单气隙局部放电仿真物理模型 , 构造了气隙局部放 电仿真计算的电…