You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为字典创建的NetworkX图的节点与边添加并展示capacity属性

为NetworkX图的节点和边分配并展示Capacity属性

步骤1:为节点和边添加Capacity属性

你可以在创建节点/边时直接指定属性,也可以在图创建完成后批量赋值。以下是具体实现方式:

为节点添加Capacity属性

先定义每个节点的容量值,再在添加节点时附带属性:

# VNF图节点容量
node_capacities_f = {
    'VNF1': 10,
    'VNF2': 20,
    'VNF3': 15,
    'VNF4': 25,
    'VNF5': 18
}

# 服务器图节点容量
node_capacities_s = {
    'S1': 50,
    'S2': 60,
    'S3': 45,
    'S4': 70,
    'S5': 55
}

# 创建图并添加带属性的节点
graph1 = nx.DiGraph()
graph1.add_nodes_from([(node, {'capacity': node_capacities_f[node]}) for node in Nf])

graph2 = nx.Graph()
graph2.add_nodes_from([(node, {'capacity': node_capacities_s[node]}) for node in Ns])

为边添加Capacity属性

同样先定义边的容量,再添加带属性的边:

# VNF图边容量
edge_capacities_f = {
    ('VNF1', 'VNF2'): 5,
    ('VNF2', 'VNF3'): 8,
    ('VNF3', 'VNF4'): 6,
    ('VNF2', 'VNF5'): 7,
    ('VNF5', 'VNF3'): 9
}

# 服务器图边容量
edge_capacities_s = {
    ('S1', 'S2'): 10,
    ('S1', 'S4'): 12,
    ('S2', 'S4'): 9,
    ('S2', 'S3'): 11,
    ('S4', 'S3'): 8,
    ('S4', 'S5'): 13,
    ('S3', 'S5'): 10
}

# 添加带容量属性的边
graph1.add_edges_from([(u, v, {'capacity': edge_capacities_f[(u, v)]}) for u, v in Lf])

graph2.add_edges_from([(u, v, {'capacity': edge_capacities_s[(u, v)]}) for u, v in Ls])
# 为S1-S2边同时设置weight和capacity属性
graph2.add_edge("S1", "S2", weight=4.7, capacity=edge_capacities_s[('S1', 'S2')])

步骤2:在可视化中展示Capacity属性

修改节点标签以包含容量信息,添加边标签展示边的容量:

fig1, ax1 = plt.subplots(figsize=(7, 7))

# 绘制VNF图节点及带容量的标签
nx.draw_networkx_nodes(graph1, pos=pos1, ax=ax1, edgecolors='black', node_size=1100)
node_labels_f = {node: f"{node}\nCap: {graph1.nodes[node]['capacity']}" for node in graph1.nodes}
nx.draw_networkx_labels(graph1, pos=pos1, ax=ax1, labels=node_labels_f, font_size=7)

# 绘制VNF图边及容量标签
nx.draw_networkx_edges(graph1, pos=pos1, ax=ax1, node_size=900, arrowsize=25)
edge_labels_f = {(u, v): graph1.edges[u, v]['capacity'] for u, v in graph1.edges}
nx.draw_networkx_edge_labels(graph1, pos=pos1, ax=ax1, edge_labels=edge_labels_f, font_size=6)

# 绘制服务器图节点及带容量的标签
nx.draw_networkx_nodes(graph2, pos=pos, ax=ax1, edgecolors='black', node_size=800)
node_labels_s = {node: f"{node}\nCap: {graph2.nodes[node]['capacity']}" for node in graph2.nodes}
nx.draw_networkx_labels(graph2, pos=pos, ax=ax1, labels=node_labels_s, font_size=8)

# 绘制服务器图边及容量标签
nx.draw_networkx_edges(graph2, pos=pos, ax=ax1, node_size=900, arrowsize=25)
edge_labels_s = {(u, v): graph2.edges[u, v]['capacity'] for u, v in graph2.edges}
nx.draw_networkx_edge_labels(graph2, pos=pos, ax=ax1, edge_labels=edge_labels_s, font_size=6)

plt.axis('on')
plt.show()

完整代码示例

整合所有步骤的完整可运行代码:

