ノードが半径内で接続されているランダム幾何グラフを使用して、二部グラフ G を作成するとします。次に、すべてのノードが特定の次数 (つまり、1 つまたは 2 つのエッジのみ) を持っていることを確認します。私の主な目的は、ノード セット (つまり、ノード タイプ a) の 1 つを取得し、各ノードに対して、私が設定した最大次数があることを確認することです。たとえば、次数が 4 のノード i を取得する場合、次数が 1 になるまでノード i のランダムなエッジを削除します。
エッジを生成した後にグラフ ジェネレーターで実行する次のコードを記述しました。エッジは削除されますが、すべてのノードの次数が 1 になるまで削除されません。
for n in G:
mu = du['G.degree(n)']
while mu > 1:
G.remove_edge(u,v)
if mu <=1:
break
return G
以下の全機能:
import networkx as nx
import random
def my_bipartite_geom_graph(a, b, radius, dim):
G=nx.Graph()
G.add_nodes_from(range(a+b))
for n in range(a):
G.node[n]['pos']=[random.random() for i in range(0,dim)]
G.node[n]['type'] = 'A'
for n in range(a, a+b):
G.node[n]['pos']=[random.random() for i in range(0,dim)]
G.node[n]['type'] = 'B'
nodesa = [(node, data) for node, data in G.nodes(data=True) if data['type'] == 'A']
nodesb = [(node, data) for node, data in G.nodes(data=True) if data['type'] == 'B']
while nodesa:
u,du = nodesa.pop()
pu = du['pos']
for v,dv in nodesb:
pv = dv['pos']
d = sum(((a-b)**2 for a,b in zip(pu,pv)))
if d <= radius**2:
G.add_edge(u,v)
for n in nodesa:
mu = du['G.degree(n)']
while mu > 1:
G.remove_edge(u,v)
if mu <=1:
break
return G
jared のような言葉に返信します。私はあなたのコードと私がしなければならなかったいくつかの変更を使ってみました:
def hamiltPath(graph):
maxDegree = 2
remaining = graph.nodes()
newGraph = nx.Graph()
while len(remaining) > 0:
node = remaining.pop()
neighbors = [n for n in graph.neighbors(node) if n in remaining]
if len(neighbors) > 0:
neighbor = neighbors[0]
newGraph.add_edge(node, neighbor)
if len(newGraph.neighbors(neighbor)) >= maxDegree:
remaining.remove(neighbor)
return newGraph
これにより、最終的なグラフからノードが削除されることになりますが、そうならないことを望んでいました。