生物医学网络科学Biomedical Network Science
Example03 / 09

无标度网络的随机失效阈值与攻击阈值(连续度近似)

所属专题
网络鲁棒性、渗流与级联失效
下载
Notebook · .py

随机失效:f_c = 1 - 1/(kappa - 1),kappa = <k^2>/ 用截断幂律 [k_min, k_max] 的连续近似计算,k_max = k_min N^{1/(gamma-1)}。 攻击(Cohen 等 2001):f_c 满足 f^{(2-g)/(1-g)} = 2 + (2-g)/(3-g) * k_min * (f^{(3-g)/(1-g)} - 1),用 brentq 求根。 解读:gamma<3 时随机失效阈值随 N 增大逼近 1;攻击阈值只有百分之几到二十几,且随 gamma 非单调变化 (k_min=1 时约在 gamma≈2.3 处取极大值 0.06 左右)。连续度近似对小 k_min 只是粗略估计,应以模拟核对。

Output输出图

无标度网络的随机失效阈值与攻击阈值(连续度近似):输出图 1

Output文字输出

gamma   f_c随机(N=1e4)  f_c随机(N=1e6)  f_c攻击(k_min=1)  f_c攻击(k_min=2)
2.1     0.999           1.000           0.0471            0.1047
2.3     0.993           0.999           0.0629            0.1755
2.5     0.976           0.995           0.0557            0.2010
2.7     0.946           0.979           0.0434            0.2114
2.9     0.904           0.945           0.0309            0.2149
3.5     0.754           0.784           0.0051            0.2102

Code代码

# 随机失效:f_c = 1 - 1/(kappa - 1),kappa = <k^2>/<k> 用截断幂律 [k_min, k_max] 的连续近似计算,k_max = k_min N^{1/(gamma-1)}。
# 攻击(Cohen 等 2001):f_c 满足 f^{(2-g)/(1-g)} = 2 + (2-g)/(3-g) * k_min * (f^{(3-g)/(1-g)} - 1),用 brentq 求根。
# 解读:gamma<3 时随机失效阈值随 N 增大逼近 1;攻击阈值只有百分之几到二十几,且随 gamma 非单调变化
# (k_min=1 时约在 gamma≈2.3 处取极大值 0.06 左右)。连续度近似对小 k_min 只是粗略估计,应以模拟核对。
import numpy as np
from scipy.optimize import brentq

def kappa(g, kmin, kmax):
    m1 = (kmax ** (2 - g) - kmin ** (2 - g)) / (2 - g)
    m2 = (kmax ** (3 - g) - kmin ** (3 - g)) / (3 - g)
    return m2 / m1

def fc_random(g, kmin, N):
    kmax = kmin * N ** (1 / (g - 1))
    return 1 - 1 / (kappa(g, kmin, kmax) - 1)

def fc_attack(g, kmin):
    F = lambda f: f ** ((2 - g) / (1 - g)) - 2 - (2 - g) / (3 - g) * kmin * (f ** ((3 - g) / (1 - g)) - 1)
    grid = np.logspace(-6, -0.001, 4000)
    vals = [F(f) for f in grid]
    for a, b, va, vb in zip(grid[:-1], grid[1:], vals[:-1], vals[1:]):
        if va * vb < 0:
            return brentq(F, a, b)
    return np.nan

print("gamma   f_c随机(N=1e4)  f_c随机(N=1e6)  f_c攻击(k_min=1)  f_c攻击(k_min=2)")
for g in [2.1, 2.3, 2.5, 2.7, 2.9, 3.5]:
    print("%.1f     %.3f           %.3f           %.4f            %.4f" % (
        g, fc_random(g, 2, 1e4), fc_random(g, 2, 1e6), fc_attack(g, 1), fc_attack(g, 2)))

import matplotlib.pyplot as plt
gs = np.linspace(2.05, 3.5, 20)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
ax1.plot(gs, [fc_random(g, 2, 1e4) for g in gs], "o-", ms=4, label="N = 1e4")
ax1.plot(gs, [fc_random(g, 2, 1e6) for g in gs], "s--", ms=4, label="N = 1e6")
ax1.set_xlabel("degree exponent gamma"); ax1.set_ylabel("critical fraction f_c"); ax1.legend()
ax1.set_title("Random failure (k_min = 2)")
ax2.plot(gs, [fc_attack(g, 1) for g in gs], "o-", ms=4, label="k_min = 1")
ax2.plot(gs, [fc_attack(g, 2) for g in gs], "s--", ms=4, label="k_min = 2")
ax2.set_xlabel("degree exponent gamma"); ax2.set_ylabel("critical fraction f_c"); ax2.legend()
ax2.set_title("Targeted attack: only a few percent")
plt.tight_layout(); plt.show()

Run在浏览器中运行

首次加载 Python 环境约需 20–40 秒;可以修改参数后重新运行。

无标度网络的随机失效阈值与攻击阈值(连续度近似)