运筹说 第77期 | 算法介绍之图与网络分析(一)

 本期我们进行运筹学之图与网络分析算法的讲解,我们将对图与网络分析的基础知识进行一个简单的回顾,并介绍求解最短路问题的MATLABPython相关代码,以帮助大家利用工具快速求解最短路问题,做到事半功倍。由于篇幅有限,小编接下来只展示部分代码,小伙伴们可以关注“运筹说”公众号→后台回复“算法介绍之图与网络分析(一)”获取完整代码。话不多说,我们一起来看看吧!

一、基础知识

1、图

基本概念

(1)图:一个图是由点集V={vi }和V中元素的无序对的一个集合E={ ek }所构成的二元组,记为G=(V,E),V中的元素vi 叫做顶点,E中的元素ek 叫做

(2)子图:图G=(V,E),若E'是E的子集,V'是V的子集,且E'中的边仅与V'中的顶点相关联,则称G'=(V',E')是G的一个子图。特别是,若V'=V,则G'称为G的生成子图(支撑子图)

(3)链:在无向图G=(V,E)中,由两两相邻的点及其相关联的边构成的点边序列称为链。

(4)连通图:一个图中任意两点间至少有一条链相连,则称此图为连通图。

(5)权:与点或边有关的某些数量指标,权可以代表如距离、费用、通过能力(容量)等。

(6)网络(赋权图):点或边带有某种数量指标(时间、费用、距离等)的图,称为网络(赋权图)。

图的分类

(1)有向图与无向图

有向图:如果边(vi , vj )的端点有序,即它表示以vi 为始点,vj 为终点的有向边(或称弧),这时图G称为有向图。

无向图:对于任一条边(vi , vj )属于E,如果边(vi , vj )端点无序,则它是无向边,此时图G称为无向图。

(2)简单图与多重图

简单图:不含环和多重边的图称为简单图。

多重图:含有多重边的图称为多重图。

2、树

基本性质

(1)连通且不含圈的无向图称为树。

(2)任何树至少有两个悬挂节点。

(3)如果树的节点个数为m,则边的个数为m-1。

(4)树中任意两个节点之间只有唯一的一条链。

(5)在树的任意两个不相邻的节点之间增加一条边,则形成唯一的圈。

(6)从树中任意去掉一条边,则余下的图是不连通的。

(7)由图的所有节点(m个)和图的m-1条边组成的树称为图的支撑树。

最小生成树

(1)定义

一棵生成树所有树枝上权的总和,称为这个生成树的权。具有最小权的生成树称为最小生成树(最小支撑树),简称最小树。

(2) 求解方法

3、最短路问题

问题描述

最短路问题的一般提法如下:

G=(V,E)为连通图,图中各边(vi ,vj )有权lij (lij =∞表示vi ,vj 间无边),vs ,vt 为图中任意两点,求一条道路m,使它是从vsvt 的所有路中总权最小的道路。即:

Dijkstra算法

可用于求解指定两点vs ,vt 间的最短路,或从指定点vs 到其余各点的最短路,目前被认为是求无负权网络最短路的最好方法。

算法的基本思路:若序列{vs ,v1,⋯vn-1 ,vn }是从vsvn 的最短路,则序列{vs ,v1,⋯vn-1 }必为从vsvn-1 的最短路。

Floyd算法

Floyd算法又称为插点法,是一种用于求出网络上任意两点间最短路径的算法,边权可正可负。

为计算方便,令网络的权矩阵为D=(dij)n×n,有

此时算法基本步骤:

(1)输入权矩阵D(0)=D

(2)依次计算D(k) =(dij (k))n×n , k=1,2,3,¼,n,其中

(3)D(n) =(dij (n))n×n 中元素dij (n)就是vivj的最短路长。

算法总结

二、算法实现

1、Dijkstra算法

(1)例题介绍

用Dijkstra算法求下图中v1 点到v6 点的最短路。

(2)平台实现

我们以上述例题为例,借助MATLABPython介绍实现Dijkstra算法的相关代码。

①MATLAB

代码展示

代码调用

代码运行及最终结果展示如下,可以看到用Dijkstra算法求得v1v6 的最短路为13,具体路线为:v1v2v5v6

②Python

代码展示

代码调用

代码运行及最终结果展示如下,可以看到用Dijkstra算法求得v1v6 的最短路为13,本例中Python代码以0代表起点v1 ,以5代表终点v6 ,最终结果由终点指向起点:5→4→1→0,对应到例题中起点到终点最短路径的具体路线为:v1v2v5v6

 

2、Floyd算法

(1)例题介绍

用Floyd算法求下图中任意两点间的最短路。

 

(2)平台实现

我们以上述例题为例,借助MATLABPython介绍实现求解Floyd算法的相关代码。

①MATLAB

代码展示

  代码调用

②Python

代码展示

  代码调用

(3)结果展示

用MATLAB和Python运行求解Floyd算法的程序,各点之间的最短距离如下表所示:

 

三、参考资料

【Dijkstra算法MATLAB实现】

https://blog.csdn.net/weixin_41971010/article/details/107666810

【Dijkstra算法Python实现】

https://blog.csdn.net/weixin_42875283/article/details/124341524

【Floyd算法MATLAB实现】

https://blog.csdn.net/qq_61123461/article/details/120047942

【Floyd算法Python实现】

https://blog.csdn.net/AivenZhong/article/details/93770197

本期的内容就介绍到这里,想要进一步了解运筹学,关注本公众号,快快学起来吧!

作者 | 尹萌娟 王连聚

责编 | 刘文志

审核 | 徐小峰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值