本期我们进行运筹学之图与网络分析算法的讲解,我们将对图与网络分析的基础知识进行一个简单的回顾,并介绍求解最短路问题的MATLAB和Python相关代码,以帮助大家利用工具快速求解最短路问题,做到事半功倍。由于篇幅有限,小编接下来只展示部分代码,小伙伴们可以关注“运筹说”公众号→后台回复“算法介绍之图与网络分析(一)”获取完整代码。话不多说,我们一起来看看吧!
一、基础知识
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,使它是从vs 到vt 的所有路中总权最小的道路。即:
★ Dijkstra算法
可用于求解指定两点vs ,vt 间的最短路,或从指定点vs 到其余各点的最短路,目前被认为是求无负权网络最短路的最好方法。
算法的基本思路:若序列{vs ,v1,⋯vn-1 ,vn }是从vs 到vn 的最短路,则序列{vs ,v1,⋯vn-1 }必为从vs 到vn-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)就是vi到vj的最短路长。
★ 算法总结
二、算法实现
1、Dijkstra算法
(1)例题介绍
用Dijkstra算法求下图中v1 点到v6 点的最短路。
(2)平台实现
我们以上述例题为例,借助MATLAB和Python介绍实现Dijkstra算法的相关代码。
①MATLAB
★ 代码展示
★ 代码调用
代码运行及最终结果展示如下,可以看到用Dijkstra算法求得v1 到v6 的最短路为13,具体路线为:v1→v2→v5→v6 。
②Python
★ 代码展示
★ 代码调用
代码运行及最终结果展示如下,可以看到用Dijkstra算法求得v1 到v6 的最短路为13,本例中Python代码以0代表起点v1 ,以5代表终点v6 ,最终结果由终点指向起点:5→4→1→0,对应到例题中起点到终点最短路径的具体路线为:v1→v2→v5→v6 。
2、Floyd算法
(1)例题介绍
用Floyd算法求下图中任意两点间的最短路。
(2)平台实现
我们以上述例题为例,借助MATLAB和Python介绍实现求解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
本期的内容就介绍到这里,想要进一步了解运筹学,关注本公众号,快快学起来吧!
作者 | 尹萌娟 王连聚
责编 | 刘文志
审核 | 徐小峰