Есть ли способ формировать соединения между узлами на основе того, имеют ли они общие атрибуты? - PullRequest
1 голос
/ 09 июля 2020

Моя цель - написать программу, которая начинается с несвязанной сети узлов, каждый из которых может иметь идентичные или разные атрибуты. Затем, если узлы имеют общие атрибуты, образуется ребро. До сих пор я просматривал пакет сетей, и, похоже, нет простого способа добиться этого. Если у кого-нибудь есть идеи, как это сделать, я был бы очень признателен за помощь! словарь знаний (обратите внимание, что get_node_attributes возвращает словарь с узлами в качестве ключей и элементами из know_list в качестве элементов). Если элемент в словаре осведомленности совпадает с атрибутом знания узла, добавьте границу между ними. Например, предположим, что случайный выбор дает осведомленность = [a, b]. В этом случае узел 5 будет формировать соединения с узлами 1 и 2, потому что узел 1 знает [a], а узел 2 знает [b]. Но узел 5 не будет формировать соединение с узлами 3 или 4, потому что они не являются элементами, содержащимися в словаре осведомленности. Надеюсь, это проясняет некоторые вещи, дайте мне знать, если это все еще сбивает с толку.

1 Ответ

0 голосов
/ 10 июля 2020

Начиная с графика, которым вы поделились:

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

You could invert the mapping returned by the nx.get_node_attributes of the knowledge attribute:

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']}

Then by iterating over awareness, you can easily add new edges by looking up in knowledge the nodes in the inner lists using add_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')

введите описание изображения здесь

...