【管理运筹学】第 7 章 | 图与网络分析(3,最短路问题)

news2024/11/15 22:36:02

文章目录

  • 引言
  • 三、最短路问题
    • 3.1 最短路问题定义
    • 3.2 Dijkstra 算法
      • 3.2.1 算法基本依据
      • 3.2.2 算法基本思想与步骤
    • 3.3 逐次逼近算法(Bellman-Ford 算法)
    • 3.4 Floyd 算法
  • 写在最后


引言

承接前文,我们来学习图论中另一个经典问题 —— 最短路问题。


三、最短路问题

3.1 最短路问题定义

给定一个赋权有向图 G = ( V , A , W ) G=(V,A,W) G=(V,A,W) ,对每一个弧 a i j = ( v i , v j ) a_{ij}=(v_i,v_j) aij=(vi,vj) ,相应地有权 w ( a i j ) = w i j w(a_{ij})=w_{ij} w(aij)=wij ,又给定 G G G 中两个顶点 v s , v t v_s,v_t vs,vt 。设 P P P G G G v s → v t v_s \to v_t vsvt 的一条路,定义路 P P P 的权是路中所有弧权重之和,记为 W ( P ) W(P) W(P) 。最短路问题就是要在所有 v s → v t v_s \to v_t vsvt 的路中,求取一条权最小的路 P ∗ P^* P ,称其为 v s → v t v_s \to v_t vsvt 的最短路,记为 P ( v s , v t ) P(v_s,v_t) P(vs,vt) 。路 P ∗ P^* P 的权称为 v s → v t v_s \to v_t vsvt 的距离,记为 d ( v s , v t ) d(v_s,v_t) d(vs,vt)

显然, d ( v s , v t ) d(v_s,v_t) d(vs,vt) 不一定等于 d ( v t , v s ) d(v_t,v_s) d(vt,vs) 。我们主要研究有向网络,对于无向网络,每条边可视为双向弧。

3.2 Dijkstra 算法

Dijkstra 算法是 1959 年提出的用于解决非负权网络中寻找一个指定顶点到其他顶点的最短路的最好算法之一。

3.2.1 算法基本依据

Dijkstra 算法的基本思想基于以下三个出发点。

第一,最短路的子路还是最短路。

定理 1 —— 对于弧的权大于 0 的有向网络 G = ( V , A , W ) G=(V,A,W) G=(V,A,W) ,若 P P P G G G 中的一条最短路,则 P P P 的子路也是最短路。

第二,设非负权网络 G = ( V , A , W ) G=(V,A,W) G=(V,A,W) 中, v s v_s vs 到所有其他顶点的最短路长度按大小排列为 d 0 ≤ d 1 ≤ ⋯ ≤ d n d_0 \leq d_1 \leq \dots \leq d_n d0d1dn 。假设 d 1 , d 2 , … , d k d_1,d_2,\dots,d_k d1,d2,,dk 为已求得对应的最短路径分别为 P 1 = P ( v s , v 1 ) , P 2 = ( v s , v 2 ) , … , P k = ( v s , v k ) P_1=P(v_s,v_1),P_2=(v_s,v_2),\dots,P_k=(v_s,v_k) P1=P(vs,v1),P2=(vs,v2),,Pk=(vs,vk) ,并记 S k = { v s , v 1 , … , v k } S_k=\{v_s,v_1,\dots,v_k\} Sk={vs,v1,,vk} ,则 P k P_k Pk 中弧的数目不大于 k k k

第三,最短路的迭代计算公式。

讲实话,硬看公式很头疼,最好结合算例来看,我也就不展示了,后面算法步骤中也会体现。

3.2.2 算法基本思想与步骤

Dijkstra 算法采用标号法,每个顶点有两个标号,一个用于标记路长,用 d ( v i ) d(v_i) d(vi) 表示;另一个用于标记从起点到终点路径的最后一条弧的起始点号(其实就是最短路中终点前一个点)。

网络顶点的标号分两类,一类是永久标号,一类是临时标号。当迭代到第 k k k 步时,获得永久标号的点意味着已经找到 v s v_s vs 到该点的最短路的路长和路径。

将获得永久标号的点放在 S k S_k Sk 集合中,获得永久标号的 d d d 值和 λ \lambda λ 值不再修改。获得临时标号的点(集合 T T T)意味着还没找到最短路。

算法的步骤如下:

