Python数模笔记-NetworkX(5)关键路径法


关键路径法(Critical path method,CPM)是一种计划管理方法,通过分析项目过程中工序进度安排寻找关键路径,确定最短工期,广泛应用于系统分析和项目管理。


1、拓扑序列与关键路径

1.1 拓扑序列

一个大型工程或项目包括很多子项目,在整个项目中有些子项目没有先决条件,可以安排在任何时间开始;而有些子项目必须安排在其它子项目完成之后才能开始,也就是需要以所有前序子项目的结束为先决条件。

通过有向图可以直观反映项目中各个子项目之间的关系。图中的顶点代表活动,有向边代表活动的先后关系。有向边的起点活动是终点活动的先决条件,只有当边的起点活动完成之后,才能开始终点活动。这种以顶点表示活动、边表示活动间先后关系的有向图,称为顶点活动网(Activity on vertex network,AOV网)。

AOV网是一个有向无环图,即不存在回路。有向无环图的所有活动可排列成一个线性序列,使每个活动的所有前驱活动都排在该活动之前,称为拓扑序列(Topological order)。拓扑序列的意义是,如果按照拓扑序列中的顶点次序开始活动,每个活动开始时它的所有前驱活动都已完成,从而使整个工程得以顺序进行。

AOV网和拓扑序列只考虑网络拓结构,也就是只有各个活动的先后顺序,不考虑活动所需的时间和费用。因此,AOV网的拓扑序列通常不是唯一的,而只是各种可行顺序之一。


欢迎关注 Youcans 原创系列,每周更新数模笔记

Python数模笔记-PuLP库
Python数模笔记-StatsModels统计回归
Python数模笔记-Sklearn
Python数模笔记-NetworkX
Python数模笔记-模拟退火算法


1.2 活动网络

带权的活动网络(Activity on edge network,AOE网),顶点表示事件或状态,有向边表示活动,边上的权值通常表示活动的持续时间。AOE网可以用来估算项目的完成时间。

注意 AOV网与 AOE网的区别,不仅在于边是否带权。AOV网的顶点代表活动(工序), 边只表示先后关系;AOE网的顶点表示事件,边表示工序,边的权值表示完成工序所需的时间。

AOE 网中从起点到终点的最长的加权路径长度,称为关键路径(Critical path,CP) 。关键路径是项目中时间最长的活动顺序,决定着可能的项目最短工期 。优化关键路径可以有效地加快设工程实施的进度。

1.3 关键路径法

关键路径法(Critical path method,CPM) 是一种基于进度网络模型的方法,用网络图表示各项活动之间的相互关系,获得在一定工期、成本、资源约束条件下的最优进度安排。

关键路径法源于美国杜邦公司对于项目管理控制成本、减少工期的研究。1959年,Kelly 和 Walker 在论文 Critical Path Planning and Scheduling 中提出了关键路径法的基本原理和方法:计算所有活动的工期,确定其最早开始 ES 和最早结束 EF、最晚开始 LS 和最晚结束 LF 的时间,按照活动的相互关系形成顺序的网络逻辑 图,找到必须的最长路径即为关键路径。

关键路径法首先使用正推法(Forward pass),从起点开始向后计算,依次计算每个顶点(事件)的最早开始时间 VE;然后再使用逆推法(Backward pass),从终点开始向前计算,依次计算每个顶点(事件)的最晚开始时间 VL。在此基础上,可以进一步再求出每条边(工序)的最早开始时间 EE 和最晚开始时间 EL。最早开始时间 EE 和最晚开始时间 EL 相等的边,就是关键路径上的边,对应的工序是关键工序。



2、NetworkX 的拓扑序列和关键路径算法

NetworkX 提供了有向无环图的拓扑序列和关键路径的函数。

2.1 拓扑序列函数 topological_sort()

函数功能
topological_sort(DG)返回按拓扑排序的节点生成器
all_topological_sorts(DG)返回所有按拓扑排序的节点生成器
is_directed_acyclic_graph(DG)检查 DG 是否为有向无环图

topological_sort(DG) 返回有向无环图 DG 的一个拓扑序列,返回值的类型为 <class ‘generator’>,可以转化为列表类型方便使用。

有向无环图 DG 的拓扑序列不是唯一的,all_topological_sorts(DG) 返回有向无环图 DG 的全部拓扑序列,返回值的类型为 <class ‘generator’>,可以转化为二维列表类型方便使用。

