Example03 / 14
三种免疫策略的比较
在 BA 网络上接种 10% 的节点(接种者从网络中删除),比较三种策略后的流行风险: 随机免疫、目标免疫(度最高者)、熟人免疫(随机选人,再接种其随机邻居)。 用剩余网络的阈值 T_c 和巨连通分支比例来衡量,并与上一示例中的传播性 T≈0.149 比较。 解读:随机免疫后 T_c 仍低于 T;目标免疫和熟人免疫都把 T_c 提到 T 以上(目标免疫提升最多)。 接种 10% 时巨分支比例下降有限,三种策略的差别主要体现在剩余网络的阈值上。
Output输出图

Output文字输出
随机免疫: 剩余网络 T_c = 0.087, 巨分支比例 = 0.900 目标免疫: 剩余网络 T_c = 0.363, 巨分支比例 = 0.848 熟人免疫: 剩余网络 T_c = 0.153, 巨分支比例 = 0.890
Code代码
# 在 BA 网络上接种 10% 的节点(接种者从网络中删除),比较三种策略后的流行风险:
# 随机免疫、目标免疫(度最高者)、熟人免疫(随机选人,再接种其随机邻居)。
# 用剩余网络的阈值 T_c 和巨连通分支比例来衡量,并与上一示例中的传播性 T≈0.149 比较。
# 解读:随机免疫后 T_c 仍低于 T;目标免疫和熟人免疫都把 T_c 提到 T 以上(目标免疫提升最多)。
# 接种 10% 时巨分支比例下降有限,三种策略的差别主要体现在剩余网络的阈值上。
import numpy as np
import networkx as nx
N, m = 1000, 3
G = nx.barabasi_albert_graph(N, m, seed=1)
rng = np.random.default_rng(1)
n_vac = int(0.1 * N)
def evaluate(G, removed):
H = G.copy()
H.remove_nodes_from(removed)
k = np.array([d for _, d in H.degree()], dtype=float)
Tc = k.mean() / ((k**2).mean() - k.mean())
giant = max(len(c) for c in nx.connected_components(H)) / G.number_of_nodes()
return Tc, giant
random_set = list(rng.choice(N, n_vac, replace=False))
target_set = [v for v, _ in sorted(G.degree(), key=lambda x: -x[1])[:n_vac]]
# 熟人免疫:反复随机选节点 u,再从其邻居中随机选一个加入接种集合,直到凑满 n_vac 个
acq = set()
while len(acq) < n_vac:
u = int(rng.integers(N))
nb = list(G.neighbors(u))
acq.add(nb[rng.integers(len(nb))])
acq_set = list(acq)
res = {}
for name, S in [("随机", random_set), ("目标", target_set), ("熟人", acq_set)]:
Tc, giant = evaluate(G, S)
res[name] = (Tc, giant)
print("%s免疫: 剩余网络 T_c = %.3f, 巨分支比例 = %.3f" % (name, Tc, giant))
import matplotlib.pyplot as plt
labels = ["random", "targeted", "acquaintance"]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
ax1.bar(labels, [v[0] for v in res.values()], color=["0.6", "tab:blue", "tab:green"], width=0.55)
ax1.axhline(0.149, ls="--", c="tab:red", label="transmissibility T = 0.149")
ax1.set_ylabel("T_c of remaining network"); ax1.legend(); ax1.set_title("Threshold after 10% vaccinated")
ax2.bar(labels, [v[1] for v in res.values()], color=["0.6", "tab:blue", "tab:green"], width=0.55)
ax2.set_ylim(0, 1); ax2.set_ylabel("giant component / N"); ax2.set_title("Giant component barely changes")
plt.tight_layout(); plt.show()Run在浏览器中运行
首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。