2016-05-12 3 views
1

私はPythonでかなり新しいです、私はそれらの間にエッジがない2つのランダムなノードを見つけたいですが、私のプログラムは時々空のリストや3つ以上のノードを返します。 誰もがこの上で私を助けることができる、私のプログラムは次のとおりです。グラフの中にエッジのない2つの無作為のノードを見つけるには?

import networkx as nx 
import random 
n=6 
m=10 
G=nx.gnm_random_graph(n, m, seed=None, directed=True) 
result = [] 
nodes = random.sample(G.nodes(), 2) 
for u in nodes: 
    for v in nodes: 
     if u != v and G.has_edge(u,v) is False and G.has_edge(v,u) is False: 
     result.append((u,v)) 
    else: 
     nodes = random.sample(G.nodes(), 2) 
print(result) 
+0

警告:グラフが完全ではないことを確認する価値があります。 – Joel

+0

また、グラフが指示されていない場合、 '(u、v)'をチェックした後、 '(v、u)'がエッジかどうかを確認する必要はありません。 – Joel

答えて

0
import networkx as nx 
import random 
n=6 
m=10 
G=nx.gnm_random_graph(n, m, seed=None, directed=True) 
nodes = G.nodes() 

def select_2_random_unconnected_nodes(node_list, graph): 

    selected_node = random.choice(node_list) 

    # obtain all the nodes connected to the selected node 
    connected_nodes = [n for _, n in G.edges(selected_node)] 

    print(connected_nodes + [selected_node]) 

    # a feasible node is one not in connected_nodes and also not the first selected_node 
    feasible_nodes = [feasible_n for feasible_n in node_list if feasible_n not in connected_nodes + [selected_node]] 

    # select a second node from the feasible_nodes list 
    select_second_node = random.choice(feasible_nodes) 

    return selected_node, select_second_node 
+0

これを投稿していただき、ありがとうございました。 – Maryam

+0

問題ありません。あなたは上記の答えを受け入れるべきです。明らかに私よりも優れています。 – EDWhyte

+0

上記のコードをnetworkxの代わりにigraphを使って試しましたが、node_list = graph.vs()とconnected_nodes = [nは(G.es.select(_source = selected_node)とG.es.select(_target) = selected_node))]しかし、ノード間に自己ループと複数のエッジを戻します。igraph/pythonでどのように動作するか知っていますか? – Maryam

2

あなただけのノードの1ペアをしたい場合は、リストを作成する理由はありません。ペアを見つけるだけ!

while True: 
    u, v = random.sample(G.nodes(), 2) 
    if not (G.has_edge(u, v) or G.has_edge(v, u)): 
     break 

今直接uvを使用しています。

関連する問題