如果 DG 不是有向图,函数抛出错误提示"NetworkXNotImplemented"。如果 DG 不是无环图,函数抛出错误提示"NetworkXUnfeasible"。

is_directed_acyclic_graph(DG) 可以检查 DG 是否为有向无环图。当 DG 为有向无环图时,返回值为 True,否则返回 False。

2.2 关键路径和路径长度函数 dag_longest_path()

函数功能
dag_longest_path(DG)返回 DG 的最长路径
dag_longest_path_length(DG)返回 DG 的最长路径长度

dag_longest_path(G, weight=‘weight’, default_weight=1, topo_order=None)

dag_longest_path_length(G, weight=‘weight’, default_weight=1)

主要参数:

  • G(NetworkX graph):有向无环图。
  • weight (str, optional):按该字符串查找边的属性作为权重。默认值 weight=“weight”。

返回值:

  • dag_longest_path() 的返回值是 DG 最长路径的顶点列表,也即关键路径的节点列表。
  • dag_longest_path_length() 的返回值是 DG 最长路径的组成边的加权长度,也即关键路径的长度。

参数和返回值都非常简单,用起来是很方便的。但是,函数没有提供进行计划网络分析所需要的事件时间参数,因此也就不能在此基础上进行网络优化了。


2.3 NetworkX 使用例程

# networkX_5c.py
# Demo of critical path method(CPM) with NetworkX
# Copyright 2021 YouCans, XUPT
# Crated:2021-05-25import matplotlib.pyplot as plt # 导入 Matplotlib 工具包
import networkx as nx  # 导入 NetworkX 工具包DG = nx.DiGraph()  # 创建:空的 有向图
DG.add_nodes_from(range(1, 8), VE=0, VL=0)
DG.add_weighted_edges_from([(1, 2, 5), (1, 3, 10), (1, 4, 11),(2, 5, 4),(3, 4, 4), (3, 5, 0),(4, 6, 15),(5, 6, 21), (5, 7, 25), (5, 8, 35),(6, 7, 0), (6, 8, 20),(7, 8, 15)]) 
lenNodes = len(DG.nodes)  # 顶点数量
topoSeq = list(nx.topological_sort(DG))  # 拓扑序列
criticalPath = list(nx.dag_longest_path(DG))  # 关键路径(节点)
lenCriticalPath = nx.dag_longest_path_length(DG)  # 关键路径的长度
print("拓扑序列:{}".format(topoSeq))  # [1, 3, 4, 2, 5, 6, 7, 8]
print("关键路径:{}".format(criticalPath))  # [1, 3, 5, 6, 8]
print("关键路径长度:{}".format(lenCriticalPath))  # 51pos = {1: (0, 4), 2: (5, 8), 3: (5, 4), 4: (5, 0), 5: (10, 8), 6: (10, 0), 7: (15, 4), 8: (20, 4)}  # 指定顶点位置
nx.draw(DG, pos, with_labels=True, alpha=0.8)  # 绘制无向图
labels = nx.get_edge_attributes(DG, 'weight')
nx.draw_networkx_edge_labels(DG, pos, edge_labels=labels, font_color='c')  # 显示边的权值
plt.show()  # YouCans, XUPT

程序运行结果

拓扑序列:[1, 3, 4, 2, 5, 6, 7, 8]
关键路径:[1, 3, 5, 6, 8]
关键路径长度:51
逆转拓扑序列: [8, 7, 6, 5, 2, 4, 3, 1]


3、关键路径法案例和例程

NetworkX 虽然提供了拓扑序列和关键路径的函数,但是没有给出时间参数,如工序的最早开工时间、最晚开工时间,不能实现对计划网络图的分析和优化。

网络上关于计划网络和关键路径法的Python语言例程不多,有些并不正确或者就没有调通,有些只有部分程序不能直接使用。

作者详细研究了相关内容的 NetworkX 的说明文档,发现不少文档甚至包括官方文档也有不少问题,主要是 NetworkX 版本更新后文档不匹配。

为此,作者从拓扑序列开始,给出了关键路径算法的完整例程。为了便于阅读、使用和修改程序,本程序采用了比较简单易读的程序结构,一些地方原本是可以写的更简练的。


3.1 问题描述

项目工程的计划网络图问题。

某项目工程由 11项作业组成(分别用 A、B、…K表示),其计划完成时间及作业间相互关系如下表所示。求:(1)完成该项目的最短时间;(2)各项目的最早开工时间、最迟开工时间和作业的关键路径。

