Как преобразовать двудольный граф в недвудольный

Я долго безуспешно пытался это сделать, так что лучше спрошу у вас.

Прежде всего, я работаю над python 3 и networkx.

У меня есть двудольный граф как изображение A, в котором есть два типа узлов в соответствии с их атрибутом «группа» (group = 'R' и group = 'X '). Кроме того, некоторые отношения обратимы, как R4, а некоторые нет (поэтому я думаю, что в этих случаях нам придется развернуть узел).

Мне нужно оставить только узлы группы R и удалить узлы X, но сохранить отношения между ними. То есть преобразовать зеленые узлы в ребра и сохранить график только синих узлов.

Оооо пожалуйста !!, может кто-нибудь протянуть мне руку?

Любая помощь будет очень приветствоваться.

Заранее от всей души благодарим вас!

ГРАФИЧЕСКОЕ ИЗОБРАЖЕНИЕ ЗДЕСЬ:

https://media.springernature.com/full/springer-static/image/art%3A10.1038%2Fs41540-018-0067-y/MediaObjects/41540_2018_67_Fig1_HTML.png


person Valtriz    schedule 28.08.2019    source источник
comment
Можете ли вы сформулировать проблему несколько иначе? У вас есть двудольный граф. Вы хотите создать новый график, который состоит только из одной из этих групп. Что означает ребро в новом графе? [обратите внимание, посмотрите на команду проекта в networkx, так как это может показаться вам тем, что вам нужно]   -  person Joel    schedule 28.08.2019


Ответы (1)


Обойдите узлы графа, если узел зеленый, добавьте ребро между всеми его соседями (которые будут только синими). В конце удалите все зеленые узлы.

to_remove = []
for node in G.nodes(data = True):
    if node[1]["type"] == "Green": ## check if the node is green
        to_remove.append(node[0])
        ## go over all neighbours of the node and add an edge between them
        neighbours =  list(G.neighbors(node[0]))
        for i in range(0, len(neighbours)-1):
            for j in range(i+1, len(neighbours)):
                G.add_edge(neighbours[i],neighbours[j])

## remove the green nodes
G.remove_nodes_from(to_remove)
person glhrsh    schedule 17.09.2019