数学建模学习笔记(七)——图论最短路问题

文章目录

    • 一、综述
    • 二、图论最短路问题
    • 三、几个简单的作图方法
    • 四、Dijkstra(迪杰斯特拉)算法
    • 五、Bellman-Ford算法
    • 六、总结

一、综述

本文主要根据图论的基本概念,介绍图论中常见的建模问题——最短路问题。同时,介绍了解决图论最短路问题的两种算法:Dijkstra(迪杰斯特拉)算法和Bellman-Ford(贝尔曼-福特)算法。

在此之前,需要具备基本的图论知识哦~~~

二、图论最短路问题

图论最短路问题指的是在带权重的图中,求出一条从一点节点到另一个节点的路径,使这条路径上的权重之和最小

三、几个简单的作图方法

1.CS Academy:
https://csacademy.com/app/graph_editor/
2. Matlab:
无向图:graph()函数
有向图:digraph()函数

四、Dijkstra(迪杰斯特拉)算法

  1. DijkstraDijkstraDijkstra(迪杰斯特拉)算法描述
    假设未选取的节点集合未V,已选取的节点集合为S。
    -除起点外,其他节点初始距离为 ∞\infty,起点距离为0。
    -更新节点之间的距离(相邻接的节点距离即为权值,不相邻接的节点距离仍为 ∞\infty)。
    -选取另一个未被选取过且距离最小的节点作为中转点,更新距离。(原距离 + 该节点和目标节点的权值 < 目标节点的原距离,则更新目标节点的距离为前者;否则不更新)。
    -重复第三步,直到到达目标节点。
    在这里插入图片描述

  2. 下面来看一个例子:
    有一个旅行者想要从 v1v1v1 节点到 v8v8v8 ,求出最短旅行路线。
    在这里插入图片描述

  3. 解决步骤
    第一步:初始化表格

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)000000000
    距离inf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinf
    父亲节点-1-1-1-1-1-1-1-1-1

    第二步:从 v1 节点开始

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)100000000
    距离0inf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinf
    父亲节点v1-1-1-1-1-1-1-1-1

    第三步:更新从 v1 可到达的节点的距离

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)100000000
    距离0631inf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinf
    父亲节点v1v1v1v1-1-1-1-1-1

    第四步:取距离最小的节点 v4 作为中转点,更新从 v4 可到达的节点标号(注意比较与原距离的大小)

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)100100000
    距离0631inf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinfinf⁡\infinf
    父亲节点v1v1v1v1-1-1-1-1-1

    第五步:更新后的结果

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)100100000
    距离0631inf⁡\infinf11inf⁡\infinfinf⁡\infinfinf⁡\infinf
    父亲节点v1v1v1v1-1v4-1-1-1

    第六步:再取距离最小的节点 v3 作为中转点,更新从 v3 可到达的节点标号(注意比较与原距离的大小)

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)101100000
    距离0631inf⁡\infinf11inf⁡\infinfinf⁡\infinfinf⁡\infinf
    父亲节点v1v1v1v1-1v4-1-1-1

    第七步:更新后的结果(由于3 + 2(v3 到 v2 的距离)= 5 < 6,因此更新 v2 列的距离)

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)101100000
    距离0531inf⁡\infinf11inf⁡\infinfinf⁡\infinfinf⁡\infinf
    父亲节点v1v3v1v1-1v4-1-1-1

    第八步:再取距离最小的节点 v2 作为中转点,更新从 v2 可到达的节点标号(注意比较与原距离的大小)

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)111100000
    距离0531611inf⁡\infinfinf⁡\infinfinf⁡\infinf
    父亲节点v1v3v1v1v2v4-1-1-1

    第九步:再取距离最小的节点 v5 作为中转点,更新从 v5 可到达的节点标号(注意比较与原距离的大小)

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)111110000
    距离0531611inf⁡\infinfinf⁡\infinfinf⁡\infinf
    父亲节点v1v3v1v1v2v4-1-1-1

    第十步:更新后的结果

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)111110000
    距离0531610912inf⁡\infinf
    父亲节点v1v3v1v1v2v5v5v5-1

    第十一步:再取距离最小的节点 v7 作为中转点,更新从 v7 可到达的节点标号(注意比较与原距离的大小)

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)111110100
    距离0531610912inf⁡\infinf
    父亲节点v1v3v1v1v2v5v5v5-1

    第十二步:再取距离最小的节点 v6 作为中转点,更新从 v6 可到达的节点标号(注意比较与原距离的大小)

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)111111100
    距离0531610912inf⁡\infinf
    父亲节点v1v3v1v1v2v5v5v5-1

    第十三步:再取距离最小的节点 v8 作为中转点,更新从 v8 可到达的节点标号(注意比较与原距离的大小)

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)111111110
    距离053161091215
    父亲节点v1v3v1v1v2v5v5v5v8

    第十四步:最终结果

    节点v1v2v3v4v5v6v7v8v9
    是否已被访问(0/1)111111111
    距离053161091215
    父亲节点v1v3v1v1v2v5v5v5v8

    可以从终点v8倒推:v8⇐v5⇐v2⇐v3⇐v1v_8 \Leftarrow v_5 \Leftarrow v_2 \Leftarrow v_3 \Leftarrow v_1v8v5v2v3v1,这就是最短路径。将路径上的权值相加可以得出,最短路径的长度为:12(可以直接有 v8 那一列的距离得出),结果如图:
    在这里插入图片描述

  4. 若只考虑路径长度,而不考虑具体路径,还可以这样列表:

    v1v2v3v4v5v6v7v8v9
    0∞\infty∞\infty∞\infty∞\infty∞\infty∞\infty∞\infty∞\infty
    $631∞\infty∞\infty∞\infty∞\infty∞\infty
    $63∞\infty11∞\infty∞\infty∞\infty
    $5∞\infty11∞\infty∞\infty∞\infty
    $611∞\infty∞\infty∞\infty
    $10912∞\infty
    $10912∞\infty
    $12∞\infty
    $15

    加粗的数字即为从起点到各节点的最短路径长度。

  5. Dijkstra(迪杰斯特拉)算法的局限
    DijkstraDijkstraDijkstra(迪杰斯特拉)算法可以用于解决无向带权图和有向带权图的最短路径问题。但是要求权重全是正数,不能使负数。为了解决带负权重的最短路径问题,我们可以采用 Bellman−FordBellman-FordBellmanFord(贝尔曼-福特)算法来解决。

