运筹说 第81期 | 图与网络分析经典例题讲解

2024-01-16 07:28

本文主要是介绍运筹说 第81期 | 图与网络分析经典例题讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通过前几期的学习,我们已经学会了图与网络分析的相关概念和基本方法的原理,并且掌握了图与网络分析相关模型的建立和具体的求解方法,本期小编带大家学习图与网络分析在经济管理中的应用

在实际工作中,我们能发现图与网络分析在经济管理中有着许多应用,本期小编选择了其中一些典型例子,包括最小树问题最短路问题最大流问题最小费用最大流,进行详细讲解。

01最小树问题

接下来我们先从经典的最小树问题开始讲起。

在现实生活中,最小生成树最优二叉树有很高的实用价值。正确地理解掌握如何构造连通图的最小生成树问题以及最优二叉树问题,将会给我们带来巨大的经济效益社会效益。随着最小生成树理论与算法的发展与完善,其在现实生活中的应用越来越广泛。本次小编选取了两道例题,包括经济学应用中具有代表性的最小投资问题以及数据通信问题,来为大家进行详细讲解。

例1、最小生成树问题

问题描述

发展轨道交通是解决城市内和城际间人员流动量大与交通设施运载力不足之间矛盾的主要途径,规划建设城际间快速轨道交通已经成为经济发展的迫切需要。某省份决定在包含9座城市的城市群内架设快速轨道交通干线,从最小投资角度出发,如何设计能连接城市群内所有城市的交通干线,并使得造价最低总道路长度最短

结合现实道路连通情况,对9座城市间交通道路图进行图论抽象,得到现实距离无向图如下图所示,不仅可以看到城市群所处的大致地理方位,亦可得知其间道路连通及其间距离的大致情况如下图所示。

问题解析

对于该城市群快速轨道交通干线问题,用小圆圈表示城市,用边表示城市之间联通道路,边上的权是用以表示两地间距离的公里数。网络的构成可采用点-点邻接关系来描述。边的权决定了路线选择的结果和最终轨道干线的投资。

利用第74期介绍的Kruskal算法对上图进行推算,最终可获得一条连通各城市、总路程最短(即投资最小)的交通干线,符合节约费用的原则。该算法的实质推论过程是:在无向图中,按照边的权值从小到大依次进行排序,从而获得边的权值递增序列,进而在图中依次递增序列选择边的集合。如果新选择的边与已经确认的边构成了回路(即首尾相连的环形边序列),则放弃该边,继续选择权递增的边序列中的下一条边,直到序列中的最后一条边。

问题求解

(1)首先选择权最小的边。从图中可知,DK,KL,GH的权均为55,从中任选一条均可。此处我们选择KL作为第一条边。

(2)接着再从除去边KL的其余边中选择权最小且不构成回路的第二条边。DK,GH权均为55,可从中任选一条。此处我们选择DK作为第二条边。

(3)选择HG作为第三条边。

(4)除去KL,DK,GH三条边后,可以继续选择权为60的边CU,UH和AB,它们均可满足权最小且不构成回路的条件。

(5)DL,GA的权均为65,如果选择边DL,那么DK,KL和DL将构成封闭的三角形回路,故舍弃边DL,选择边GA

(6)继续选择下一条边时也遇到构成回路的情况。边HA和GB的权为70,但如果选择它们必将产生回路,即:HG,GA,AH三角环回路或AG,AB,GB三角环回路。因此,不能选择此两边,必须选择不构成回路、但权稍大的其他边继续该算法。此处选择权为80的边AK

(7)此时继续算法将会全部产生回路,算法结束,图中粗线展示了根据算法求解最小生成树的过程。

得到最小生成树如下图所示:

例2、最优二叉树问题

下面小编带大家学习一下最优二叉树问题。先来看如下定义。

(1)节点的带权路径长度:从树根节点到某节点之间的路径长度与该节点上权值的乘积称为该节点的带权路径长度。

(2)树的带权路径长度(WPL):树中所有叶子节点的带权路径长度之和称为该树的带权路径长度。

最优二叉树又称霍夫曼树,它是n个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树。假设有n个权值,则构造出的霍夫曼树有n个叶子结点。n个权值分别设为w1,w2,…,wn,则霍夫曼树的构造规则为:

(1)将w1,w2,…,wn看成是有n棵树的森林(每棵树仅有一个结点);

(2)在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林;

(4)重复上面两步,直到森林中只剩一棵树为止,该树即为所求得的最优二叉树。

因此,霍夫曼树的特征有:

(1)越靠近根节点,权值越大;

(2)初始结点全是后来的叶子结点;

(3)叶子结点权值越大,离根节点越近(路径越短);

(4)如果把路径标上0和1,则每一个叶子结点有一个唯一编码(不定长)。

霍夫曼树的应用:霍夫曼编码

编码:在数据通信中,经常需要将传送的文字转换为二进制字符0、1组成的字符串,这个过程称为编码。

