Mímisbrunnr知恵の泉

← ネットワーク科学 一覧

🎓 レベル:発展 | 重要度:B(推奨)

📎 前提:次数・道・連結成分攻撃耐性とロバスト性 | 関連:時間発展ネットワーク(temporal)

要点(BLUF)

概念:関係は1種類ではない

同じ人どうしが「友人」「同僚」「家族」と複数の関係で繋がっていたり、同じ都市が「道路網」「鉄道網」「電力網」で結ばれていたり。現実は複数の関係の重ね合わせです。これらを別々のとして保持するのが多層ネットワーク。層を1枚に潰してしまうと、「どの関係で繋がっているか」「層をまたぐ依存」という重要情報が失われます。

数式:層と層間結合

多層ネットワークは、層 α=1,,L\alpha = 1, \dots, L ごとの隣接行列 A(α)A^{(\alpha)} と、層をまたぐ結合で表します。同一ノード集合の各層が、それぞれ独立のエッジ構造を持ちます。

特に重要なのが相互依存ネットワーク(interdependent network):層Aのノードが機能するには層Bの対応ノードが必要、という依存。電力網(A)と通信網(B)の停電・通信障害の連鎖がこれです。

コードで確認

import networkx as nx

# 同じノード{0,1,2,3}を2つの関係(層)で繋ぐ
friend    = nx.Graph([(0,1),(1,2),(2,3)])    # 友人層
colleague = nx.Graph([(0,2),(1,3),(0,3)])    # 同僚層

for n in [0,1,2,3]:
    df = friend.degree(n)
    dc = colleague.degree(n)
    print(f"ノード{n}: 友人層次数={df}, 同僚層次数={dc}, 多重次数(合計)={df+dc}")

agg = nx.compose(friend, colleague)            # 1枚に集約
print("集約グラフのエッジ数:", agg.number_of_edges())

実行結果:

ノード0: 友人層次数=1, 同僚層次数=2, 多重次数(合計)=3
ノード1: 友人層次数=2, 同僚層次数=1, 多重次数(合計)=3
ノード2: 友人層次数=2, 同僚層次数=1, 多重次数(合計)=3
ノード3: 友人層次数=1, 同僚層次数=2, 多重次数(合計)=3

集約すると全ノードの次数が3で均一に見えますが、層を分けると「友人としてのハブ」と「同僚としてのハブ」は別ノード(ノード1は友人層で次数2、ノード0は同僚層で次数2)。集約は構造の偏りを覆い隠すことが分かります。

層構造の図解

graph TD
    subgraph L1["友人層"]
        a0((0)) --- a1((1))
        a1 --- a2((2))
        a2 --- a3((3))
    end
    subgraph L2["同僚層"]
        b0((0)) --- b2((2))
        b1((1)) --- b3((3))
        b0 --- b3
    end
    a0 -. "同一人物(層間結合)" .- b0
    a1 -. " " .- b1

数式の直観的意味

多層を集約してはいけない理由は、ダイナミクスが層ごとに違うからです。病気は対面層で広がり、噂はSNS層で広がる。両者を足すと「実際には起こらない伝播」を許してしまう。さらに相互依存ネットワークでは、層Aの故障が層Bの故障を誘発し、それがまた層Aに跳ね返るカスケード故障が起こり、単層ネットワーク(攻撃耐性とロバスト性)よりはるかに脆い相転移を示します。2010年のBuldyrevらの研究は、相互依存ネットワークが単層と違って「不連続な(一次)相転移」で突然全崩壊しうることを示しました。層を保つことは、この危うさを見るために不可欠です。

⚠️ よくある誤解・落とし穴

対応シミュレーション

本文のコードがそのまま検証用です。単層の頑健性は 攻撃耐性とロバスト性

関連