作业计划完成天数紧前工序作业计划完成天数紧前工序
A5G21B,E
B10H35B,E
C11I25B,E
D4BJ15F,G,I
E4AK20F,G
F15C,D

本案例问题来自:司守奎、孙兆亮,数学建模算法与应用(第2版),P62-68,例4.16-4.18,国防工业出版社。


3.2 Python 程序

# networkX_5c.py
# Demo of critical path method(CPM) with NetworkX
# Copyright 2021 YouCans, XUPT
# Crated:2021-05-25
# Youcans 原创作品:[Python数模笔记@Youcans](https://blog.csdn.net/youcans )import matplotlib.pyplot as plt # 导入 Matplotlib 工具包
import networkx as nx  # 导入 NetworkX 工具包DG = nx.DiGraph()  # 创建:空的 有向图
DG.add_nodes_from(range(1, 8), VE=0, VL=0)
DG.add_weighted_edges_from([(1, 2, 5), (1, 3, 10), (1, 4, 11),(2, 5, 4),(3, 4, 4), (3, 5, 0),(4, 6, 15),(5, 6, 21), (5, 7, 25), (5, 8, 35),(6, 7, 0), (6, 8, 20),(7, 8, 15)])  # 向图中添加多条赋权边: (node1,node2,weight)
lenNodes = len(DG.nodes)  # 顶点数量 YouCans
topoSeq = list(nx.topological_sort(DG))  # 拓扑序列: [1, 3, 4, 2, 5, 7, 6, 8]# --- 计算各顶点的 VE:事件最早开始时间 ---
VE = [0 for i in range(lenNodes)]  # 初始化 事件最早开始时间
for i in range(lenNodes):for e in DG.in_edges(topoSeq[i]):  # 遍历顶点 topoSeq[i] 的 入边VEij = DG.nodes[e[0]]["VE"] + DG[e[0]][e[1]]['weight']  # 该路线的最早开始时间if VEij > VE[i]: VE[i] = VEij  # 该路线所需时间更长DG.add_node(topoSeq[i], VE=VE[i])  # 顶点(事件)的最早开始时间# --- 计算各顶点的 VL:事件最晚开始时间 ---
revSeq = list(reversed(topoSeq))  # 翻转拓扑序列,以便从终点倒推计算 VL
VL = [DG.nodes[revSeq[0]]["VE"] for i in range(lenNodes)]  # 初始化 事件最晚开始时间为 VE 最大值
for i in range(lenNodes):for e in DG.out_edges(revSeq[i]):  # 遍历顶点 revSeq[i] 的 出边VLij = DG.nodes[e[1]]["VL"] - DG[e[0]][e[1]]['weight']  # 该路线的最晚开始时间if VLij < VL[i]: VL[i] = VLij  # 该路线所需时间更长DG.add_node(revSeq[i], VL=VL[i])  # 顶点(事件)的最晚开始时间print("\n顶点(事件)的最早开始时间 VE, 最晚开始时间 VL:")
for n in DG.nodes:  # 遍历有向图的顶点print("\t事件 {}:\tVE= {}\tVL= {}".format(n, DG.nodes[n]["VE"], DG.nodes[n]["VL"]))# --- 计算各条边的 EE, EL:工序最早、最晚开始时间 ---
cpDG = nx.DiGraph()  # 创建空的有向图, 保存关键路径
print("\n边(工序)的最早开始时间 EE, 最晚开始时间 EL:")
for e in DG.edges:  # 遍历有向图的边DG[e[0]][e[1]]["EE"] = DG.nodes[e[0]]["VE"]  # 边的头顶点的 VE# Wij = DG[e[0]][e[1]]['weight']DG[e[0]][e[1]]["EL"] = DG.nodes[e[1]]["VL"] - DG[e[0]][e[1]]['weight']  # 边的尾顶点的 VL 减去边的权值if DG[e[0]][e[1]]["EE"] == DG[e[0]][e[1]]["EL"]:  # 如果最早、最晚开工时间相同,则为关键路径上的边cpDG.add_edge(e[0], e[1], weight=DG[e[0]][e[1]]['weight'])  # 加入 关键路径print("\t工序 {}:\tEE= {}\tEL= {}".format(e, DG[e[0]][e[1]]["EE"], DG[e[0]][e[1]]["EL"]))lenCP = sum(cpDG[e[0]][e[1]]['weight'] for e in cpDG.edges)
print("\n关键路径:{}".format(cpDG.edges))  # YouCans, XUPT
print("关键路径长度:{}".format(lenCP))pos = {1: (0, 4), 2: (5, 8), 3: (5, 4), 4: (5, 0), 5: (10, 8), 6: (10, 0), 7: (15, 4), 8: (20, 4)}  # 指定顶点位置
nx.draw(DG, pos, with_labels=True, alpha=0.8)  # 绘制无向图
labels = nx.get_edge_attributes(DG, 'weight')  # YouCans, XUPT
nx.draw_networkx_edge_labels(DG, pos, edge_labels=labels, font_color='c')  # 显示边的权值
nx.draw_networkx_edges(DG, pos, edgelist=cpDG.edges, edge_color='r', width=4)  # 设置指定边的颜色
plt.show()# Youcans 原创作品:[Python数模笔记@Youcans](https://blog.csdn.net/youcans )

