Клик в питоне

У меня есть эта проблема, и мне нужна помощь, это мой код:

      cliques=[clique for clique in nx.find_cliques(GC) if len(clique)>2]    

      for clique in cliques:
        if len (clique)==3:
        GC.remove_edge()
        print "Clique to appear: ",clique
      #draw the graph        
      nx.draw(GC)
      plt.show()

сначала я искал в своем графе, чтобы найти клики, после этого я проверял, есть ли клика длиной 3, если это правда, я хочу удалить одно ребро, поэтому я могу исключить complete-graph(3). Как я могу это сделать?

Спасибо

2 ответа

Я думаю, что самая сложная проблема здесь связана с общими краями. Вы не хотите искать клики каждый раз, когда удаляете ребро, и все же вам нужно помнить, какие ребра вы уже удалили.

Глядя на документацию, мы обнаруживаем, что find_cliques Функция является генератором.

Эта реализация является генератором списков, каждый из которых содержит членов максимальной клики

Означает ли это, что вы можете сгенерировать клику, удалить ребро, а затем сгенерировать следующую клику, и наш генератор будет знать, что мы удалили ребро?

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

edge_removed = True
while edge_removed:
    edge_removed = False
    for clique in nx.find_cliques(GC):
        if len (clique)>=3:
            GC.remove_edge(clique[0], clique[1])
            edge_removed = True
            break # Gotta restart the generator now...

Вы должны иметь в виду, что ВСЕ, что вы делаете с кликами, потенциально может быть очень трудоемким, поскольку даже простое обнаружение клики в графе является NP-полным.

if len(clique)==3:
    GC.remove_edge(*clique[0:2])

или эквивалент)

if len(clique)==3:
    GC.remove_edge(clique[0], clique[1])

но я могу упустить что-то важное, потому что это кажется очевидным, и я не эксперт - я просто читаю документы networkx (которые говорят, что клика - это список узлов, и это remove_edge занимает два узла).

Другие вопросы по тегам