生物医学网络科学Biomedical Network Science
Example07 / 13

通量平衡分析(FBA)与反应敲除

所属专题
生物分子网络与拓扑特征
下载
Notebook · .py

玩具代谢网络:R1 摄取 → A(上限 10);R2 A → B;R3 A → C;R4 B + C → 生物量;R5 B → C(旁路)。 稳态约束 S v = 0,下界 0,目标为最大化生物量通量 v4,用 scipy.optimize.linprog 求解。 依次把每个反应的上界设为 0(模拟基因敲除),看最优生物量是否降为 0。 输出解读:完整网络最优 v4 = 5;敲除 R3 后因为存在旁路 R5,v4 仍为 5(R3 非必需); 敲除 R1、R2 或 R4 则生物量为 0(必需反应)。去掉旁路 R5 后,R3 也变成必需。

Output输出图

通量平衡分析(FBA)与反应敲除:输出图 1

Output文字输出

完整网络:最优生物量 = 5.0 ,通量 = {'R1_uptake': np.float64(10.0), 'R2_A→B': np.float64(5.0), 'R3_A→C': np.float64(5.0), 'R4_biomass': np.float64(5.0), 'R5_B→C': np.float64(0.0)}
  敲除 R1_uptake    → 生物量 = -0.00
  敲除 R2_A→B       → 生物量 = -0.00
  敲除 R3_A→C       → 生物量 = 5.00
  敲除 R4_biomass   → 生物量 = -0.00
  敲除 R5_B→C       → 生物量 = 5.00
去掉旁路 R5 后再敲除 R3 → 生物量 = -0.0

Code代码

# 玩具代谢网络:R1 摄取 → A(上限 10);R2 A → B;R3 A → C;R4 B + C → 生物量;R5 B → C(旁路)。
# 稳态约束 S v = 0,下界 0,目标为最大化生物量通量 v4,用 scipy.optimize.linprog 求解。
# 依次把每个反应的上界设为 0(模拟基因敲除),看最优生物量是否降为 0。
# 输出解读:完整网络最优 v4 = 5;敲除 R3 后因为存在旁路 R5,v4 仍为 5(R3 非必需);
# 敲除 R1、R2 或 R4 则生物量为 0(必需反应)。去掉旁路 R5 后,R3 也变成必需。
import numpy as np
from scipy.optimize import linprog

mets = ["A", "B", "C"]
rxns = ["R1_uptake", "R2_A→B", "R3_A→C", "R4_biomass", "R5_B→C"]
S = np.array([[1, -1, -1,  0,  0],    # A
              [0,  1,  0, -1, -1],    # B
              [0,  0,  1, -1,  1]])   # C
ub = np.array([10, 1000, 1000, 1000, 1000], float)

def fba(S, ub, obj=3):
    c = np.zeros(S.shape[1]); c[obj] = -1             # linprog 求最小,取负号即最大化
    res = linprog(c, A_eq=S, b_eq=np.zeros(S.shape[0]),
                  bounds=list(zip(np.zeros(S.shape[1]), ub)), method="highs")
    return -res.fun, res.x

opt, v = fba(S, ub)
print("完整网络:最优生物量 =", round(opt, 3), ",通量 =", dict(zip(rxns, np.round(v, 2))))
for r in range(S.shape[1]):
    ub_ko = ub.copy(); ub_ko[r] = 0
    print(f"  敲除 {rxns[r]:12s} → 生物量 = {fba(S, ub_ko)[0]:.2f}")
S_noby = S[:, :4]
ub_ko = ub[:4].copy(); ub_ko[2] = 0
print("去掉旁路 R5 后再敲除 R3 → 生物量 =", round(fba(S_noby, ub_ko)[0], 2))

import matplotlib.pyplot as plt
labels = ["wild type", "ΔR1", "ΔR2", "ΔR3", "ΔR4", "ΔR5", "ΔR3\n(no R5)"]
vals = [opt] + [fba(S, np.where(np.arange(len(ub)) == r, 0, ub))[0] for r in range(len(ub))] \
       + [fba(S_noby, ub_ko)[0]]
fig, ax = plt.subplots(figsize=(6.4, 4.2))
ax.bar(labels, vals, color=["C0" if v > 1e-6 else "C3" for v in vals])
for i, v in enumerate(vals):
    ax.text(i, v + 0.1, f"{abs(v):.0f}", ha="center", color="C0" if v > 1e-6 else "C3", fontweight="bold")
ax.set_ylim(0, 5.8)
ax.set_ylabel("optimal biomass flux v4")
ax.set_title("Knockouts: red = essential (biomass drops to 0)")
plt.tight_layout(); plt.show()

Run在浏览器中运行

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

通量平衡分析(FBA)与反应敲除