3.3 程序说明

  1. AOE 图的输入。本例为稀疏的带权有向图,使用 G.add_weighted_edges_from() 函数可以使用列表向图中添加多条赋权边,每个赋权边以元组 (node1,node2,weight) 表示。
  2. 图中的顶点表示事件(状态),边表示问题中的作业工序,边的权值表示完成作业所需的时间。注意,(3, 5, 0),(6, 7, 0) 表示虚作业,完成该作业所需时间(资源)为0,只是表示工序的前后关系。
  3. nx.topological_sort(DG) 生成一个拓扑序列。
  4. for e in DG.in_edges(topoSeq[i]) 表示遍历顶点 topoSeq[i] 的入边,由此可以得到其所有相邻的前向顶点,各前向顶点的最早开始时间与连接边的权值之和 VEij 最大者即为该顶点的最早开始时间。顶点的最早开始时间,要从起点开始,依次向后计算,直到终点结束。
  5. for e in DG.out_edges(revSeq[i]) 表示遍历顶点revSeq[i] 的出边,由此可以得到其所有相邻的后向顶点,各后向顶点的最晚开始时间与连接边的权值之差 VLij 最小者即为该顶点的最晚开始时间。顶点的最晚开始时间,要从终点开始,依次向前计算,直到起点结束。
  6. 各条边(作业工序)的最早开始时间,是这条边的起点的最早开始时间。各条边(作业工序)的最晚开始时间,是这条边的终点的最晚开始时间减去边的权值。
  7. 关键路径的计算:如果一条边的最早、最晚开工时间相同,则这条边是关键路径上的边。

3.4 程序运行结果

顶点(事件)的最早开始时间 VE, 最晚开始时间 VL:事件 1:	VE= 0	VL= 0事件 2:	VE= 5	VL= 6事件 3:	VE= 10	VL= 10事件 4:	VE= 14	VL= 16事件 5:	VE= 10	VL= 10事件 6:	VE= 31	VL= 31事件 7:	VE= 35	VL= 36事件 8:	VE= 51	VL= 51边(工序)的最早开始时间 EE, 最晚开始时间 EL:工序 (1, 2):	EE= 0	EL= 1工序 (1, 3):	EE= 0	EL= 0工序 (1, 4):	EE= 0	EL= 5工序 (2, 5):	EE= 5	EL= 6工序 (3, 4):	EE= 10	EL= 12工序 (3, 5):	EE= 10	EL= 10工序 (4, 6):	EE= 14	EL= 16工序 (5, 6):	EE= 10	EL= 10工序 (5, 7):	EE= 10	EL= 11工序 (5, 8):	EE= 10	EL= 16工序 (6, 7):	EE= 31	EL= 36工序 (6, 8):	EE= 31	EL= 31工序 (7, 8):	EE= 35	EL= 36关键路径:[(1, 3), (3, 5), (5, 6), (6, 8)]
关键路径长度:51

在这里插入图片描述



版权说明:

『Youcans 原创作品』Python数模笔记@Youcans

YouCans 原创作品,转载必须标注原始链接。
Copyright 2021 YouCans, XUPT
Crated:2021-05-25

本文内容及例程为作者原创,并非转载书籍或网络内容。
本文中案例问题来自:司守奎、孙兆亮,数学建模算法与应用(第2版),国防工业出版社


欢迎关注 Youcans 原创系列,每周更新数模笔记