霍夫曼编码:需要编码的字符集合为{d1,d2,...,dn},各个字符在电文中出现的次数集合{w1,w2,...,wn},那么以d1,d2,...,dn作为叶子节点,以w1,w2,...,wn作为个节点的权值构造一颗霍夫曼树,一般规定霍夫曼树中左分支为0,右分支为1,则从根节点到叶节点所经过的分支对应的0和1序列就称为该节点对应字符的编码,这样的编码就是霍夫曼编码。

霍夫曼编码的优点在于能最大程度的节省空间

问题描述

一组字符{A,B,C,D,E,F,G}出现的频率分别是{9,11,5,7,8,2,3},设计最经济的编码方案并求出带权路径长度

问题求解

利用构造规则画出霍夫曼树:(不唯一,只要根结点是45就是对的)

将霍夫曼树所有的左子树标记为0,右子树标记为1(也可以左子树标1,右子树标0,霍夫曼编码和霍夫曼树不是唯一的,只要遵循一个统一的规定,就可以构建出霍夫曼编码),然后将所有的权值与字母对应起来。

相应的编码就是从根结点到相应位置的路径。

A对应的霍夫曼编码为00

B对应的霍夫曼编码为10

C对应的霍夫曼编码为010

D对应的霍夫曼编码为110

E对应的霍夫曼编码为111

F对应的霍夫曼编码为0110

G对应的霍夫曼编码为0111

WPL=9×2+11×2+5×3+7×3+8×3+2×4+3×4=120

带权路径长度为120

02最短路问题

最短路问题是在图的基础上衍生出来的,也是网络优化中的一个基本问题,广泛应用于计算机科学交通工程通信工程系统工程运筹学、信息论、控制理论等众多领域。本次小编选取一道公路网络运输中的最短路问题,运用第76期详细介绍的经典Dijkstra算法进行求解。

例3、最短路问题

问题描述

6v1,v2,...,v6城市之间的一个公路网如下图所示,每条公路为图中的边,边上的权数表示该段公路的长度(单位:百公里),假如小明处在城市v1,需要将某物品运送到所有的城市,那么从v1v6应选择哪一路径可以使小明的费用最省

问题求解

解法一:Dijkstra算法

首先设每百公里所用费用一样,求v1v6的费用最少,即v1v6的最短路线。为了方便计算,我们先作出该网络的距离矩阵,如下:

(1)设W(v1)=0,T(v)=∞,vj∈{v2,v3,v4,v5,v6}

(2)第一次迭代:

①计算T(vj)j=2,3,4,5,6如下:

②取minvj∈s-{T(vj)}=2=T(v3),令W(v3)=T(v3)=2

③由于k=3≠(n=6),令s-={v2,v4,v5,v6}i=3

第二次迭代:

①计算T(vj)j=2,4,5,6如下:

②取minvj∈s-{T(vj)}=3=T(v2),令W(v2)=T(v2)=3

③由于k=2≠(n=6),令s-={v4,v5,v6}i=2

第三次迭代:

①计算T(vj)j=4,5,6如下:

②取minvj∈s-{T(vj)}=8=T(v4),令W(v4)=T(v4)=8

③由于k=4≠(n=6),令s-={v5,v6}i=4

第四次迭代:

①计算T(vj)j=5,6如下:

②取minvj∈s-{T(vj)}=10=T(v5),令W(v5)=T(v5)=10

③由于k=5≠(n=6),令s-={v6}

第五次迭代:

①计算T(vj)j=6如下:

③由于k=6=n,因此已经找到v1v6的最短距离为12,计算结束

(3)找最短路线,逆向追踪得:

v1→v3→v2→v4→v5→v6

最短距离为2+1+5+2+2=12,即按上述路线从城市v1v6的距离最短,费用最省。

解法二:Floyd算法

某些问题中,要求网络上任意两点间的最短路。这类问题可以用Dijkstra算法依次改变起点的办法计算,但比较烦琐。这里介绍的Floyd方法来求解本例题,可直接求出网络中任意两点间的最短路,步骤如下

回到例题本身,由上图可得:

03最大流问题

最大流问题是一类应用极为广泛的问题,例如在交通运输网络中有人流、车流、货物流,供水网络中有水流,金融系统中有现金流,通信系统中有信息流等等。20世纪70年代福特(Ford)、富克逊(Fulkerson)建立的“网络流理论”,是网络应用的重要组成部分。本次小编选取一道电力公司供电问题中的最大流问题,运用第78期详细介绍的Ford-Fulkerson 标号算法进行求解。

例4、最大流问题

问题描述

某地的电力公司有三个发电站,它们负责5个城市的供电任务,其输电网络如下图所示。由图可知,城市8由于经济发展,要求供应电力65MW,三个发电站在满足城市4、5、6、7的用电需要量后,它们还分别剩余15MW,10MW和40MW,输电网络剩余的输电能力见下图节点上的数字。三个发电站在满足城市4、5、6用电量之后,剩余发电能力共有65MW,与城市8的用电需求量刚好相等。问题是输电网络的输电能力是否满足输电65MW的电力,如不满足,需要增建哪些输电线路

问题解析

根据上述对该问题的描述,可以转换成一个最大流的问题求解。图中的输电网络图有三个发点(即三个发电站),一个终点(城市8)。如果能求得从三个发点到终点的最大流,就知道输电网络的最大输电能力,也知道是哪些已饱和了的弧限制了输电能力的提高,从而可以据此确定应增建哪些输电线路。

