Python数模笔记-NetworkX(3)条件最短路径


1、带有条件约束的最短路径问题

最短路径问题是图论中求两个顶点之间的最短路径问题,通常是求最短加权路径。

条件最短路径,指带有约束条件、限制条件的最短路径。例如,顶点约束,包括必经点或禁止点的限制;边的约束,包括必经路段或禁止路段;还包括无权路径长度的限制,即经过几步到达终点。进一步地,还有双目标限制的最短路径问题,求最短距离中花费最小的路线;交通限制条件下的最短路径问题,需要考虑转向限制和延误的约束。

求解带有限制条件的最短路径问题,总体来说可以分为两类基本方法:一类是基于不带限制条件的最短路径算法,对求解过程中的每一条有效路径,都用限制条件进行判断,如果满足所有限制条件则继续,如果不满足限制条件则放弃该路径;另一类方法是基于具体问题和选择算法的特点,将问题转化为有约束的规划问题来处理。

但是,如果使用 NetworkX 求解带有限制条件的最短路径问题,采用这两类方法都会有一些困难。原因在于前文所介绍的 NetworkX 提供的 Dijkstra 算法、Bellman-Ford 算法、Floyd 算法和启发式算法 A* 都是封装函数,没有提供设置约束条件的选项和接口,因此用户不能把条件判断语句加入这些封装函数的程序内部。这种问题不仅存在于 Python 语言的 Network 工具包,对于其它计算机语言的工具包也是类似的:自己编程序费时费力,但可以根据需要修改和扩展;直接调用工具包的算法函数非常方便,但不能进行修改或扩展。

不过,NetworkX 可以生成两个顶点之间的所有简单路径,而且可以获得所有简单路径的边的列表。利用简单路径算法,可以通过对约束条件的判断来求解带有顶点约束和边约束的最短路径问题。

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

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


2、问题案例:蚂蚁的最优路径分析

蚁巢有若干个储藏间(图中圆圈表示),储藏间之间有路径相连(路径拓扑结构如图所示)。该图为无向图,路径通行的花费如图中线路上的数字所示,路径正反方向通行的花费相同。要求从起点 N0 到终点 N17 的最优路径,并需要满足限制条件:

  • 需要尽可能以最少的花费到达终点;
  • 必须经过图中的绿色节点;
  • 必须经过图中的两段绿色路段;
  • 必须避开图中的红色路段。

说明:本案例出自西安邮电大学第12届数学建模竞赛赛题,本文进行了改编。


3、NetworkX 求解带有条件约束的最短路径问题

3.1 图的创建和可视化

Python 例程(NetworkX)

# networkX_E3.py
# Demo of shortest path with NetworkX
# Copyright 2021 YouCans, XUPT
# Crated:2021-05-20import matplotlib.pyplot as plt # 导入 Matplotlib 工具包
import networkx as nx  # 导入 NetworkX 工具包# 问题 1:蚂蚁的最优路径分析(西安邮电大学第12届数学建模竞赛B题)gAnt = nx.Graph()  # 创建:空的 无向图
gAnt.add_weighted_edges_from([(0,1,3),(0,2,1),(0,3,1),(1,2,1),(1,4,1),(1,9,4),(2,3,1),(2,4,2),(2,5,1),(3,5,2),(3,6,2),(3,7,1),(4,5,1),(4,9,1),(5,6,1),(5,9,3),(5,10,1),(5,12,3),(6,7,1),(6,8,2),(6,12,2),(6,13,4),(6,14,3),(7,8,1),(8,14,1),(8,15,3),(9,10,1),(9,11,1),(10,11,1),(10,12,2),(11,12,1),(11,16,1),(12,13,2),(12,16,1),(13,14,1),(13,15,2),(13,16,2),(13,17,1),(14,15,1),(15,17,4),(16,17,1)])  # 向图中添加多条赋权边: (node1,node2,weight)pos={0:(1,8),1:(4,12),2:(4,9),3:(4,6),4:(8,11),5:(9,8),  # 指定顶点位置6:(11,6),7:(8,4),8:(12,2),9:(12,13),10:(15,11),11:(18,13),12:(19,9),13:(22,6),14:(18,4),15:(21,2),16:(22,11),17:(28,8)}
nx.draw(gAnt, pos, with_labels=True, alpha=0.8)
labels = nx.get_edge_attributes(gAnt,'weight')
nx.draw_networkx_edge_labels(gAnt,pos,edge_labels=labels, font_color='c') # 显示权值
nx.draw_networkx_nodes(gAnt,pos,nodelist=[0,17],node_color='yellow')  # 设置顶点颜色
nx.draw_networkx_nodes(gAnt,pos,nodelist=[7,12],node_color='lime')  # 设置顶点颜色
nx.draw_networkx_edges(gAnt,pos,edgelist=[(2,4),(13,14)],edge_color='lime',width=2.5)  # 设置边的颜色
nx.draw_networkx_edges(gAnt,pos,edgelist=[(11,12)],edge_color='r',width=2.5)  # 设置边的颜色
plt.show()

