数学建模比赛准备---图与网络模型
上一篇文章中提到过传染病微分方程模型实际上遵循的是网络科学(network science)中的网络传播。网络科学的相关模型其实在ICM比赛中的D题尤其常见,使用网络模型的最大优势在于它具有分析网络结构的能力:包括设计路径,识别关键节点,分析节点之间的关系等等。而网络模型又和图论(图论的相关基础概念可以参考)以及拓扑无法分割:网络中所有的要素都被简化为节点/顶点(node/verticle),要素之间的关系都被简化成边(edge),点与线最终构成一张图。故而本篇文章将针对图与网络模型的相关算法和O奖论文进行简单的讲解。
01
—
最短路径问题
很多数学建模问题都会涉及到寻找两点之间的最短路径。比如,2019年的B题需要设计用无人机运送药物和执行拍摄任务的路径,2019年的D题需要设计最佳的撤退路径(都可以理解为最短)。所以最短路径的算法是必须要掌握的。
我们首先要构建赋权图 。其中V是顶点的集合,E是边的集合,W是邻接矩阵的集合。邻接矩阵是用来存放各条边的权重(不能为负)。注意,领接矩阵的对角线上为该点到自己的路径的权值故而为0,如下图所示【1】。以 为例,第一行的0,1,1,1,分别表示了 点到 点的路径权重为0,1,1,1。对于无向图,W矩阵为对称矩阵;对于有向图,则不一定。
如果两点之间并没有路径存在,如下图所示【2】,那通常在邻接矩阵中记为 。
Dijkstra算法
Dijkstra算法是目前最成熟的算法。其基本思路如下图所示【3】,是从标记0的顶点开始,依次记下它到其它点的最短路径到一个集合内。每次要新增到一个点的最短路径时,就会找出距离这个点最近的上家,把从标记0的点到新增点的路径定义为上家最短路径+上家到新增点的边权值。这样一直算下去,直到把从标记0的点到所有点的最短路径都存起来。具体算法和编程请参考余胜威《MATLAB数学建模经典案例实战》P125。
在美赛中,非常多的O奖论文用到了Dijkstra算法。比如2019年的D题O奖论文1902407用了改进的Dijkstra算法并将其与优化相结合:该文设立了三类的顶点,分别为S,R,D。
同学们还可以去阅读2019年的D题O奖论文1922074,该文结合了改进的蚁群算法和改进的Dijkstra算法。所以大家在该算法的基础上,一定要去考虑如何结合题意要求来改变。
Floyd算法
如果要计算赋权图中每对顶点之间的最短路径,用Dijkstra算法的计算量会非常大。所以我们这里再介绍一个新的动态规划算法---Floyd算法。它其实可以说是Dijkstra算法的改进版,但Floyd算法是求任意两点之间的距离,是多源最短路;而Dijkstra算法是求一个顶点到其他所有顶点的最短路径,是单源最短路。
Floyd算法的基本思路为用迭代递推去算出最新的邻接矩阵,这样最后得到的邻接矩阵就存储了各个顶点之间的最短路径值。具体算法和编程请参考余胜威《MATLAB数学建模经典案例实战》P128。
2019年的D题O奖论文1923074将Floyd算法与遗传算法相结合:
02
—
最小生成树问题
首先我们需要理解什么是树。
树:连通的无圈图叫做树(连通指任两点之间都存在道路,圈指闭合轨道)。
一个连通图的生成树的个数很多,那么什么是最小生成树呢?
最小生成树:连通的加权无向图中权值最小的生成树。
如下图【4】所示。
“它在实际中有什么应用呢?比如说有N个城市需要建立互联的通信网路,如何使得需要铺设的通信电缆的总长度最小呢?这就需要用到最小生成树的思想了。【4】”
最小生成树问题的以下两个算法在美赛中是非常值得掌握的算法思路。
Prim算法
Prim算法中,将最小生成树当中的顶点放入集合P,剩下的其它顶点放入集合V-P,将最小生成树中的边放入集合Q(Q一开始为空集)。其基本思路是以点为对象,从P与V-P中挑选具有最小权值的边(这个边必须有一个点还没有访问过),将这条边的顶点加入P,将边加入Q。这样一直不停重复,也就是一直挑选与点相连的最短边,直到P=V,最小生成树就构造完毕了。具体算法和编程请参考司守奎《数学建模算法与应用》P46。
Kruskal算法
Kruskal算法则是以边为对象,不断地加入新的不构成环路的最短边来构成最小生成树。其基本思路如下【5】:
“首先,我们需要把m个节点看成m个独立的生成树,并且把n条边按照从小到大的数据进行排列。在n条边中,我们依次取出其中的每一条边,如果发现边的两个节点分别位于两棵树上,那么把两棵树合并成为一颗树;如果树的两个节点位于同一棵树上,那么忽略这条边,继续运行。等到所有的边都遍历结束之后,如果所有的生成树可以合并成一条生成树,那么它就是我们需要寻找的最小生成树,反之则没有最小生成树。”具体算法和编程请参考司守奎《数学建模算法与应用》P47。
03
—
网络最大流问题
美赛中经常有和车流、人流相关的赛题,这种对于流的分析,我们可以通过寻求有向图的网络最大流来解决。
Ford-Fulkerson算法
针对flow problem,Ford-Fulkerson算法是理解起来最简单的。它是一种标号-寻找增广路径的方法。具体算法和编程请参考司守奎《数学建模算法与应用》P49。
2019年的D题O奖论文1922748将Ford算法用来计算撤退时候的人流从而进一步研究撤退的路线以及瓶颈地段:
Dinic算法和ISAP算法也是针对flow problem的常用算法,如果时间和能力允许,同学们也可以尝试着去学习。另外不要忘了Matlab中的图论工具包同样可以求解最大流。
04
—
双层网络问题
有时候赛题需要同学们自己把相关因素组建起来成为一个网络模型,比如,把不同层次的物理区域连接起来构建一个地域的网络。每个区域就可看作是一个节点。组建网络后,你可以用各种模型来描述节点之间是如何作用的,比如微分方程,离散数学,神经网络等等(网络模型的应用可以非常灵活,双层网络模型可以和各种各样的数学模型结合起来使用)。再然后计算参数,用模型来完成分析和预测等。
在以往的美赛当中,2013年的C题(当时C题属于ICM)与2016年的D题,都属于这样类型的题,都要求同学们建立动态的网络模型。这里我们将介绍两大类型的双层网络模型。
基于微分方程的双层网络
以2018年的O奖论文82794为例。该论文建立了一个双层网络模型结合传染病模型的微分方程与评价评估来分析特斯拉充电站的发展。
内层网络主要分析在一个county内部充电站如何分布。
外层网络主要分析在county与county之间充电站如何分布。
再以2016年的的O奖论文42220为例,也是双层网络模型+微分方程的组合。
基于离散数学的双层网络
以2013年的O奖论文18492为例。该论文建立了一个基于Forrester世界模型的双层网络模型来分析地球的健康。
网络包含两层,顶层由地理区域的节点组成,每个节点表示一个州或者一片海洋,下图是以美国某些轴为节点的网络图示意。顶层网络的节点之间的相互作用是基于通信网络的协议来设计的。
而网络的下一层,也就是每个节点的子网络则基于Forrester世界模型包括有下图中五个节点。子网络的节点之间的相互作用是基于双边贝叶斯信念网络模型(Bayesian Belief Network)来设计的。
【1】网络来源,侵删
【2】网络来源,侵删
【3】https://www.cnblogs.com/bigsai/p/11537975.html
【4】https://zhuanlan.zhihu.com/p/34922624
【5】https://wiki.jikexueyuan.com/project/step-by-step-learning-algorithm/kruskal-algorithm.html
疫情严重,希望大家在家好好待着,无聊的时候可以考虑考虑学习!