通用端口连接模型
首先,您需要将端口作为节点属性添加:
import networkx as nx
r1 = dict( name = 'R1', ports = dict(p1 = 'p1', p2 = 'p2') )
r2 = dict( name = 'R2', ports = dict(p1 = 'p1', p2 = 'p2') )
r3 = dict( name = 'R3', ports = dict(p1 = 'p1', p2 = 'p2') )
routers = [r1,r2,r3]
G = nx.Graph()
for r in routers:
G.add_node(r['name'], name=r['name'], ports=r['ports'])
所以,如果我现在执行以下操作:
G.nodes().get('R3', None)
我得到以下内容:
{'name': 'R3', 'ports': {'p1': 'p1', 'p2': 'p2'}}
那么,您基本上可以为图形创建边缘添加一个包装函数。我假设您可以使用一个节点的任何端口连接到另一个节点的任何其他端口:
def add_edge_port(G, node1, port1, node2, port2):
node_list = [node1, node2]
port_list = [port1, port2]
edge_ports = []
for idx in range(0, 2):
node_idx = node_list[idx]
port_idx = port_list[idx]
if G.nodes().get(node_idx, None) is None:
print("Node : {} is not present in Graph".format(node_idx))
return
if G.nodes(data=True)[node_idx]['ports'].get(port_idx, None) is None:
print("Port ID :{} is incorrect for Node ID : {}!".
format(node_idx, port_idx))
return
edge_ports.append(node_idx + '.' + port_idx)
G.add_edge(node1, node2, anchors=edge_ports)
现在像这样添加边缘:
add_edge_port(G, 'R1', 'p1', 'R2', 'p2')
print(G.edges(data=True))
To get the anchors list, simply use:
print(nx.get_edge_attributes(G, 'anchors'))
如果您确信端口p1将始终连接到端口p2
def add_edge_port_modified(G, node1, node2):
edge_ports = [node1 + '.p1', node2 + '.p2']
G.add_edge(node1, node2, anchors=edge_ports)
然后调用:
add_edge_port_modified(G, 'R2', 'R3')
并且边缘将会是
print(nx.get_edge_attributes(G, 'anchors'))
参考文献:
nx.set_edge_attributes(G, {(ip_A,ip_B):data})
,其中data
与你的anchors
相同。这种方法唯一的问题是你将锚点端口记录为边属性。我看到它的有用性,但它并没有解决我的问题。我希望端口本身成为锚点,就像一个节点一样。无论如何,谢谢你! - Lucas Aimaretto