五、Bellman-Ford算法

贝尔曼-福特算法实际上处理的是具有负权重的有向图(且该有向图不能含有负权回路,因此函数负权回路的图可以在权重的回路中不断循环,路径长无穷小)

  1. 贝尔曼-福特算法简介
    更新规则:如果(A与B的距离 + A列表中的距离)< (B列表中的距离),那么我们就将B列表中的距离更新为较小的距离,并将B的父亲节点更新为A。

  2. 在 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算法

六、总结

  1. 根据图的类型确定算法:
    1. 无向带权图、有向带正权图——Dijkstra算法
    2. 有向带负权图(不含负权回路)——Bellman-Ford算法
  2. 根据具体的算法过程计算或者使用Matlab等工具计算。

如果有什么错误,请一定提出哦~~~请添加图片描述

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

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

相关文章

pycharm和pythonIDE安装详解

目录 一、pycharm下载安装 二、python下载安装 ​三、pycharm上配置python 我们可能显示的库不大一样&#xff0c;因为我这大都事先安装过了&#xff0c;就没有删​打印成功&#xff1a;标志配置完成​四、配置镜像源让你下载嗖嗖的快 4.1&#xff09;pycharm内部配置 4.2…

数学建模学习笔记(八)——分类模型

文章目录一、分类模型综述二、逻辑回归三、两点分布&#xff08;伯努利分布&#xff09;四、连接函数的取法五、Logistic回归模型六、在SPSS中进行二元Logistic回归七、预测结果较差的解决八、Fisher线性判别分析九、多分类问题十、总结一、分类模型综述 通过样本数据中的分类…

python基础入门(1)

目录 一、python入门 二、python缩进 三、Python注释 1&#xff09;单行注释 2&#xff09;多行注释 四、Python 变量 1&#xff09;变量定义理解 2&#xff09; 变量名命名 3&#xff09; 分配多个值 4&#xff09;输出变量 5&#xff09;全局变量与局部变量&#…

数学建模学习笔记(九)——聚类模型

文章目录一、聚类综述二、主要用到的聚类算法三、K-means聚类算法四、K-means算法五、对于K-means算法和K-means算法的讨论六、系统&#xff08;层次&#xff09;聚类算法七、DBSCAN算法八、总结一、聚类综述 聚类的主要目的就是将样本划分为由类似的对象组成的多个类的过程。…

python基础入门(2)

目录 一、Python数据类型 1&#xff09;置数据类型 2&#xff09;获取数据类型 3&#xff09;设置数据类型 4&#xff09;设置特定数据类型 6&#xff09;练习题 二、python数字- 1&#xff09;整数 2&#xff09;浮点数 3&#xff09;虚数 4&#xff09;类型转换 …

C语言scanf:获取输入的内容

获取外部输入数据内容 在C语言中&#xff0c;有多个函数可以从键盘获得用户输入&#xff1a; scanf()&#xff1a;和 printf() 类似&#xff0c;scanf() 可以输入多种类型的数据。getchar()、getche()、getch()&#xff1a;这三个函数都用于输入单个字符。gets()&#xff1a;获…

数学建模学习笔记(十)——时间序列模型

文章目录一、时间序列综述二、时间序列数据以及基本概念三、时间序列分解四、指数平滑模型五、一元时间序列分析的模型六、AR&#xff08;p&#xff09;模型七、MA&#xff08;q&#xff09;模型八、ARMA&#xff08;p, q&#xff09;模型九、模型选择&#xff1a;AIC 和 BIC 准…

python基础入门(3)之字符串

