数学建模学习笔记(七)——图论最短路问题
文章目录
- 一、综述
- 二、图论最短路问题
- 三、几个简单的作图方法
- 四、Dijkstra(迪杰斯特拉)算法
- 五、Bellman-Ford算法
- 六、总结
一、综述
本文主要根据图论的基本概念,介绍图论中常见的建模问题——最短路问题。同时,介绍了解决图论最短路问题的两种算法:Dijkstra(迪杰斯特拉)算法和Bellman-Ford(贝尔曼-福特)算法。
在此之前,需要具备基本的图论知识哦~~~
二、图论最短路问题
图论最短路问题指的是在带权重的图中,求出一条从一点节点到另一个节点的路径,使这条路径上的权重之和最小。
三、几个简单的作图方法
1.CS Academy:
https://csacademy.com/app/graph_editor/
2. Matlab:
无向图:graph()函数
有向图:digraph()函数
四、Dijkstra(迪杰斯特拉)算法
DijkstraDijkstraDijkstra(迪杰斯特拉)算法描述
假设未选取的节点集合未V,已选取的节点集合为S。
-除起点外,其他节点初始距离为 ∞\infty∞,起点距离为0。
-更新节点之间的距离(相邻接的节点距离即为权值,不相邻接的节点距离仍为 ∞\infty∞)。
-选取另一个未被选取过且距离最小的节点作为中转点,更新距离。(原距离 + 该节点和目标节点的权值 < 目标节点的原距离,则更新目标节点的距离为前者;否则不更新)。
-重复第三步,直到到达目标节点。
下面来看一个例子:
有一个旅行者想要从 v1v1v1 节点到 v8v8v8 ,求出最短旅行路线。
解决步骤
第一步:初始化表格节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 0 0 0 0 0 0 0 0 0 距离 inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf 父亲节点 -1 -1 -1 -1 -1 -1 -1 -1 -1 第二步:从 v1 节点开始
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 0 0 0 0 0 0 0 0 距离 0 inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf 父亲节点 v1 -1 -1 -1 -1 -1 -1 -1 -1 第三步:更新从 v1 可到达的节点的距离
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 0 0 0 0 0 0 0 0 距离 0 6 3 1 inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf 父亲节点 v1 v1 v1 v1 -1 -1 -1 -1 -1 第四步:取距离最小的节点 v4 作为中转点,更新从 v4 可到达的节点标号(注意比较与原距离的大小)
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 0 0 1 0 0 0 0 0 距离 0 6 3 1 inf\infinf inf\infinf inf\infinf inf\infinf inf\infinf 父亲节点 v1 v1 v1 v1 -1 -1 -1 -1 -1 第五步:更新后的结果
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 0 0 1 0 0 0 0 0 距离 0 6 3 1 inf\infinf 11 inf\infinf inf\infinf inf\infinf 父亲节点 v1 v1 v1 v1 -1 v4 -1 -1 -1 第六步:再取距离最小的节点 v3 作为中转点,更新从 v3 可到达的节点标号(注意比较与原距离的大小)
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 0 1 1 0 0 0 0 0 距离 0 6 3 1 inf\infinf 11 inf\infinf inf\infinf inf\infinf 父亲节点 v1 v1 v1 v1 -1 v4 -1 -1 -1 第七步:更新后的结果(由于3 + 2(v3 到 v2 的距离)= 5 < 6,因此更新 v2 列的距离)
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 0 1 1 0 0 0 0 0 距离 0 5 3 1 inf\infinf 11 inf\infinf inf\infinf inf\infinf 父亲节点 v1 v3 v1 v1 -1 v4 -1 -1 -1 第八步:再取距离最小的节点 v2 作为中转点,更新从 v2 可到达的节点标号(注意比较与原距离的大小)
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 1 1 1 0 0 0 0 0 距离 0 5 3 1 6 11 inf\infinf inf\infinf inf\infinf 父亲节点 v1 v3 v1 v1 v2 v4 -1 -1 -1 第九步:再取距离最小的节点 v5 作为中转点,更新从 v5 可到达的节点标号(注意比较与原距离的大小)
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 1 1 1 1 0 0 0 0 距离 0 5 3 1 6 11 inf\infinf inf\infinf inf\infinf 父亲节点 v1 v3 v1 v1 v2 v4 -1 -1 -1 第十步:更新后的结果
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 1 1 1 1 0 0 0 0 距离 0 5 3 1 6 10 9 12 inf\infinf 父亲节点 v1 v3 v1 v1 v2 v5 v5 v5 -1 第十一步:再取距离最小的节点 v7 作为中转点,更新从 v7 可到达的节点标号(注意比较与原距离的大小)
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 1 1 1 1 0 1 0 0 距离 0 5 3 1 6 10 9 12 inf\infinf 父亲节点 v1 v3 v1 v1 v2 v5 v5 v5 -1 第十二步:再取距离最小的节点 v6 作为中转点,更新从 v6 可到达的节点标号(注意比较与原距离的大小)
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 1 1 1 1 1 1 0 0 距离 0 5 3 1 6 10 9 12 inf\infinf 父亲节点 v1 v3 v1 v1 v2 v5 v5 v5 -1 第十三步:再取距离最小的节点 v8 作为中转点,更新从 v8 可到达的节点标号(注意比较与原距离的大小)
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 1 1 1 1 1 1 1 0 距离 0 5 3 1 6 10 9 12 15 父亲节点 v1 v3 v1 v1 v2 v5 v5 v5 v8 第十四步:最终结果
节点 v1 v2 v3 v4 v5 v6 v7 v8 v9 是否已被访问(0/1) 1 1 1 1 1 1 1 1 1 距离 0 5 3 1 6 10 9 12 15 父亲节点 v1 v3 v1 v1 v2 v5 v5 v5 v8 可以从终点v8倒推:v8⇐v5⇐v2⇐v3⇐v1v_8 \Leftarrow v_5 \Leftarrow v_2 \Leftarrow v_3 \Leftarrow v_1v8⇐v5⇐v2⇐v3⇐v1,这就是最短路径。将路径上的权值相加可以得出,最短路径的长度为:12(可以直接有 v8 那一列的距离得出),结果如图:
若只考虑路径长度,而不考虑具体路径,还可以这样列表:
v1 v2 v3 v4 v5 v6 v7 v8 v9 0 ∞\infty∞ ∞\infty∞ ∞\infty∞ ∞\infty∞ ∞\infty∞ ∞\infty∞ ∞\infty∞ ∞\infty∞ $ 6 3 1 ∞\infty∞ ∞\infty∞ ∞\infty∞ ∞\infty∞ ∞\infty∞ $ 6 3 ∞\infty∞ 11 ∞\infty∞ ∞\infty∞ ∞\infty∞ $ 5 ∞\infty∞ 11 ∞\infty∞ ∞\infty∞ ∞\infty∞ $ 6 11 ∞\infty∞ ∞\infty∞ ∞\infty∞ $ 10 9 12 ∞\infty∞ $ 10 9 12 ∞\infty∞ $ 12 ∞\infty∞ $ 15 加粗的数字即为从起点到各节点的最短路径长度。
Dijkstra(迪杰斯特拉)算法的局限
DijkstraDijkstraDijkstra(迪杰斯特拉)算法可以用于解决无向带权图和有向带权图的最短路径问题。但是要求权重全是正数,不能使负数。为了解决带负权重的最短路径问题,我们可以采用 Bellman−FordBellman-FordBellman−Ford(贝尔曼-福特)算法来解决。
五、Bellman-Ford算法
贝尔曼-福特算法实际上处理的是具有负权重的有向图(且该有向图不能含有负权回路,因此函数负权回路的图可以在权重的回路中不断循环,路径长无穷小)
贝尔曼-福特算法简介
更新规则:如果(A与B的距离 + A列表中的距离)< (B列表中的距离),那么我们就将B列表中的距离更新为较小的距离,并将B的父亲节点更新为A。在 Matlab 中使用贝尔曼-福特算法
在 MatlabMatlabMatlab 中调用命令:[P, d] = shortestpath(G, start, end [, 'Method', algorithm])
输入参数:{G:输入图对象start:起始的节点end:目标的节点[,′Method′,algorithm]:可选参数,表示计算路径所使用的算法。默认为‘auto’输入参数:\left\{ \begin{aligned} &G:\text{输入图对象} \\ &start:\text{起始的节点} \\ &end:\text{目标的节点} \\&[, 'Method', algorithm]:\text{可选参数,表示计算路径所使用的算法。默认为‘auto’} \end{aligned}\right.输入参数:⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧G:输入图对象start:起始的节点end:目标的节点[,′Method′,algorithm]:可选参数,表示计算路径所使用的算法。默认为‘auto’输出参数:{P:最短路径经过的节点d:最短距离输出参数:\left\{ \begin{aligned} &P:\text{最短路径经过的节点} \\ &d:\text{最短距离} \end{aligned} \right.输出参数:{P:最短路径经过的节点d:最短距离
可选的算法:{auto:自动选择算法unweighted:广度优先计算,将所有便权重视为1positive:Dijkstra算法mixed:Bellman-Ford算法可选的算法:\left\{ \begin{aligned} &auto:\text{自动选择算法} \\ &unweighted:\text{广度优先计算,将所有便权重视为1} \\ &positive:\text{Dijkstra算法} \\ &mixed:\text{Bellman-Ford算法} \end{aligned}\right.可选的算法:⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧auto:自动选择算法unweighted:广度优先计算,将所有便权重视为1positive:Dijkstra算法mixed:Bellman-Ford算法
六、总结
- 根据图的类型确定算法:
- 无向带权图、有向带正权图——Dijkstra算法
- 有向带负权图(不含负权回路)——Bellman-Ford算法
- 根据具体的算法过程计算或者使用Matlab等工具计算。
如果有什么错误,请一定提出哦~~~
数学建模学习笔记(七)——图论最短路问题相关推荐
- 【数学建模学习笔记【集训十天】之第六天】
数模学习目录 Matplotlib 学习 Matplotlib简介 Matplotlib 散点图 运行效果如下: Matplotlib Pyplot 运行效果如下: 关于plot() 运行效果如下: ...
- 数学建模学习笔记(2.3)lingo软件求解线性规划问题
数学建模学习笔记(2.3)lingo软件求解线性规划问题 lingo软件的优势在于体积小,专注于解决优化问题 且编程语言通俗易懂,没有门槛 对于刚刚接触数学建模同学比较友善 当然对于已经参与建模很久的 ...
- 数学建模学习笔记(1)数学模型的特点和分类
数学建模学习笔记(1)数学模型的特点和分类 ps:学习的教材为姜启源著的<数学模型(第四版)> 领取数模资料和更多内容请关注公众号:拾壹纪元 传送门: 线性规划(LP)问题 https:/ ...
- 数学建模学习笔记之评价问题聚类分析法
数学建模学习笔记之评价问题聚类分析法 物以类聚.人以群分. 聚类分析是一个很大的概念,显然根据分类的依据不同会出现很多很多聚类的方法.例如K-Means .Sequential Leader.Mode ...
- 数学建模学习笔记(一):插值法
文章目录 前言 一.一维插值问题的描述 二.常用插值方法 1.Lagrange插值法 2.Newton插值法 三.高次插值的Runge现象 四.Matlab插值 1.一维插值 2.二维插值 3.散乱点 ...
- 数学建模学习笔记(十一)——预测模型
文章目录 一.综述 二.灰色预测简介 三.GM(1, 1)模型 四.使用灰色系统建模的前提 -- 准指数规律检验 五.对于GM(1, 1)的检验 六.GM(1, 1)模型的拓展 七.什么时候使用灰色预 ...
- 数学建模学习笔记-概况
目录 1概况. 数学建模: 数学建模的模块: 一般步骤: 全过程: 论文的基本流程 模块学习: 1.题目备战:掌握固定模式 2.摘要备战:总结归纳能力,通过看高水平论文掌握. 3.问题重述:切忌直接抄 ...
- 高数叔数学建模学习笔记(1)
此处将我在学习高数叔数学建模课程中遇到的代码记录下来,便于查看.学习. 5.matlab中的文件 wendu.m clear; f=input('temperature:'); c=5*(f-32)/ ...
- 清风数学建模学习笔记——系统(层次)聚类原理详解及案例分析
系统聚类 系统聚类的合并算法通过计算两类数据点间的距离,对最为接近的两类数据点进行组合,并反复迭代这一过程,直到将所有数据点合成一类,并生成聚类谱系图.此外,系统聚类可以解决簇数 K 的取值问题, ...
最新文章
- python程序如何执行死刑图片_如何判断对象已死
- asp.net c#截取指定字符串函数
- 【jQuery插件】用jQuery Masonry快速构建一个pinterest网站布局(转)
- 【CV】54篇最新CV领域综述论文速递!涵盖14个方向:目标检测/图像分割/医学影像/人脸识别等方向...
- 2021第一场 | 阿里云高校计划训练营全面升级!0成本体验云计算入门到进阶
- apache目录的访问控制
- Project查看资源分配情况
- 雷电交加,雨水倾泻--北京
- mysql 日志抓取变化_MySQL慢查询日志分析提取【转】
- ssh 免密登录 ssh互信 ssh登录到linux服务器不需要输入密码
- 遗传算法python实现
- Storm入门之第6章一个实际的例子
- 面试总结:测试常见面试题汇总
- 如何批量发送邮件?小白问百度,大神秀操作,网友惊呼:666
- 最小生成树(Prim算法和Kruskal算法)
- Strtok的使用方法
- 蓝凌LKS-kOA怎么样?
- 进入旅游营销时代,携程有什么“大招”?
- Arduino 寄存器(ADC)
- 阿里云服务器和虚拟主机之间的区别
热门文章
- win7系统临时文件夹的打开方法
- 在浏览器中输入网址总是打开同一个网站怎么回
- mybatis jdbcType 对应javaType
- SpringBoot与日志配置
- 23种经典设计模式都有哪些,如何分类?Java设计模式相关面试
- @requestbody和@requestparam作用
- 编写一个程序实现方法的覆盖java_编写Java程序代码必须先声明一个____,然后在其中编写实现需求的业务代码。...
- 服务器虚拟机密度,服务器整合:虚拟机密度大未必是好事
- Java并发编程实战————可重入内置锁
- 多线程中 start()和run()方法的区别