复杂网络 SIS 疾病传播模型Python 模拟与 R0 阈值分析疾病传播模型是理解流行病学动态的重要工具。在复杂网络背景下SIS易感-感染-易感模型能够揭示网络拓扑结构如何影响传播过程。本文将深入探讨三种典型网络结构ER随机网络、WS小世界网络、BA无标度网络上的SIS传播行为并提供完整的Python实现方案。1. 复杂网络与疾病传播基础复杂网络由大量相互连接的节点组成其拓扑特性直接影响传播动力学。理解网络结构特征对于预测和控制疾病传播至关重要。1.1 网络拓扑的关键指标度分布节点连接数的概率分布决定网络异质性集聚系数衡量节点邻居间的连接紧密程度平均路径长度网络中任意两节点间最短路径的平均值import networkx as nx def calculate_network_properties(G): degree_sequence [d for n, d in G.degree()] avg_degree sum(degree_sequence)/len(degree_sequence) clustering nx.average_clustering(G) path_length nx.average_shortest_path_length(G) return avg_degree, clustering, path_length1.2 SIS模型核心参数SIS模型包含两个关键参数感染率(β)易感节点被感染的概率恢复率(γ)感染节点恢复为易感状态的概率基本再生数R0β/γ决定疾病传播阈值。当R01时疾病可能在网络中持续存在当R01时疾病最终消亡。2. 三种网络结构的构建与特性对比不同网络生成模型产生具有独特拓扑特征的网络结构直接影响疾病传播动态。2.1 ER随机网络构建def create_er_network(N, p): 创建ER随机网络 :param N: 节点数量 :param p: 连接概率 :return: networkx图对象 G nx.erdos_renyi_graph(N, p) while not nx.is_connected(G): # 确保网络连通 G nx.erdos_renyi_graph(N, p) return GER网络特性度分布近似泊松分布低集聚系数短平均路径长度2.2 WS小世界网络构建def create_ws_network(N, k, p): 创建WS小世界网络 :param N: 节点数量 :param k: 初始每个节点的邻居数 :param p: 重连概率 :return: networkx图对象 G nx.watts_strogatz_graph(N, k, p) while not nx.is_connected(G): G nx.watts_strogatz_graph(N, k, p) return GWS网络特性高集聚系数短平均路径长度度分布相对均匀2.3 BA无标度网络构建def create_ba_network(N, m): 创建BA无标度网络 :param N: 节点数量 :param m: 新节点连接的边数 :return: networkx图对象 G nx.barabasi_albert_graph(N, m) return G # BA网络通常是连通的BA网络特性幂律度分布存在高度连接的集散节点低集聚系数2.4 网络特性对比实验N 1000 # 节点数量 er_p 0.01 # ER网络连接概率 ws_k, ws_p 10, 0.1 # WS网络参数 ba_m 5 # BA网络参数 er_net create_er_network(N, er_p) ws_net create_ws_network(N, ws_k, ws_p) ba_net create_ba_network(N, ba_m) # 计算网络特性 er_props calculate_network_properties(er_net) ws_props calculate_network_properties(ws_net) ba_props calculate_network_properties(ba_net)网络特性对比表网络类型平均度集聚系数平均路径长度ER随机网络10.020.00983.21WS小世界网络10.00.4824.15BA无标度网络9.960.0323.563. SIS传播模型的Python实现3.1 离散时间步模拟算法import numpy as np import random def sis_simulation(G, beta, gamma, T, initial_infected0.1): SIS模型离散时间步模拟 :param G: 网络图 :param beta: 感染率 :param gamma: 恢复率 :param T: 模拟步数 :param initial_infected: 初始感染比例 :return: 感染密度时间序列 N G.number_of_nodes() nodes list(G.nodes()) # 初始化状态0易感1感染 state np.zeros(N, dtypeint) infected random.sample(nodes, int(N*initial_infected)) state[infected] 1 rho [np.mean(state)] # 记录感染密度 for t in range(T): new_state state.copy() # 感染过程 for i in np.where(state 1)[0]: neighbors list(G.neighbors(i)) for j in neighbors: if state[j] 0 and random.random() beta: new_state[j] 1 # 恢复过程 for i in np.where(state 1)[0]: if random.random() gamma: new_state[i] 0 state new_state rho.append(np.mean(state)) return rho3.2 多参数扫描与结果可视化import matplotlib.pyplot as plt def run_parameter_sweep(network, network_name, beta_range, gamma): plt.figure(figsize(10, 6)) for beta in beta_range: rho sis_simulation(network, beta, gamma, T100) plt.plot(rho, labelfβ{beta:.2f}, R0{beta/gamma:.2f}) plt.title(fSIS模型在{network_name}上的传播动态) plt.xlabel(时间步) plt.ylabel(感染密度ρ(t)) plt.legend() plt.grid(True) plt.show() # 参数设置 beta_range np.linspace(0.1, 0.5, 5) gamma 0.2 # 在不同网络上运行模拟 run_parameter_sweep(er_net, ER随机网络, beta_range, gamma) run_parameter_sweep(ws_net, WS小世界网络, beta_range, gamma) run_parameter_sweep(ba_net, BA无标度网络, beta_range, gamma)4. R0阈值分析与网络结构影响4.1 理论传播阈值计算在均匀混合假设下传播阈值满足R0_c / (k² - )其中 为平均度k²为二阶矩。def calculate_threshold(G): degrees [d for n, d in G.degree()] k np.mean(degrees) k2 np.mean(np.array(degrees)**2) return k / (k2 - k) er_threshold calculate_threshold(er_net) ws_threshold calculate_threshold(ws_net) ba_threshold calculate_threshold(ba_net)4.2 数值模拟验证阈值def find_empirical_threshold(network, gamma, beta_min0.01, beta_max1.0, steps20): beta_values np.linspace(beta_min, beta_max, steps) steady_states [] for beta in beta_values: rho sis_simulation(network, beta, gamma, T200) steady_state np.mean(rho[-50:]) # 取最后50步的平均 steady_states.append(steady_state) # 寻找阈值点 for i in range(1, len(steady_states)): if steady_states[i] 0.05: # 感染密度超过5%认为有传播 return beta_values[i]/gamma return beta_max/gamma # 未找到明显阈值 empirical_er find_empirical_threshold(er_net, gamma) empirical_ws find_empirical_threshold(ws_net, gamma) empirical_ba find_empirical_threshold(ba_net, gamma)4.3 网络结构对传播的影响ER随机网络传播阈值接近理论预测均匀传播模式感染密度与R0呈线性关系WS小世界网络较高集聚系数促进局部传播短路径长度加速全局传播阈值行为与ER网络类似但传播更快BA无标度网络理论上传播阈值为0因k²→∞集散节点成为超级传播者低感染率下仍可维持传播# 比较不同网络的传播动态 def compare_networks(beta, gamma, T200): er_rho sis_simulation(er_net, beta, gamma, T) ws_rho sis_simulation(ws_net, beta, gamma, T) ba_rho sis_simulation(ba_net, beta, gamma, T) plt.figure(figsize(10, 6)) plt.plot(er_rho, labelER随机网络) plt.plot(ws_rho, labelWS小世界网络) plt.plot(ba_rho, labelBA无标度网络) plt.title(不同网络结构下的SIS传播动态比较) plt.xlabel(时间步) plt.ylabel(感染密度ρ(t)) plt.legend() plt.grid(True) plt.show() compare_networks(beta0.3, gamma0.2)5. 高级分析与优化策略5.1 免疫策略效果评估针对不同网络结构评估三种常见免疫策略随机免疫随机选择节点进行免疫目标免疫针对高度节点进行免疫熟人免疫随机选择节点然后免疫其一个邻居def apply_immunization(G, strategy, fraction): 应用免疫策略 :param G: 网络图 :param strategy: 免疫策略 (random, targeted, acquaintance) :param fraction: 免疫比例 :return: 免疫后的网络免疫节点被移除 N G.number_of_nodes() num_immunize int(N * fraction) if strategy random: immunized random.sample(list(G.nodes()), num_immunize) elif strategy targeted: degrees [(n, d) for n, d in G.degree()] degrees.sort(keylambda x: x[1], reverseTrue) immunized [n for n, d in degrees[:num_immunize]] else: # acquaintance immunized set() while len(immunized) num_immunize: node random.choice(list(G.nodes())) neighbors list(G.neighbors(node)) if neighbors: immunized.add(random.choice(neighbors)) immunized list(immunized)[:num_immunize] H G.copy() H.remove_nodes_from(immunized) return H def evaluate_immunization(strategies, fractions, beta, gamma): results {} for net_name, G in [(ER, er_net), (WS, ws_net), (BA, ba_net)]: results[net_name] {} for strategy in strategies: results[net_name][strategy] [] for frac in fractions: H apply_immunization(G, strategy, frac) if H.number_of_nodes() 0: results[net_name][strategy].append(0) continue rho sis_simulation(H, beta, gamma, T100) results[net_name][strategy].append(np.mean(rho[-20:])) return results5.2 免疫效果可视化strategies [random, targeted, acquaintance] fractions np.linspace(0, 0.5, 6) immun_results evaluate_immunization(strategies, fractions, beta0.4, gamma0.2) plt.figure(figsize(15, 5)) for i, net_name in enumerate([ER, WS, BA]): plt.subplot(1, 3, i1) for strategy in strategies: plt.plot(fractions, immun_results[net_name][strategy], markero, labelstrategy) plt.title(f{net_name}网络免疫效果) plt.xlabel(免疫比例) plt.ylabel(稳态感染密度) plt.legend() plt.grid(True) plt.tight_layout() plt.show()5.3 多网络并行模拟优化对于大规模网络模拟可采用并行计算加速from multiprocessing import Pool def parallel_sis(args): G, beta, gamma, T args return sis_simulation(G, beta, gamma, T) def run_parallel_simulations(networks, beta_values, gamma, T, processes4): tasks [(net, beta, gamma, T) for net in networks for beta in beta_values] with Pool(processes) as pool: results pool.map(parallel_sis, tasks) # 重组结果 output {} idx 0 for net in networks: output[net] {} for beta in beta_values: output[net][beta] results[idx] idx 1 return output