运行结果

本段程序绘制网络图,包括顶点、边、边的权值,特殊顶点和特殊边的颜色设置。

在这里插入图片描述

程序说明

  1. 图的创建。本例使用 nx.Graph() 创建无向图,然后用 gAnt.add_weighted_edges_from() 函数以列表向图中添加多条赋权边,每个赋权边以元组 (node1,node2,weight) 表示。
  2. 图的绘制。使用nx.draw()绘图时,默认的节点位置并不理想,可以使用 pos 属性参数指定节点位置。pos 为字典数据类型,按 node:(x_pos,y_pos) 格式设置节点位置。
  3. 显示边的权值。使用 nx.draw_networkx_edge_labels() 可以绘制边的属性,本例中选择显示权值属性。
  4. 设置顶点属性。nx.draw_networkx_nodes() 可以设置顶点的属性,例如对 nodelist 列表中的节点设置颜色属性 node_color。
  5. 设置边的属性。nx.draw_networkx_edges() 可以设置边的属性,例如对 edgelist 列表中的边设置线宽属性 width 和颜色属性 edge_color。

3.2 无限制条件的最短路径

程序说明

  1. 对于无限制条件的最短路径问题,NetworkX 提供了 Dijkstra 算法、Bellman-Ford 算法、Floyd 算法和启发式算法 A* 的函数。
  2. 例程使用 nx.dijkstra_path() 和 nx.dijkstra_path_length() 调用 Dijkstra 算法求两个指定顶点之间的最短加权路径和最短加权路径长度。

Python 例程(NetworkX)

# 两个指定顶点之间的最短加权路径
minWPath1 = nx.dijkstra_path(gAnt, source=0, target=17)  # 顶点 0 到 顶点 17 的最短加权路径
# 两个指定顶点之间的最短加权路径的长度
lMinWPath1 = nx.dijkstra_path_length(gAnt, source=0, target=17)  #最短加权路径长度
print("\n问题1: 无限制条件")
print("S 到 E 的最短加权路径: ", minWPath1)
print("S 到 E 的最短加权路径长度: ", lMinWPath1)

运行结果

问题1: 无限制条件
S 到 E 的最短加权路径:  [0, 2, 5, 10, 11, 16, 17]
S 到 E 的最短加权路径长度:  6

3.3 限制条件:禁止点或禁止边

程序说明

  1. 禁止点或者禁止边的处理比较简单,从图中删除对应的禁止顶点或禁止边即可。当然,在创建图时就不添加这些顶点和边更简单,但这样在绘图时也无法反映这些顶点和边。
  2. 使用 remove_node(n) 删除指定顶点 n,remove_edge(u,v) 删除指定的边 (u,v)。
  3. 使用 remove_nodes_from([n1,…nk]) 删除多个顶点,remove_edges_from([(u1,v1),…(uk,vk)]) 删除多条边。
  4. 例程中删除的点和边与案例问题中的要求不一致,是为了示例删除函数的使用。下同。

Python 例程

# 2. 限制条件:禁止点或禁止边
# 解决方案:从图中删除禁止顶点或禁止边
gAnt.remove_nodes_from([5])  # 通过顶点标签 5 删除顶点
gAnt.remove_edge(13,17)  # 删除边 (13,17)
minWPath2 = nx.dijkstra_path(gAnt, source=0, target=17)  # 顶点 0 到 顶点 17 的最短加权路径
lMinWPath2 = nx.dijkstra_path_length(gAnt, source=0, target=17)  #最短加权路径长度
print("\n问题2: 禁止点或禁止边的约束")
print("S 到 E 的最短加权路径: ", minWPath2)
print("S 到 E 的最短加权路径长度: ", lMinWPath2)

运行结果

问题2: 禁止点或禁止边的约束
S 到 E 的最短加权路径:  [0, 3, 6, 12, 16, 17]
S 到 E 的最短加权路径长度:  7

3.4 限制条件:一个必经点

程序说明

  1. 当限制条件为一个必经点时,可以把原问题分解为两个子问题:子问题 1 为起点至必经点,子问题 2 为必经点至终点。
  2. 对两个子问题分别用 Dijkstra 算法求最短加权路径和最短加权路径长度,然后进行合并,就得到经过必经点的原问题的最短加权路径和最短加权路径长度。

Python 例程

