有没有一种方法可以基于节点之间是否具有共享属性来建立连接?

时间:2020-07-09 03:42:35

标签: python-3.x network-programming nodes networkx

我的目标是编写一个程序,该程序以未连接的节点网络开头,每个节点可能具有相同或不同的属性。然后,如果节点具有共享属性,则将形成一条边。到目前为止,我已经浏览了network软件包,似乎没有一种简单的方法可以实现此目的。如果有人对如何做有任何想法,我将非常感谢您的帮助!

import networkx as nx
import matplotlib.pyplot as plt
import random
know_list = ["a", "b", "c", "d"]
G = nx.Graph()
for i in range(1,5):
    G.add_node(i, knowledge = know_list[i-1])

#nx.draw(G)
#plt.show()
knowledge=nx.get_node_attributes(G, 'knowledge')
print(knowledge)

G.add_node(5, awareness = random.choices(know_list, k=2))
awareness = nx.get_node_attributes(G, 'awareness')
print(awareness)`

#返回节点5的感知字典后的目标是将感知字典中的内容与知识​​字典进行比较(请注意,get_node_attributes返回一个字典,其中节点作为键,而Know_list中的元素作为项)。如果意识字典中的元素与节点的知识属性相同,则在两者之间添加一条边。例如,假设随机选择给出意识= [a,b]。在这种情况下,节点5将形成到节点1和2的连接,因为节点1具有[a]的知识,而节点2具有[b]的知识。但是,节点5将不会与节点3或4形成连接,因为它们不是意识字典中包含的元素。我希望这可以解决一些问题,让我知道它是否仍然令人困惑。

1 个答案:

答案 0 :(得分:0)

从您共享的图表开始:

know_list = ["a", "b", "c", "d"]
G = nx.Graph()
for i in range(1,5):
    G.add_node(i, knowledge = know_list[i-1])

nx.draw(G, with_labels=True, node_size=500, node_color='lightgreen')

enter image description here

您可以反转nx.get_node_attributes属性的knowledge返回的映射:

knowledge={j:i for i,j in nx.get_node_attributes(G, 'knowledge').items()}
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}

G.add_node(5, awareness = random.choices(know_list, k=2))
awareness = nx.get_node_attributes(G, 'awareness')
# {5: ['b', 'a']}

然后通过遍历awareness,您可以使用add_edgeknowledge中查找内部列表中的节点,从而轻松添加新边线:

for k,v in awareness.items():
    for node in v:
        G.add_edge(k,knowledge[node])

nx.draw(G, with_labels=True, node_size=500, node_color='lightgreen')

enter image description here