问题求解

为了应用Ford-Fulkerson标号法求解上图所示的网络最大流,需要增设一个发点S,把网络图化为只有一个发点和一个终点的容量网络图,如下图所示。

应用Ford-Fulkerson标号法有如下表1所示的求解过程:

由上表可知最大流为55MW,最后的可行流见下图弧旁带括号的数值

结果分析

从上图可知,城市8用电需求量为65MW,而输电网络的最大输电量只有55MW,相差10MW。为了增输10MW,最好的方案是在饱和弧⑤→⑧(最小割集上的弧)上增建输送10MW的新线路,而把非饱和弧S→③、⑥→⑤各增加10MW使之饱和,最后扩建方案如下图所示。如在饱和弧⑦→⑧上增建10MW的新线路,则还须把弧③→⑦扩容10MW

04最小费用最大流问题

上一个例题求解的网络最大流问题只考虑了流的数量,没有考虑流的费用。在实际应用场景中,许多问题要考虑流的费用最小问题。本次小编选取一道天然气运输问题中的最小费用最大流问题,运用第80期详细介绍的方法进行求解。

例5

最小费用最大流问题

问题描述

中国石油天然气集团公司在东海有一个油气田(节点vs),该公司要将开采的天然气通过管道运送到上海的一个配送中心(节点vt),天然气在运送途中要经过管道更换接点(节点v2、v3、v4),换接前后的管道长短不一,而且不同的管道对应不同的单位流量费。下图是天然气运输的管道网络图,弧线表示管道,弧旁的数字(cij,dij)表示管道上的单位流量容量和费用。公司希望选择一个经济实惠的管道路线运输天然气,既运输最多的天然气又使总运输费用最少

问题求解

f(0)={0}开始,作L(f(0))如下图所示,用Dijkstra算法求得L(f(0))网络中的最短路为vs→v2→v3→vt,在网络G中相应的可增广链μ1={vs,v2,v3,vt}上用最大流算法进行调整:

结果见图

f(1)

L(f(1))如下图所示,由于边上有负权,所以求最短路不能用Dijkstra算法,可用逐次逼近法。最短路为vs→v3→vt,在网络G内相应的可增广链上进行调整,得流f(2),如下图所示。

W(f(2))=3,d(f(2))=2×1+2×2+3×1+1×3=12

L(f(2))如下图所示,与vs关联的弧指向vs不存在vsvt的最短路。故下图所示的f(2)为最小费用最大流。费用为:

W(f(2))=3,d(f(2))=2×1+2×2+3×1+1×3=12

以上就是本期图与网络分析例题讲解的全部内容啦,通过对这一期的学习,相信大家一定能够加深对图与网络分析的理解,进而在生活实践中学会应用!

作者 | 陈志昂 林鑫

责编 | 刘文志

审核 | 徐小峰

 ·YUNCHOUSHUO· 

·知乎|运筹说·

·简书|运筹说·

·CSDN|运筹说·

这篇关于运筹说 第81期 | 图与网络分析经典例题讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/611745

相关文章

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

ispunct函数讲解 <ctype.h>头文件函数

目录 1.头文件函数 2.ispunct函数使用  小心!VS2022不可直接接触,否则..!没有这个必要,方源一把抓住VS2022,顷刻 炼化! 1.头文件函数 以上函数都需要包括头文件<ctype.h> ,其中包括 ispunct 函数 #include<ctype.h> 2.ispunct函数使用 简述: ispunct函数一种判断字符是否为标点符号的函

深度学习速通系列:深度学习算法讲解

深度学习算法是一系列基于人工神经网络的算法,它们通过模拟人脑处理信息的方式来学习和解决复杂问题。这些算法在图像识别、语音识别、自然语言处理、游戏等领域取得了显著的成就。以下是一些流行的深度学习算法及其基本原理: 1. 前馈神经网络(Feedforward Neural Networks, FNN) 原理:FNN 是最基本的神经网络结构,它由输入层、隐藏层和输出层组成。信息从输入层流向隐藏层,最

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

[项目][CMP][直接向堆申请页为单位的大块内存]详细讲解

目录 1.系统调用 1.系统调用 Windows和Linux下如何直接向堆申请页为单位的大块内存: VirtualAllocbrk和mmap // 直接去堆上按页申请空间static inline void *SystemAlloc(size_t kpage){#ifdef _WIN32void *ptr = VirtualAlloc(0, kpage << 13,

高斯平面直角坐标讲解,以及地理坐标转换高斯平面直角坐标

高斯平面直角坐标系(Gauss-Krüger 坐标系)是基于 高斯-克吕格投影 的一种常见的平面坐标系统,主要用于地理信息系统 (GIS)、测绘和工程等领域。该坐标系将地球表面的经纬度(地理坐标)通过一种投影方式转换为平面直角坐标,以便在二维平面中进行距离、面积和角度的计算。 一 投影原理 高斯平面直角坐标系使用的是 高斯-克吕格投影(Gauss-Krüger Projection),这是 横

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的