第一步: 初始化,令 k = 0 , S 0 = { v s } , T 0 = { v 1 , v 2 , … , v n } , d 0 ( v s ) = 0 , d 0 ( v i ) = ∞ k=0,S^0=\{v_s\},T^0=\{v_1,v_2,\dots,v_n\},d^0(v_s)=0,d^0(v_i)=\infty k=0,S0={vs},T0={v1,v2,,vn},d0(vs)=0,d0(vi)= ,为临时标号值。 λ ( v i ) = v s \lambda(v_i)=v_s λ(vi)=vs ,表示最短路中点 v i v_i vi 的前一个点。 r e s e n t = v s resent=v_s resent=vs ,表示最新获得永久标号的点。

第二步: k = k + 1 k=k+1 k=k+1 ,对于所有临时标号 v l ∈ T k − 1 v_l \in T^{k-1} vlTk1 ,计算: d k ( v l ) = m i n { d k − 1 ( v l ) , d ∗ ( r e s e n t ) + w ( r e s e n t , v l ) } d^k(v_l)=min\{d^{k-1}(v_l),d^*(resent)+w(resent,v_l)\} dk(vl)=min{dk1(vl),d(resent)+w(resent,vl)} 如果 d k ( v l ) < d k − 1 ( v l ) d^k(v_l)<d^{k-1}(v_l) dk(vl)<dk1(vl) ,则 λ k ( v l ) = r e s e n t \lambda^k(v_l)=resent λk(vl)=resent ,否则, λ k ( v l ) = λ k − 1 ( v l ) \lambda^k(v_l)=\lambda^{k-1}(v_l) λk(vl)=λk1(vl)

第三步: v m v_m vm 满足是所有 T T T 标号中最小的,则 r e s e n t = v m , S k = S k − 1 ⋃ { v m } , T k = T k − 1 − { v m } resent=v_m,S^{k}=S^{k-1} \bigcup\{v_m\},T^k=T^{k-1}-\{v_m\} resent=vm,Sk=Sk1{vm},Tk=Tk1{vm} 。若 k = n k=n k=n ,算法结束;否则,转第二步。

Dijkstra 算法结束后, d ∗ d^* d 值即为某点到起点的最短距离,通过每次迭代的 λ ∗ \lambda^* λ 值进行回溯,可得到所有其他点到起点的最短路径。

在这里插入图片描述

3.3 逐次逼近算法(Bellman-Ford 算法)

北交大的书上第二个方法写的是 PDM 算法,以前从来没听过,还好看了一下去年大纲,没提到这个,我就不去看了。大纲里还说了一个叫 Ford 算法,网上查了查应该是 Bellman-Ford 算法,但是书上往后面却找不到 Ford 相关字眼,只有一个逐次逼近算法倒还有可能。

于是网上又一顿搜索逐次逼近算法,刚开始也是一点字眼都看不到,后来耐心性子先看了下这个算法的内容,在知乎的一篇文章中看到 Bellman-Ford 算法是基于逐次逼近的思想。两者比对一下,应该北交大书上的逐次逼近算法就是 Bellman-Ford 算法无疑了。

Dijkstra 算法的一个缺点就是,不适用于有负权重的网络,而逐次逼近算法便可以解决这个问题,它适用于有负权但不含负回路的有向赋权图。

逐次逼近算法的基本步骤与思路如下。