import networkx as nx
import matplotlib.pyplot as plt

# VNFGraph
Nf = {'VNF1', 'VNF2', 'VNF3', 'VNF4', 'VNF5'}
Lf = {('VNF1', 'VNF2'),('VNF2', 'VNF3'),('VNF3', 'VNF4'), ('VNF2', 'VNF5'),('VNF5', 'VNF3')}

# SERVERGraph
Ns = {'S1', 'S2', 'S3', 'S4', 'S5'}
Ls = {('S1', 'S2'),('S1', 'S4'),('S2', 'S4'),('S2', 'S3'),('S4', 'S3'),('S4', 'S5'),('S3', 'S5')}

# 定义节点容量
node_capacities_f = {'VNF1':10, 'VNF2':20, 'VNF3':15, 'VNF4':25, 'VNF5':18}
node_capacities_s = {'S1':50, 'S2':60, 'S3':45, 'S4':70, 'S5':55}

# 定义边容量
edge_capacities_f = {
    ('VNF1','VNF2'):5, ('VNF2','VNF3'):8, ('VNF3','VNF4'):6,
    ('VNF2','VNF5'):7, ('VNF5','VNF3'):9
}
edge_capacities_s = {
    ('S1','S2'):10, ('S1','S4'):12, ('S2','S4'):9, ('S2','S3'):11,
    ('S4','S3'):8, ('S4','S5'):13, ('S3','S5'):10
}

# 创建图并添加带属性的节点和边
graph1 = nx.DiGraph()
graph1.add_nodes_from([(n, {'capacity': node_capacities_f[n]}) for n in Nf])
graph1.add_edges_from([(u, v, {'capacity': edge_capacities_f[(u, v)]}) for u, v in Lf])

graph2 = nx.Graph()
graph2.add_nodes_from([(n, {'capacity': node_capacities_s[n]}) for n in Ns])
graph2.add_edges_from([(u, v, {'capacity': edge_capacities_s[(u, v)]}) for u, v in Ls])
graph2.add_edge("S1", "S2", weight=4.7, capacity=edge_capacities_s[('S1','S2')])

# 位置定义
pos1 = {'VNF1': (0,6), 'VNF2':(2,6), 'VNF3':(4,6), 'VNF4':(6,6), 'VNF5':(3,4)}
pos = {'S1':(0,1), 'S2':(2,2), 'S3':(4,2), 'S4':(3,1), 'S5':(6,1)}

# 可视化
fig1, ax1 = plt.subplots(figsize=(7,7))

# VNF图绘制
nx.draw_networkx_nodes(graph1, pos=pos1, ax=ax1, edgecolors='black', node_size=1100)
node_labels_f = {n: f"{n}\nCap: {graph1.nodes[n]['capacity']}" for n in graph1.nodes}
nx.draw_networkx_labels(graph1, pos=pos1, ax=ax1, labels=node_labels_f, font_size=7)
nx.draw_networkx_edges(graph1, pos=pos1, ax=ax1, node_size=900, arrowsize=25)
edge_labels_f = {(u,v): graph1.edges[u,v]['capacity'] for u,v in graph1.edges}
nx.draw_networkx_edge_labels(graph1, pos=pos1, ax=ax1, edge_labels=edge_labels_f, font_size=6)

# 服务器图绘制
nx.draw_networkx_nodes(graph2, pos=pos, ax=ax1, edgecolors='black', node_size=800)
node_labels_s = {n: f"{n}\nCap: {graph2.nodes[n]['capacity']}" for n in graph2.nodes}
nx.draw_networkx_labels(graph2, pos=pos, ax=ax1, labels=node_labels_s, font_size=8)
nx.draw_networkx_edges(graph2, pos=pos, ax=ax1, node_size=900, arrowsize=25)
edge_labels_s = {(u,v): graph2.edges[u,v]['capacity'] for u,v in graph2.edges}
nx.draw_networkx_edge_labels(graph2, pos=pos, ax=ax1, edge_labels=edge_labels_s, font_size=6)

plt.axis('on')
plt.show()

内容的提问来源于stack exchange,提问作者Waqas Swati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 12:57:36