Подключение узлов с использованием матрицы назначений - PullRequest
0 голосов
/ 26 ноября 2018

В типичных проблемах с местоположением объекта у меня есть три объекта (Fi, i = 1,2,3) и шесть узлов (Dj, j = 1,2,3,4,5,6).Я хочу построить все Fi и Dj, а затем соединить узлы Dj с объектами Fi на основе матрицы назначений Xij.

Матрица Xij задается как:

Xij = np.array([[1,0,0,1,1,1],
                [0,1,1,0,0,0],
                [0,0,0,0,0,0]])

Первая строкаXij показывает, что узлы Dj (j = 0,3,4,5) выделены для объекта Fi (i = 0).Во второй строке показаны узлы Dj (j = 1,2), выделенные второму средству Fi (i = 2).Третья строка показывает, что ни один узел не выделен для объекта Fi (i = 2).

Я пытался сделать это в matplotlib, чтобы отобразить узлы в указанных местах, но не знаю, как их соединить.

fx = np.array([30, 30, 30])
fy = np.array([10, 20, 30])
f = np.vstack((fx, fy))
px = np.array([50, 50, 50, 50, 50])
py = np.array([10, 15, 20, 25, 30])
p = np.vstack((px, py))
plt.scatter(fx,fy, marker='D', s=100)
plt.scatter(px,py, marker='o', s=100)

Затем я прочитал о библиотеке Networkx и попытался построить их как:

G1  = nx.Graph()   
G2  = nx.Graph()
Fi = {0: (10,10),
      1: (10,20),
      2: (10,30)}

Dj ={0: (20,5),
      1: (20,10),
      2: (20,15),
      3: (20,20),
      4: (20,25),
      5: (20,30)}
nx.draw_networkx(G1, Fi, node_color= 'gray', node_size=500)
nx.draw_networkx(G2, Dj, node_color= 'gray', node_size=300)

Однако, не можете понять, как легко подключить эти узлы в любом инструменте?Данная проблема представляет собой простую версию более крупной сети.

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вам необходимо использовать pos для рисования в нужном месте, а для краев вы должны выполнить итерации по матрице:

import numpy as np
import networkx as nx
from matplotlib import pyplot as plt

Xij = np.array([[1,0,0,1,1,1],
                [0,1,1,0,0,0],
                [0,0,0,0,0,0]])

Fi = {'F0': [10,10],
      'F1': [10,20],
      'F2': [10,30]}

Dj ={'D0': [20,5],
      'D1': [20,10],
      'D2': [20,15],
      'D3': [20,20],
      'D4': [20,25],
      'D5': [20,30]}

newD = dict(Dj.items()) #Build a dictionary with all the items, for position
newD.update(Fi.items())

G1  = nx.Graph()   

G1.add_nodes_from(newD)
for i in range(Xij.shape[0]): # Add an edge according to the matrix
    for j in range(Xij.shape[1]):
        if Xij[i,j] == 1:
            G1.add_edge('F'+str(i), 'D'+str(j))


nx.draw(G1, with_labels=True, pos = newD) #Draw, with locations and edges

С результатом:
enter image description here

Добавлено пояснение, встроенное в код.

Редактировать: Для цветов необходимо определить цвет для каждого узла:

colors = ['r' if x[0] == 'D' else 'b' for x in list(G1.nodes)]
nx.draw(G1, with_labels=True,node_color=colors, pos = newD) #Draw, with locations and edges, and colors
0 голосов
/ 26 ноября 2018

Один из способов сделать это - преобразовать вашу двудольную матрицу назначений в полную матрицу смежности, а затем использовать ее для заполнения вашего nx-графика.

Xij = np.array([[1,0,0,1,1,1],
                [0,1,1,0,0,0],
                [0,0,0,0,0,0]])

A = Xij
At = A.T
Z_top_left = np.zeros((A.shape[0], At.shape[1]))
Z_bottom_right = np.zeros((At.shape[0], A.shape[1]))
G = nx.from_numpy_matrix(np.vstack([np.hstack([Z_top_left,A]) , np.hstack([At, Z_bottom_right])]))

Затем вы можете нарисовать свой G-граф (изложивпозиции с использованием методов, описанных в другом месте здесь), и он будет содержать края, которые вы ищете.

bipartite graph

Чтобы получить из матрицы назначений X, вам нужно составить массив, состоящий из X, и транспонировать X в верхнем правом и нижнем левом углу.углы, заполняя остальное нулями, так как не существует ребер от объекта к объекту или от узла к узлу (если использовать ваши условия).Это двудольный граф.Это то, что делают вызовы hstack и vstack выше.

В качестве альтернативы, вы можете перебрать свой массив присваивания с i и j в качестве итераторов строк / столбцов и выполнить:

G.add_edge(i,j)

Это создаст узлы и соединит их с ребрами.Затем одна из команд семейства nx.draw выложит их графически.Я также замечаю, что в ближайшее время на networkx появится новая опция bipartite_layout.

...