2017-08-04 28 views
0

タイトルが示唆するように、入力されたノードの一部であるサイクル数を計算する関数を記述しようとしています。私はサイクルを見つけるアルゴリズムの背後にある理論を説明している便利なvideoを見つけましたが、サイトが使用しているデータ構造ではなくnetworkXを使用して実装する方法を理解するのに問題があります。私は、ネットワークを横断してサイクルを見つけるために、ホワイト/グレー/ etcのコンセプトを理解することができませんでした。python:networkXのサイクルを検出する

My機能パラメータ/構造:

:ネットワークは、あまりにも、入力と出力のノードがある、と私は計算サイクル

にそれらを再生するかは不明だ。これは私の入力ネットワークが

def feedback_loop_counter(G, node): 
    c = 0 
    calculate all cycles in the network 
    for every cycle node is in, increment c by 1 
    return c 

です

import networkx as nx 
import matplotlib.pyplot as plt 
G=nx.DiGraph() 
molecules = ["CD40L", "CD40", "NF-kB", "XBP1", "Pax5", "Bach2", "Irf4", "IL-4", "IL-4R", "STAT6", "AID", "Blimp1", "Bcl6", "ERK", "BCR", "STAT3", "Ag", "STAT5", "IL-21R", "IL-21", "IL-2", "IL-2R"] 
Bcl6 = [("Bcl6", "Bcl6"), ("Bcl6", "Blimp1"), ("Bcl6", "Irf4")] 
STAT5 = [("STAT5", "Bcl6")] 
IL_2R = [("IL-2R", "STAT5")] 
IL_2 = [("IL-22", "IL-2R")] 
BCR = [("BCR", "ERK")] 
Ag = [("Ag", "BCR")] 
CD40L = [("CD40L", "CD40")] 
CD40 = [("CD40", "NF-B")] 
NF_B = [("NF-B", "Irf4"), ("NF-B", "AID")] 
Irf4 = [("Irf4", "Bcl6"), ("Irf4", "Pax5"), ("Irf4", "Irf4"), ("Irf4", "Blimp1")] 
ERK = [("ERK", "Bcl6"), ("ERK", "Blimp1"), ("ERK", "Pax5")] 
STAT3 = [("STAT3", "Blimp1")] 
IL_21 = [("IL-21", "IL-21R")] 
IL_21R = [("IL-21R", "STAT3")] 
IL_4R = [("IL-4R", "STAT6")] 
STAT6 = [("STAT6", "AID"), ("STAT6", "Bcl6")] 
Bach2 = [("Bach2", "Blimp1")] 
IL_4 = [("IL-4", "IL-4R")] 
Blimp1 = [("Blimp1", "Bcl6"), ("Blimp1", "Bach2"), ("Blimp1", "Pax5"), ("Blimp1", "AID"), ("Blimp1", "Irf4")] 
Pax5 = [("Pax5", "Pax5"), ("Pax5", "AID"), ("Pax5", "Bcl6"), ("Pax5", "Bach2"), ("Pax5", "XBP1"), ("Pax5", "ERK"), ("Pax5", "Blimp1")] 
edges = Bcl6 + STAT5 + IL_2R + IL_2 + BCR + Ag + CD40L + CD40 + NF_B + Irf4 + 
ERK + STAT3 + IL_21 + IL_21R + IL_4R + STAT6 + Bach2 + IL_4 + Blimp1 + Pax5 
G.add_nodes_from(molecules) 
G.add_edges_from(edges) 
sources = ["Ag", "CD40L", "IL-2", "IL-21", "IL-4"] 
targets = ["XBP1", "AID"] 

答えて

1

を取得する場合、それがあることを行うにはいくつかのコードを書いてみて、そのコードで新しい質問を開きます、繰り返されるノードのみが最初/最後のノードであるサイクル。

エッジを持つノードをノードu(「入力ノード」)にします。次に、networkxコマンドall_simple_pathsを使用して、uから各入力ノードまでのすべての単純なパスを検索します。これらはそれぞれ、単純なサイクルになります。

+0

このようにしても、ネットワークを手作業でチェックしても良い出力が得られるようです。ご協力いただきありがとうございます。 – witcheR

1

サイクルを見つけるアイデアは、Depth-first searchを実行している間に、あなたがすでに見たノードとそれらのパスを覚えておいてください。すでに見たノードを訪れた場合、サイクルがあり、パスを連結することで見つけることができます。

することは、私はあなたが「シンプルサイクル」に興味があるという仮定の下で私の答えを書くつもりだ立ち往生

関連する問題