首页 > 解决方案 > 有没有办法根据节点是否具有共享属性来形成节点之间的连接?

问题描述

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

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 形成连接,因为它们不是意识字典中包含的元素。我希望这能澄清一些事情,让我知道它是否仍然令人困惑。

标签: python-3.xnetwork-programmingnodesnetworkx

解决方案


从您共享的图表开始:

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')

在此处输入图像描述

您可以反转属性返回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查找节点来轻松添加新边:knowledgeadd_edge

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')

在此处输入图像描述


推荐阅读