Python数模笔记-PuLP库(1)线性规划入门
Python数模笔记-PuLP库(2)线性规划进阶
Python数模笔记-PuLP库(3)线性规划实例
Python数模笔记-Scipy库(1)线性规划问题
Python数模笔记-StatsModels 统计回归(1)简介
Python数模笔记-StatsModels 统计回归(2)线性回归
Python数模笔记-StatsModels 统计回归(3)模型数据的准备
Python数模笔记-StatsModels 统计回归(4)可视化
Python数模笔记-Sklearn (1)介绍
Python数模笔记-Sklearn (2)聚类分析
Python数模笔记-Sklearn (3)主成分分析
Python数模笔记-Sklearn (4)线性回归
Python数模笔记-Sklearn (5)支持向量机
Python数模笔记-模拟退火算法(1)多变量函数优化
Python数模笔记-模拟退火算法(2)约束条件的处理
Python数模笔记-模拟退火算法(3)整数规划问题
Python数模笔记-模拟退火算法(4)旅行商问题
Python数模笔记-NetworkX(1)图的操作
Python数模笔记-NetworkX(2)最短路径
Python数模笔记-NetworkX(3)条件最短路径
Python数模笔记-NetworkX(4)最小生成树
Python数模笔记-NetworkX(5)关键路径法


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

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

相关文章

Python小白的数学建模课-01.新手必读

Python 完全可以满足数学建模的需要。 Python 是数学建模的最佳选择之一&#xff0c;而且在其它工作中也无所不能。 『Python小白的数学建模课 Youcans』 带你从数模小白成为国赛达人。 欢迎关注『Python小白的数学建模课 Youcans』系列&#xff0c;每周持续更新 Python小白…

Python的数学建模课-02.数据导入

数据导入是所有数模编程的第一步&#xff0c;比你想象的更重要。 先要学会一种未必最佳&#xff0c;但是通用、安全、简单、好学的方法。 『Python小白的数学建模课 Youcans』 带你从数模小白成为国赛达人。 1. 数据导入是所有数模编程的第一步 编程求解一个数模问题&#…

UFIDL稀疏自编码代码实现及解释

UFIDL稀疏自编码代码实现及解释 1.今天我们来讲一下UFIDL的第一个练习。 1.我们来看看最难的一个.m文件 %% ---------- YOUR CODE HERE -------------------------------------- % Instructions: Compute the cost/optimization objective J_sparse(W,b) for the Sparse Aut…

Python小白的数学建模课-A2.2021年数维杯C题(运动会优化比赛模式探索)探讨

关注收藏&#xff0c;国赛再会。 运动会优化比赛模式问题&#xff0c;是公平分配问题。 『Python小白的数学建模课 Youcans』带你从数模小白成为国赛达人。 2021第六届数维杯大学生数学建模 赛题已于5月27日公布&#xff0c;C题是"运动会优化比赛模式探索"。本文对…

Python小白的数学建模课-03.线性规划

线性规划是很多数模培训讲的第一个算法&#xff0c;算法很简单&#xff0c;思想很深刻。 要通过线性规划问题&#xff0c;理解如何学习数学建模、如何选择编程算法。 『Python小白的数学建模课 Youcans』带你从数模小白成为国赛达人。 1. 求解方法、算法和编程方案 线性规…

Python小白的数学建模课-A1.国赛赛题类型分析

分析赛题类型&#xff0c;才能有的放矢。 评论区留下邮箱地址&#xff0c;送你国奖论文分析 『Python小白的数学建模课 Youcans』 带你从数模小白成为国赛达人。 1. 数模竞赛国赛 A题类型分析 年份题目要求方法2020A炉温曲线建立温度模型&#xff0c;计算炉温曲线&#xff…

白话(whitening)

白化 Contents [hide]1 介绍2 2D 的例子3 ZCA白化4 正则化5 中英文对照6 中文译者 介绍 我们已经了解了如何使用PCA降低数据维度。在一些算法中还需要一个与之相关的预处理步骤&#xff0c;这个预处理过程称为白化&#xff08;一些文献中也叫sphering&#xff09;。举例来说&…

Python小白的数学建模课-04.整数规划

整数规划与线性规划的差别只是变量的整数约束。 问题区别一点点&#xff0c;难度相差千万里。 选择简单通用的编程方案&#xff0c;让求解器去处理吧。 『Python小白的数学建模课 Youcans』带你从数模小白成为国赛达人。 1. 从线性规划到整数规划 1.1 为什么会有整数规划&…

实现主成分分析和白化