# 3. 限制条件:一个必经点
# 解决方案:分解为两个问题,问题 1 为起点N0至必经点N6,问题 2 为必经点N6至终点N17
minWPath3a = nx.dijkstra_path(gAnt, source=0, target=6)  # N0 到 N6 的最短加权路径
lMinWPath3a = nx.dijkstra_path_length(gAnt, source=0, target=6)  # 最短加权路径长度
minWPath3b = nx.dijkstra_path(gAnt, source=6, target=17)  # N6 到 N17 的最短加权路径
lMinWPath3b = nx.dijkstra_path_length(gAnt, source=6, target=17)  # 最短加权路径长度
minWPath3a.extend(minWPath3b[1:]) # 拼接 minWPath3a、minWPath3b 并去重 N7
print("\n问题3: 一个必经点的约束")
print("S 到 E 的最短加权路径: ", minWPath3a)
print("S 到 E 的最短加权路径长度: ", lMinWPath3a+lMinWPath3b)

运行结果

问题3: 一个必经点的约束
S 到 E 的最短加权路径:  [0, 3, 6, 12, 16, 17]
S 到 E 的最短加权路径长度:  7

3.5 限制条件:多个必经点(方案一)

程序说明

  1. 当限制条件为两个或多个必经点时,起点、终点与各必经点的次序并不确定,即从起点出发就不知道应该先去哪一个必经点,因此不宜再用分段求最小路径的方法处理。
  2. NetworkX 提供了 all_simple_paths() 函数,可以生成两个顶点之间的所有简单路径。利用简单路径算法,可以通过对约束条件的判断来求解带有多个顶点约束的最短路径问题。
  3. 程序实现的步骤包括:(1)遍历起点为0、终点为17的简单路径;(2)检查路径是否满足包括顶点 N7、N15 的限制条件;(3)在满足限制条件的简单路径中找加权长度最短的路径;(4)求最短路径的加权路径长度。
  4. 本段例程非常简练,综合使用了几种 Python 语言循环、判断结构的简洁写法,需要逐步分析。

Python 例程

