首页 > 解决方案 > 创建一个有向图,其中进(出)度分布是无标度的

问题描述

我想创建一个有向图,其中只有进(出)度分布是无标度的。最好我想在python(networkx)中实现它。我在networkx中没有找到任何实现。

先感谢您。

标签: pythongraphnetwork-programmingnetworkx

解决方案


所以解决方案是使用networkX。关键是这种配置模型,您可以在其中分别为进出学位分配学位列表。所以我为 in_degree 分配了一个幂律度数序列,我对其进行了扰动以使分布不是幂律......瞧......:D

import networkx as nx
import ndlib.models.ModelConfig as mc
import ndlib.models.epidemics as ep
from ndlib.viz.mpl.DiffusionTrend import DiffusionTrend
from ndlib.viz.bokeh.MultiPlot import MultiPlot
from ndlib.viz.bokeh.DiffusionPrevalence import DiffusionPrevalence
from bokeh.io import output_notebook, show
from pprint import pprint
import json, re, demjson
import sys
import random
import matplotlib.pyplot as plt



def plot_degree_dist(G):
    in_degrees = G.in_degree()
    in_degrees=dict(in_degrees)
    in_values = sorted(set(in_degrees.values()))
    in_hist = [list(in_degrees.values()).count(x) for x in in_values]

    plt.subplot(2,1,1) 
    plt.grid(False)
    plt.loglog(in_values, in_hist, 'r.') 
    plt.xlabel('k')
    plt.ylabel('p(k)')
    plt.title('In Degree Distribution')

    out_degrees = G.out_degree()
    out_degrees=dict(out_degrees)
    out_values = sorted(set(out_degrees.values()))
    out_hist = [list(out_degrees.values()).count(x) for x in out_values]

    plt.subplot(2,1,2)
    plt.grid(False)
    plt.loglog(out_values, out_hist, 'r.') 
    plt.xlabel('k')
    plt.ylabel('p(k)')
    plt.title('Out Degree Distribution')
    plt.show()


while True:  
    s=[]
    while len(s)<2500:
        nextval = int(nx.utils.powerlaw_sequence(1, 2.5)[0]) #100 nodes, power-law exponent 2.5

        if nextval!=0:
            s.append(nextval)

    if sum(s)%2 == 0:
        break

din = s

z = [0]*len(s)
for k in range(len(s)):

    randnum = int(random.uniform(0,1)*30)

    if random.uniform(0,1)>0.1:
        z[k]=s[k]+randnum
        z[len(s)-k-1]=s[len(s)-k-1]-randnum

    else:
        z[k] = s[k]
        z[len(s)-k-1] = s[len(s)-k-1]

    if k==int(len(s)/2.0-1):
        break

print(sum(s),sum(z))

dout = z


G = nx.directed_configuration_model(din,dout)
G=nx.DiGraph(G) # remove parallel edges
G.remove_edges_from(G.selfloop_edges())
plot_degree_dist(G)


推荐阅读