实现主成分分析和白化 在这一节里&#xff0c;我们将总结PCA, PCA白化和ZCA白化算法&#xff0c;并描述如何使用高效的线性代数库来实现它们。 首先&#xff0c;我们需要确保数据的均值&#xff08;近似&#xff09;为零。对于自然图像&#xff0c;我们通过减去每个图像块(patc…

Python小白的数学建模课-05.0-1规划

0-1 规划不仅是数模竞赛中的常见题型&#xff0c;也具有重要的现实意义。 双十一促销中网购平台要求二选一&#xff0c;就是互斥的决策问题&#xff0c;可以用 0-1规划建模。 小白学习 0-1 规划&#xff0c;首先要学会识别 0-1规划&#xff0c;学习将问题转化为数学模型。 『…

mac下一些终端命令的使用

mac基础终端命令入门作为一名编程人员&#xff0c;&#xff08;叫程序猿显得屌丝&#xff0c;叫攻城狮感觉还达不到&#xff09;&#xff0c;我经常看到许多大神在终端里面进行一些神操作。鉴于此&#xff0c;我今天就百度了一下&#xff0c;别问我为什么不Google&#xff0c;穷…

Python小白的数学建模课-06.固定费用问题

Python 实例介绍固定费用问题的建模与求解。 学习 PuLP工具包中处理复杂问题的快捷使用方式。 『Python小白的数学建模课 Youcans』带你从数模小白成为国赛达人。 前文讲到几种典型的 0-1 规划问题&#xff0c;给出了 PuLP 求解的案例。由于 0-1 规划问题种类很多&#xff0…

Python小白的数学建模课-07.选址问题

选址问题是要选择设施位置使目标达到最优&#xff0c;是数模竞赛中的常见题型。 小白不一定要掌握所有的选址问题&#xff0c;但要能判断是哪一类问题&#xff0c;用哪个模型。 进一步学习 PuLP工具包中处理复杂问题的字典格式快捷建模方法。 欢迎关注『Python小白的数学建模…

Python小白的数学建模课-09.微分方程模型

小白往往听到微分方程就觉得害怕&#xff0c;其实数学建模中的微分方程模型不仅没那么复杂&#xff0c;而且很容易写出高水平的数模论文。 本文介绍微分方程模型的建模与求解&#xff0c;通过常微分方程、常微分方程组、高阶常微分方程 3个案例手把手教你搞定微分方程。 通过…

Python小白的数学建模课-B2. 新冠疫情 SI模型

传染病的数学模型是数学建模中的典型问题&#xff0c;常见的传染病模型有 SI、SIR、SIRS、SEIR 模型。 SI 模型是最简单的传染病模型&#xff0c;适用于只有易感者和患病者两类人群。 我们就从 SI 模型开始吧&#xff0c;从模型、例程、运行结果到模型分析&#xff0c;全都在…

Python小白的数学建模课-B3. 新冠疫情 SIS模型

传染病的数学模型是数学建模中的典型问题&#xff0c;常见的传染病模型有 SI、SIR、SIRS、SEIR 模型。 SIS 模型型将人群分为 S 类和 I 类&#xff0c;考虑患病者可以治愈而变成易感者&#xff0c;但不考虑免疫期。 本文详细给出了 SIS 模型的建模、例程、运行结果和模型分析…

html里面Meta标签的使用

HTML meta标签使用 先上思维导图&#xff0c;接下来在是文章内容。一、meta标签的组成 meta标签共有两个属性&#xff0c;它们分别是http-equiv属性和name属性&#xff0c;不同的属性又有不同的参数值&#xff0c;这些不同的参数值就实现了不同的网页功能。 1、name属性 name属…

Python小白的数学建模课-B4. 新冠疫情 SIR模型

传染病的数学模型是数学建模中的典型问题&#xff0c;常见的传染病模型有 SI、SIR、SIRS、SEIR 模型。 SIR 模型将人群分为易感者&#xff08;S类&#xff09;、患病者&#xff08;I类&#xff09;和康复者&#xff08;R 类&#xff09;&#xff0c;考虑了患病者治愈后的免疫能…

Python小白的数学建模课-B5. 新冠疫情 SEIR模型

传染病的数学模型是数学建模中的典型问题&#xff0c;常见的传染病模型有 SI、SIR、SIRS、SEIR 模型。 考虑存在易感者、暴露者、患病者和康复者四类人群&#xff0c;适用于具有潜伏期、治愈后获得终身免疫的传染病。 本文详细给出了 SEIR 模型微分方程的建模、例程、结果和分…