# 4. 限制条件:多个必经点 (N7,N15)
# 解决方案:遍历从起点到终点的简单路径,求满足必经点条件的最短路径
minWPath4 = min([path  # 返回 key 为最小值的 pathfor path in nx.all_simple_paths(gAnt, 0, 17)  # gAnt 中所有起点为0、终点为17的简单路径if all(n in path for n in (7, 15))], # 满足路径中包括顶点 N7,N15key=lambda x: sum(gAnt.edges[edge]['weight'] for edge in nx.utils.pairwise(x))) # key 为加权路径长度
lenPath = sum(gAnt.edges[edge]['weight'] for edge in nx.utils.pairwise(minWPath4))  # 求指定路径的加权路径长度
print("\n问题4: 多个必经点的约束")
print("S 到 E 的最短加权路径: ", minWPath4)
print("S 到 E 的最短加权路径长度: ", lenPath)

运行结果

问题4: 多个必经点的约束
S 到 E 的最短加权路径:  [0, 3, 7, 8, 14, 15, 13, 17]
S 到 E 的最短加权路径长度:  8

3.6 限制条件:多个必经点(方案二)

程序说明

  1. 本例与 3.5 的问题实际上是相同的。限制条件都是多个必经顶点 N7、N15,解决方案都是使用 all_simple_paths() 函数生成两个顶点间的所有简单路径,程序实现的步骤也是类似的。
  2. 本方案按照典型的循环、判断结构的写法,便于阅读和理解。此外,如果还有其它约束条件或子任务需要在循环中处理,这样的结构更容易实现。

Python 例程

# 5. 限制条件:多个必经点 (N7,N15)
# 解决方案:遍历从起点到终点的简单路径,求满足必经点条件的最短路径
lMinWPath5 = minWPath5 = 1e9
for path in nx.all_simple_paths(gAnt, 0, 17):if all(n in path for n in (7,15)):  # 满足路径中包括顶点 N7,N15lenPath = sum(gAnt.edges[edge]['weight'] for edge in nx.utils.pairwise(path))if lenPath < lMinWPath5:lMinWPath5 = lenPathminWPath5 = path
print("\n问题5: 多个必经点的约束")
print("S 到 E 的最短加权路径: ", minWPath5)
print("S 到 E 的最短加权路径长度: ", lMinWPath5)

运行结果

问题5: 多个必经点的约束
S 到 E 的最短加权路径:  [0, 3, 7, 8, 14, 15, 13, 17]
S 到 E 的最短加权路径长度:  8

3.7 限制条件:必经边

程序说明

  1. 必经点的处理,实际上还可以有更好的方法,其思想是结合 Dijkstra 算法的实现过程, 将限制条件作为缩小搜索空间的条件,可以降低算法的复杂度。但对于多个必经边来说,很难以此来改进基础的无约束算法,通常的处理方法就是在算法中增加一个判断是否满足约束条件的过程。
  2. 本例仍然延续处理多个必经点的思路,利用简单路径算法,可以通过对约束条件的判断来求解带有多个必经边约束条件的最短路径问题,可以同时处理必经点约束条件。
  3. 本例程对应案例中的各项约束条件: 必须经过图中的绿色节点;必须经过图中的两段绿色路段;必须避开图中的红色路段;尽可能以最少的花费到达终点。
  4. 本例程的框架和步骤同 3.6,这是一个遍历简单路径、判断约束条件的通用框架。
  5. all(n in path for n in (2,4,7,12,13,14)) 的作用,一是判断路径中是否包括必经点 N7、N12;二是判断路径中是否包括必经边 (2,4)、(13,14) 的各顶点,这不仅可以减小计算量,而且能确保下面使用 index() 查找顶点位置时不会发生错误。

Python 例程

# 6. 限制条件:必经边 (N2,N4), (N13,N14),必经点 N7,N12
# 解决方案:遍历从起点到终点的简单路径,求满足必经边条件的最短路径
gAnt.remove_edge(11,12)  # 禁止边 (11,12)
lMinWPath6 = minWPath6 = 1e9  # 置初值
for path in nx.all_simple_paths(gAnt, 0, 17):  # 所有起点为0、终点为17的简单路径if all(n in path for n in (2,4,7,12,13,14)): # 满足路径中包括顶点 N7,N12# 检查 (N2,N4)p1 = path.index(2)  # N2 的位置if (path[p1-1]!=4 and path[p1+1]!=4): continue  # 判断 N2~N4 是否相邻# 检查 (N13,N14)p2 = path.index(13)  # # N13 的位置if (path[p2-1]!=14 and path[p2+1]!=14): continue  # 判断 N13~N14 是否相邻lenPath = sum(gAnt.edges[edge]['weight'] for edge in nx.utils.pairwise(path))if lenPath < lMinWPath6:lMinWPath6 = lenPathminWPath6 = pathprint("\n问题6: 多个必经边、必经点的约束")
print("S 到 E 的最短加权路径: ", minWPath6)
print("S 到 E 的最短加权路径长度: ", lMinWPath6)edgeList = []
for i in range(len(minWPath6)-1):edgeList.append((minWPath6[i],minWPath6[i+1]))
nx.draw_networkx_edges(gAnt,pos,edgelist=edgeList,edge_color='m',width=4)  # 设置边的颜色
plt.show()  # YouCans, XUPT

运行结果

问题6: 多个必经边、必经点的约束
S 到 E 的最短加权路径:  [0, 2, 4, 5, 6, 7, 8, 14, 13, 12, 16, 17]
S 到 E 的最短加权路径长度:  13

在这里插入图片描述



版权说明:

本文内容及例程为作者原创,并非转载书籍或网络内容。
本文中案例问题来自:

YouCans 原创作品,如转载需标注原始链接。
Copyright 2021 YouCans, XUPT
Crated:2021-05-20


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

Python数模笔记-PuLP库(1)线性规划入门
Python数模笔记-PuLP库(2)线性规划进阶
Python数模笔记-PuLP库(3)线性规划实例
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数模笔记-NetworkX(1)图的操作
Python数模笔记-NetworkX(2)最短路径
Python数模笔记-NetworkX(3)条件最短路径
Python数模笔记-模拟退火算法(1)多变量函数优化
Python数模笔记-模拟退火算法(2)约束条件的处理
Python数模笔记-模拟退火算法(3)整数规划问题
Python数模笔记-模拟退火算法(4)旅行商问题

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

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

相关文章

简单技能之程序调试入门

简单技能之程序调试入门 黑盒测试 等价类划分

Python数模笔记-NetworkX(4)最小生成树

1、生成树和最小生成树 1.1 生成树 连通的无圈图称为树&#xff0c;就是不包含循环的回路的连通图。 对于无向连通图&#xff0c;生成树&#xff08;Spanning tree&#xff09;是原图的极小连通子图&#xff0c;它包含原图中的所有 n 个顶点&#xff0c;并且有保持图连通的最…

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

关键路径法&#xff08;Critical path method&#xff0c;CPM&#xff09;是一种计划管理方法&#xff0c;通过分析项目过程中工序进度安排寻找关键路径&#xff0c;确定最短工期&#xff0c;广泛应用于系统分析和项目管理。 1、拓扑序列与关键路径 1.1 拓扑序列 一个大型工程…

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 模型的建模、例程、运行结果和模型分析…