第一步:(赋初值) k = 1 k=1 k=1 k k k 为迭代步骤)。 d 1 j 1 = { 0 , v 1 = v j w 1 j , ( v 1 , v j ) ∈ A ∞ , ( v 1 , v j ) ∉ A d^1_{1j}=\begin{cases} 0, & v_1=v_j \\ w_{1j},& (v_1,v_j) \in A\\ \infty,&(v_1,v_j) \notin A \end{cases} d1j1= 0,w1j,,v1=vj(v1,vj)A(v1,vj)/A 对于赋权有向网络 G = ( V , A , W ) G=(V,A,W) G=(V,A,W) v 1 v_1 v1 是指定的起点, d 1 j 1 d^1_{1j} d1j1 的含义是从 v 1 v_1 v1 点到 v j v_j vj 点最多含有一个弧的最短路的路长。

λ 1 j 1 \lambda_{1j}^1 λ1j1 为从 v 1 v_1 v1 点到 v j v_j vj 点最多含有一个弧的最短路的终点 v j v_j vj 的前一个点号。

第二步:递推,第三步:判断。

不是我省懒,实在是要通过具体算例才能看明白,我就不细说了。
而且这个方法有点像是遍历法了,我有点回忆起来当初上系统分析时也讲过这个,不过不是叫这个名。

3.4 Floyd 算法

当我们的需求是任意两点之间的最短路,而不是一点到其他所有点的最短路时,只能考虑重复使用 Dijkstra 算法,依次改变起点。如果此时网络中有负权,可以重复使用逐次逼近法来实现。显然,这样是比较繁琐的,而 Floyd 算法便是可以直接求出任意两点之间的最短路的一种算法,它也适用于含有负权的网络。

具体算法步骤是真不好用文字表达,至少我现在表达不出来,下次找机会出点视频更方便些。


写在最后

算法学习果然是艰辛和耗时的,难怪计算机的出现让图论发展迅速。不过也只有正确掌握算法的基本思想才能正确地用计算机进行辅助计算。

书上的数学描述对于我来说是很抽象的,基本上只能靠算例来加深理解,所以我目前给不了大家一些很通俗的解释,只能到这个水平了。

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

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

相关文章

解决:使用MySQL Command Line Client时光标不显示的问题

项目场景&#xff1a; 在使用MySQL Command Line Client时&#xff0c;有时候光标会不显示出来&#xff0c;就像下面的图片显示一样。 问题描述&#xff1a; 光标会不显示出来。 解决方案&#xff1a;​​​​​​​ 1.首先将输入法切换到中文输入法&#xff0c;然后随便打出一…

(2023,Diffusion 稳健性 攻击)稳定扩散模型是不稳定的

Stable Diffusion is Unstable 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 进交流群获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 2.1 扩散模型 2.2 文本到图像模型的缺陷 3. 基础 4. 稳定扩散模型的缺陷 4.1 生成速度的变化 4.…

介绍PHP

PHP是一种流行的服务器端编程语言&#xff0c;用于开发Web应用程序。它是一种开源的编程语言&#xff0c;具有易学易用的语法和强大的功能。PHP支持在服务器上运行的动态网页和Web应用程序的快速开发。 PHP可以与HTML标记语言结合使用&#xff0c;从而能够生成动态的Web页面&a…

Java实践-物联网loT入门-MQTT传输协议

前言 MQTT是一个极其轻量级的发布/订阅消息传输协议,适用于网络带宽较低的场合. 它通过一个代理服务器&#xff08;broker&#xff09;&#xff0c;任何一个客户端&#xff08;client&#xff09;都可以订阅或者发布某个主题的消息&#xff0c;然后订阅了该主题的客户端则会收…

红米note5 拆金属外壳

红米note5 拆金属外壳 卡扣式 外壳 屏幕 先拿下来&#xff0c;sim卡的那个卡座。 贴边&#xff0c;到这个卡扣的地方&#xff0c;用工具翘一下&#xff0c;然后下一个卡扣的地方翘一下&#xff0c;然后慢慢的整个的拿下来。 别硬翘&#xff0c;小刀的刀尖&#xff0c;容易给…

jeesite自定义数据字典,自定义字典表,自带树选择数据源(保姆级图文教程)

文章目录 前言一、框架自带树字典表如何使用二、自定义表作为字典表1. 下拉选项使用自建表作为字典表。实际效果框架示例实际开发代码总结前言 项目开发中字典表如果不满足实际需求,比如使用自己的表作为字典,系统自带字典表树如何使用等问题进行总结记录。 一、框架自带树字…

端口扫描-安全体系-网络安全技术和协议

端口扫描-安全体系-网络安全技术和协议 端口扫描信息安全的保证体系和评估方法网络安全技术网络攻击和威胁(重要)网络安全协议 端口扫描 全TCP连接:三次握手 半打开式扫描:前两次握手 FIN扫描:不用建立TCP连接 第三方扫描: 拒绝服务攻击有: 同步包风暴ICMP攻击SNMP攻击 都是修改…

卡牌类游戏推荐,卡牌类三国手游排行榜

以下是小编要推荐给大家的关于卡牌类三国手游排行榜的内容。这里有来自各个历史阶段的名将和美女&#xff0c;让你体验最真实的三国战役。你可以将各种战略思维运用到其中&#xff0c;感受步步为营的喜悦&#xff0c;最终赢得战火纷飞的三国&#xff0c;如果想了解每个游戏的具…

c高级day2 linux指令的补充和shell脚本

思维导图 写一个1.sh脚本&#xff0c;将以下内容放到脚本中&#xff1a; 在家目录下创建目录文件&#xff0c;dir 在dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把di…

维维数码:网络电视机顶盒怎么样?口碑电视机顶盒排行榜

欢迎各位来到维维数码频道&#xff0c;最近后台收到很多私信咨询我网络电视机顶盒怎么样&#xff0c;值不值得买&#xff1f;当家里是老电视想升级智能电视&#xff0c;或者智能电视使用几年后出现卡顿、资源少、无法下载软件等&#xff0c;只需要买一台网络电视机顶盒就可以解…

Tomcat环境变量配置教程

1、在官网下载并解压Tomcat&#xff0c;记住解压好的目录&#xff0c;后面配置环境需要用到。 官网地址&#xff1a;Apache Tomcat - Welcome! --- 阿帕奇雄猫 - 欢迎&#xff01; 2、右键此电脑&#xff08;我的电脑&#xff09;->属性->高级系统设置->环境变量 3、…

NoSQL之redis持久化(RDB、AOF)

目录 一、Redis高可用 二、Redis持久化 1、持久化的功能 2、Redis的两种持久化 三、RDB 持久化 1、触发条件 1.1 手动触发 1.2 自动触发 1.3 其它自动触发机制 2、执行流程 3、启动时加载RED文件(恢复) 四、Redis的AOF持久化 1、开启AOF 2、执行流程 2.1 命令追加…

SSD202D-boot-IO复用功能

SSD202D-logo分区添加dtb_旋风旋风的博客-CSDN博客 可以参考该博客,当然我为了兼容以前的固件又优化了该思路: 直接把对应的包添加在logo_202d的尾部,这样就不会影响原来的包 这两张就是修改之后的结构,只在尾部追加DTB 其中ABC结构体 //A结构体- (12 size) typedef struc…

elementPlus + table 树形懒加载 新增,删除,修改 局部刷新

#直接上代码# 1.表格数据 2.数据源 <m-table ref"cTable" v-if"Object.keys(props.tableData).length" :options"props.tableOptions" :data"props.tableData.data" :isLoading"props.tableData.loading" elementLo…

数据结构与算法(四):栈与队列

栈与队列 我们一般把栈与队列合在一块讨论&#xff0c;因为他们具有相似的性质。 栈&#xff1a;栈是限定仅在表尾进行插入和删除操作的线性表&#xff0c;所以栈又称为后进先出&#xff08;LastIn First Out&#xff09;的线性表&#xff0c;简称LIFO结构。 队列&#xff1…

【C++二叉树】进阶OJ题

【C二叉树】进阶OJ题 目录 【C二叉树】进阶OJ题1.二叉树的层序遍历II示例代码解题思路 2.二叉搜索树与双向链表示例代码解题思路 3.从前序与中序遍历序列构造二叉树示例代码解题思路 4.从中序与后序遍历序列构造二叉树示例代码解题思路 5.二叉树的前序遍历&#xff08;非递归迭…

C++学习笔记--函数重载(2)

文章目录 1.3、Function Templates Handling1.3.1、Template Argument Deduction1.3.2、Template Argument Substitution 1.4、Overload Resolution1.4.1、Candidate functions1.4.2、Viable functions1.4.3、Tiebreakers 1.5、走一遍完整的流程1.6、Name Mangling1.7、总结 1.…

SpringCloud-Hystrix 服务降级与熔断

接上文SpringCloud-Feign 问题描述 为了解决上述情况&#xff0c;SpringCloud提供了Hystrix熔断器组件&#xff0c;如同保险丝。服务降级则不会直接返回错误&#xff0c;而是提供一个补救措施&#xff0c;正常响应给请求者。 1.服务降级 基于借阅管理服务&#xff0c;不开启…

JavaScript-----个性名片案例展示

目录 前言&#xff1a; 效果展示 代码&#xff1a; html代码 CSS代码 图片资源&#xff1a; 前言&#xff1a; 今天我们就通过刚刚学习的JavaScript知识点以及前面学习了的html和CSS的知识点去做一个小作品&#xff0c;这是一个个性名片的案例&#xff08;有代码资源和图片…

【CSDN技术】Markdown编辑器如何使用-csdn博客编写入门

Markdown编辑器如何使用-csdn博客编写入门 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自…