目录 一、Python字符串 1.字符串基本使用 1&#xff09;字符串理解 2&#xff09;将字符串分配给变量 3&#xff09;多行字符串 4&#xff09;字符串是数组 5)遍历字符串 6)字符串长度 7)检查字符串 8)检查如果不是 2.切片字符串 1)切片 2)从头开始切片 3)切到最…

数学建模学习笔记(十一)——预测模型

文章目录一、综述二、灰色预测简介三、GM&#xff08;1, 1&#xff09;模型四、使用灰色系统建模的前提 —— 准指数规律检验五、对于GM(1, 1)的检验六、GM&#xff08;1, 1&#xff09;模型的拓展七、什么时候使用灰色预测八、神经网络模型一、综述 本文首先介绍了灰色预测模…

python基础入门(4)之布尔值

目录 一、Python布尔值 1)比较 2)评估值和变量 3)布尔真值 4)布尔假值 5)函数可以返回布尔值 6)练习题 一、Python布尔值 布尔值表示两个值之一&#xff1a; True或False。在编程中&#xff0c;您经常需要知道表达式是否为 True或False。举一些例子就明白了。 1)比较 当…

C语言if else语句详解

前面我们看到的代码都是顺序执行的&#xff0c;也就是先执行第一条语句&#xff0c;然后是第二条、第三条……一直到最后一条语句&#xff0c;这称为顺序结构。 但是对于很多情况&#xff0c;顺序结构的代码是远远不够的&#xff0c;这时我们就要使用判断语句即if else语句。 …

数学建模学习笔记(十二)——奇异值分解

文章目录一、综述二、奇异值分解三、使用SVD进行降维四、SVD的评价及应用一、综述 奇异值分解是线性代数中一种重要的矩阵分解方法&#xff0c;它在图形的压缩等方面具有重要的意义及作用。 二、奇异值分解 三个引理&#xff1a; AB 和 BA 非零的特征值完全相同&#xff1b;…

python基础入门(5)之运算符

目录 一、python运算符 1)算术运算符 2)赋值运算符 一、python运算符 1)算术运算符 自己赋值粘贴运行下就懂了&#xff01; 加减法&#xff1a;&#xff08; -&#xff09; a2 b3 ca-b da-b print(c,d)乘除法&#xff1a;&#xff08;* /&#xff09; a(50-5*6)/4 print(…

Python实例 61,62

61.题目&#xff1a;打印出杨辉三角形 程序设计&#xff1a; 第一步&#xff1a;先找规律&#xff0c;抽象化问题&#xff1a; 首先我们观察到&#xff0c;第一行为[1]&#xff0c;我们直接赋给一个变量&#xff1a;初始化数列 p [1] 其次我们观察到&#xff0c;下面的每一…

C语言逻辑运算符详解

情景模式&#xff1a;现在研发出了一款新的软件&#xff0c;要求使用者必须成年&#xff0c;并且成绩大于等于60&#xff0c;该怎么办呢&#xff1f; 或许你会想到使用嵌套的 if 语句&#xff0c;类似下面这样的代码&#xff1a; #include <stdio.h> int main() {int a…

Python实例 63,64

目录 63.题目&#xff1a;画椭圆 1.tkinter画椭圆 2.turtle画椭圆 64.题目&#xff1a;利用ellipse 和 rectangle 画图 63.题目&#xff1a;画椭圆 1.tkinter画椭圆 #63 from tkinter import * x 360 y 160 top y - 30 bottom y - 30canvas Canvas(width 500,height …

HTML学习笔记(一)

HTML5语法 文档类型 DOCTYPE声明文档类型 &#xff0c;必须位于第一行。 DOCTYPE不区分大小写以及单双引号。 DOCTYPE会触发浏览器以标准模式显示页面。 <!DOCTYPE HTML>字符编码 HTML5中简化了字符编码的写法&#xff0c;直接用 meta 即可 <meta charset "UTF-…

C++ PAT 乙级 1007——素数对猜想

题目详情 让我们定义 dnd_ndn​ 为 dnpn1−pnd_n p_{n 1} - p_ndn​pn1​−pn​&#xff0c;其中 pip_ipi​ 是第 i 个素数。显然有 d11d_1 1d1​1&#xff0c;且对于 n > 1有 dnd_ndn​ 是偶数。 “素数对猜想”认为“存在无穷多对相邻且差为2的素数”&#xff0c;现给…

python实例 65,66

65.题目&#xff1a;一个最优美的图案 #65 import math class PTS:def __init__(self):self.x 0self.y 0 points []def LineToDemo():import tkinter screenx 400screeny 400canvas Canvas(width screenx,height screeny,bg white)AspectRatio 0.85MAXPTS 15h scr…

C语言for循环详解

for 循环的使用更加灵活&#xff0c;在日常的程序开发过程中我们会使用的更多一些。 使用 while 循环来计算1加到100的值&#xff0c;代码如下&#xff1a; #include <stdio.h> int main(){int i, sum0;i 1; //语句①while(i<100 /*语句②*/ ){sumi;i; //语句③}…