2. 网络科学基础:图论基础与网络类型
各位同学,欢迎来到第二章。说实话,每次讲图论我都特别兴奋——不是因为数学多美,而是因为供应链金融的底层逻辑,说白了就是一张图。你想想看,供应商、核心企业、银行、物流商,这些角色之间谁跟谁有资金往来、谁依赖谁,用图来表达再清楚不过了。
我个人习惯,学任何网络科学的东西,先别急着看公式,先把「图」这个概念吃透。这一章我们就干三件事:搞懂图的基本构成、认识几种经典网络模型、最后用代码把图画出来。
2.1 图的基本构成:节点与边
图(Graph)是什么?别想复杂了,就是一堆点(节点)和一堆线(边)。
- 节点(Node/Vertex):代表网络中的实体。在供应链金融里,节点可以是企业、银行、仓库、甚至是一笔应收账款。
- 边(Edge):代表节点之间的关系。比如A公司向B公司供货,就有一条从A指向B的边。
嗯,这里要注意:边可以带方向,也可以不带。这就引出了有向图和无向图的概念。
有向图 vs 无向图
| 类型 | 说明 | 供应链金融场景 |
|---|---|---|
| 无向图 | 边没有方向,表示对称关系 | 两家企业互相担保,关系是对等的 |
| 有向图 | 边有方向,表示单向关系 | A向B付款,资金流是单向的 |
我在项目中遇到过一个问题:有家银行想分析供应链上的资金流向,结果把所有的边都画成无向的,导致分析结果完全乱套。后来我帮他们改成有向图,资金从核心企业流向一级供应商、再流向二级供应商,一目了然。所以,方向很重要。
2.2 图的数学表示
图可以用两种方式存到计算机里。我建议你两种都掌握,因为不同场景下效率差别很大。
邻接矩阵
用一个 N×N 的矩阵,N 是节点数。如果节点 i 和节点 j 之间有边,矩阵的 (i,j) 位置就填 1(有向图里填方向权重)。
# 一个简单的有向图邻接矩阵
# 节点: [A, B, C]
# 边: A->B, B->C, C->A
import numpy as np
adj_matrix = np.array([
[0, 1, 0], # A -> B
[0, 0, 1], # B -> C
[1, 0, 0] # C -> A
])
print(adj_matrix)
邻接表
每个节点后面挂一个列表,存它连出去的邻居。这种方式更省空间,尤其当图很稀疏的时候。
# 用字典表示邻接表
graph = {
'A': ['B'],
'B': ['C'],
'C': ['A']
}
2.3 三种经典网络模型
现实中的网络千奇百怪,但科学家们总结出了三种基本模型。理解它们,你就能看懂大部分供应链网络的结构特征。
2.3.1 随机图(Erdős–Rényi 模型)
随机图是最简单的模型:给定 N 个节点,每对节点以概率 p 连边。说白了,就是随机连线。
- 特点:大部分节点的度数(连边数量)差不多,分布呈泊松分布。
- 供应链场景:不太常见。因为真实供应链里,企业不会随机跟别人做生意。
import networkx as nx
import matplotlib.pyplot as plt
# 生成一个随机图:20个节点,连边概率0.1
G_random = nx.erdos_renyi_graph(n=20, p=0.1, seed=42)
print("随机图节点数:", G_random.number_of_nodes())
print("随机图边数:", G_random.number_of_edges())
2.3.2 小世界网络(Watts–Strogatz 模型)
小世界网络有两个特征:高聚类系数(你的朋友之间也互相认识)和短平均路径长度(六度分隔理论)。
为什么会这样?因为小世界网络是在规则网络的基础上,随机「重连」一小部分边。这样既保留了局部紧密性,又增加了全局连通性。
# 生成小世界网络:20个节点,每个节点连4个邻居,重连概率0.1
G_smallworld = nx.watts_strogatz_graph(n=20, k=4, p=0.1, seed=42)
print("小世界网络平均聚类系数:", nx.average_clustering(G_smallworld))
print("小世界网络平均路径长度:", nx.average_shortest_path_length(G_smallworld))
2.3.3 无标度网络(Barabási–Albert 模型)
无标度网络的核心是「富者愈富」:新节点更倾向于连接到已经有很多连接的节点(优先连接)。
- 特点:少数节点(Hub)拥有大量连接,大部分节点只有少量连接。度分布服从幂律分布。
- 供应链场景:非常常见!核心企业就是那个 Hub,周围围着一堆中小供应商。
# 生成无标度网络:20个节点,每个新节点带2条边
G_scale_free = nx.barabasi_albert_graph(n=20, m=2, seed=42)
# 查看度数最高的几个节点
degree_dict = dict(G_scale_free.degree())
sorted_degrees = sorted(degree_dict.items(), key=lambda x: x[1], reverse=True)
print("度数最高的3个节点:", sorted_degrees[:3])
2.4 本章知识体系总览
下面这张图是我用 SVG 画的,把本章的核心逻辑串起来了。你可以把它当作一张「地图」,学完回头看看,思路会更清晰。
2.5 三种网络对比总结
| 特性 | 随机图 (ER) | 小世界 (WS) | 无标度 (BA) |
|---|---|---|---|
| 度分布 | 泊松分布 | 近似泊松分布 | 幂律分布 |
| 聚类系数 | 低 | 高 | 中等 |
| 平均路径长度 | 短 | 短 | 短 |
| 供应链适用性 | 低(不真实) | 中(局部集群) | 高(核心-边缘结构) |
| 典型场景 | 理论分析 | 信息传播、社交网络 | 供应链、互联网、金融网络 |
好了,这一章的内容就是这些。图论基础是后面所有建模的基石,别嫌简单。下一章我们会用这些知识,真正开始搭建一个供应链金融网络模型——到时候你会感谢今天认真学了图论的自己。