Модифицированный случайный граф Эрдоша-Рени с двумя разными популяциями в питоне с сетью x - PullRequest
0 голосов
/ 02 июня 2018

Я хочу реализовать следующую модель:

  • Взять 2 * n узлов.Первые n узлов представляют особей типа A, а остальные - типа B.

  • С вероятностью p существует грань между индивидуумом из A и другим из B.

Я сделал это таким образом, но я хочу, чтобы это было быстрее:

def modified_Erdos_Renyi(n,p):
    G = nx.empty_graph(2*n)
    for i in range (n):       
        for j in range(n,2*n):
            r = rd.random()
            if r<=p:
                G.add_edge(i,j)
    return G

Я увидел, что в традиционных источниках networkx есть быстрый алгоритм для традиционного G_np:

def fast_gnp_random_graph(n, p):
    G = empty_graph(n)
    G.name="fast_gnp_random_graph(%s,%s)"%(n,p)

    w = -1
    lp = math.log(1.0 - p)
    v = 1
    while v < n:
        lr = math.log(1.0 - random.random())
        w = w + 1 + int(lr/lp)
        while w >= v and v < n:
            w = w - v
            v = v + 1
        if v < n:
            G.add_edge(v, w)
    return G

Как я могу реализовать этот алгоритм с моей модифицированной моделью?

1 Ответ

0 голосов
/ 02 июня 2018

Алгоритм, который вы пытаетесь создать, уже реализован в сети x как nx.bipartite.random_graph(m,n,p).m - это число в группе A, n - это число в группе B, а p - это вероятность фронта.

Кстати, если вы хотите понять, почему fast_gnp_random_graph работает, я рекомендую раздел 2 из эту статью я написал вместе с одним из первых разработчиков networkx .

...