文章目录

  • 一、综述
  • 二、图论最短路问题
  • 三、几个简单的作图方法
  • 四、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. 解决步骤
    第一步:初始化表格

    节点 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 那一列的距离得出),结果如图:

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

    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

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

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

五、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等工具计算。

如果有什么错误,请一定提出哦~~~

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

  1. 【数学建模学习笔记【集训十天】之第六天】

    数模学习目录 Matplotlib 学习 Matplotlib简介 Matplotlib 散点图 运行效果如下: Matplotlib Pyplot 运行效果如下: 关于plot() 运行效果如下: ...

  2. 数学建模学习笔记(2.3)lingo软件求解线性规划问题

    数学建模学习笔记(2.3)lingo软件求解线性规划问题 lingo软件的优势在于体积小,专注于解决优化问题 且编程语言通俗易懂,没有门槛 对于刚刚接触数学建模同学比较友善 当然对于已经参与建模很久的 ...

  3. 数学建模学习笔记(1)数学模型的特点和分类

    数学建模学习笔记(1)数学模型的特点和分类 ps:学习的教材为姜启源著的<数学模型(第四版)> 领取数模资料和更多内容请关注公众号:拾壹纪元 传送门: 线性规划(LP)问题 https:/ ...

  4. 数学建模学习笔记之评价问题聚类分析法

    数学建模学习笔记之评价问题聚类分析法 物以类聚.人以群分. 聚类分析是一个很大的概念,显然根据分类的依据不同会出现很多很多聚类的方法.例如K-Means .Sequential Leader.Mode ...

  5. 数学建模学习笔记(一):插值法

    文章目录 前言 一.一维插值问题的描述 二.常用插值方法 1.Lagrange插值法 2.Newton插值法 三.高次插值的Runge现象 四.Matlab插值 1.一维插值 2.二维插值 3.散乱点 ...

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

    文章目录 一.综述 二.灰色预测简介 三.GM(1, 1)模型 四.使用灰色系统建模的前提 -- 准指数规律检验 五.对于GM(1, 1)的检验 六.GM(1, 1)模型的拓展 七.什么时候使用灰色预 ...

  7. 数学建模学习笔记-概况

    目录 1概况. 数学建模: 数学建模的模块: 一般步骤: 全过程: 论文的基本流程 模块学习: 1.题目备战:掌握固定模式 2.摘要备战:总结归纳能力,通过看高水平论文掌握. 3.问题重述:切忌直接抄 ...

  8. 高数叔数学建模学习笔记(1)

    此处将我在学习高数叔数学建模课程中遇到的代码记录下来,便于查看.学习. 5.matlab中的文件 wendu.m clear; f=input('temperature:'); c=5*(f-32)/ ...

  9. 清风数学建模学习笔记——系统(层次)聚类原理详解及案例分析

    系统聚类   系统聚类的合并算法通过计算两类数据点间的距离,对最为接近的两类数据点进行组合,并反复迭代这一过程,直到将所有数据点合成一类,并生成聚类谱系图.此外,系统聚类可以解决簇数 K 的取值问题, ...

最新文章

  1. python程序如何执行死刑图片_如何判断对象已死
  2. asp.net c#截取指定字符串函数
  3. 【jQuery插件】用jQuery Masonry快速构建一个pinterest网站布局(转)
  4. 【CV】54篇最新CV领域综述论文速递!涵盖14个方向:目标检测/图像分割/医学影像/人脸识别等方向...
  5. 2021第一场 | 阿里云高校计划训练营全面升级!0成本体验云计算入门到进阶
  6. apache目录的访问控制
  7. Project查看资源分配情况
  8. 雷电交加,雨水倾泻--北京
  9. mysql 日志抓取变化_MySQL慢查询日志分析提取【转】
  10. ssh 免密登录 ssh互信 ssh登录到linux服务器不需要输入密码
  11. 遗传算法python实现
  12. Storm入门之第6章一个实际的例子
  13. 面试总结:测试常见面试题汇总
  14. 如何批量发送邮件?小白问百度,大神秀操作,网友惊呼:666
  15. 最小生成树(Prim算法和Kruskal算法)
  16. Strtok的使用方法
  17. 蓝凌LKS-kOA怎么样?
  18. 进入旅游营销时代,携程有什么“大招”?
  19. Arduino 寄存器(ADC)
  20. 阿里云服务器和虚拟主机之间的区别

热门文章

  1. win7系统临时文件夹的打开方法
  2. 在浏览器中输入网址总是打开同一个网站怎么回
  3. mybatis jdbcType 对应javaType
  4. SpringBoot与日志配置
  5. 23种经典设计模式都有哪些,如何分类?Java设计模式相关面试
  6. @requestbody和@requestparam作用
  7. 编写一个程序实现方法的覆盖java_编写Java程序代码必须先声明一个____,然后在其中编写实现需求的业务代码。...
  8. 服务器虚拟机密度,服务器整合:虚拟机密度大未必是好事
  9. Java并发编程实战————可重入内置锁
  10. 多线程中 start()和run()方法的区别