Создание последовательности с использованием матрицы смежности в Python - PullRequest
0 голосов
/ 23 мая 2018

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

  A B C D E
A 0 0 0 0 0
B 1 0 0 0 0
C 0 1 0 0 0
D 1 0 0 0 0
E 0 1 0 1 0

Это будет представлять последовательность ABCDE, поскольку B зависит от A, C зависит от B a и так далее.Я случайно создаю эту матрицу, которая является нижней треугольной матрицей.Проблема, с которой я сталкиваюсь, заключается в том, что когда я случайно создаю матрицу, иногда возникает прямая связь, а также косвенная связь между строкой и столбцом, что является избыточностью.Например, если вышеуказанная матрица была слегка изменена на следующую матрицу,

      A B C D E
    A 0 0 0 0 0
    B 1 0 0 0 0
    C 0 1 0 0 0
    D 0 0 1 0 0
    E 0 1 0 1 0

Избыточность была бы, поскольку E косвенно связан с B через C и также напрямую связан с B.Я хочу удалить прямую связь между E и B. У меня проблемы с этим.Я попытался использовать связующее дерево, но оно не работает, потому что я хочу сохранить ситуацию, представленную в верхней матрице (т. Е. E косвенно зависит от A через B, а также имеет отдельную косвенную зависимость через D, что допустимо), но исправить ситуацию в секундуматрица (то есть E напрямую зависит от B, а также косвенно зависит от B через D).Ниже приведен код, который у меня есть до сих пор.

import numpy as np
import pandas as pd
import csv



n = 20
k = 0
rowNum = 5
colNum = 4
numValue = ((rowNum+1)/2)*colNum
m = (np.random.rand(n, n) * 2).astype(np.int)
matrix = np.tril(m, -1)
for (i,j), value in np.ndenumerate(matrix):
    for k in np.arange(0,len(matrix[i]), 1):
        if (matrix[i][j] == 1 and matrix[j][k] == 1):
            matrix[i][k] = 0
        else: continue
        if (i-j > colNum and i-j < numValue) or (i-j > (numValue+colNum)):
            matrix[i][j] = 0
        else:
            continue    
    if i <= j: 
        continue
    else:
        if np.sum(matrix[i] == 1) >= 4:
            matrix[i][j] = 0
        else:continue

names = [i for i in 'ABCDEFGHIJKLMNOPQRST']
df = pd.DataFrame(matrix, index=names, columns=names)
df.to_csv('df.csv', index=True, header=True, sep=',')

Как включить это условие в код?Или мне нужен совершенно другой подход?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...