使用给定的度数以相等的概率创建所有强连通图

时间:2015-02-15 18:45:50

标签: algorithm graph probability graph-theory

我正在寻找一种从n节点的所有强连接定向图形(无自循环)空间中对均匀进行采样的方法-degree k=(k_1,...,k_n), 1 <= k_i <= n-1

输入

  • n,节点数
  • k = (k_1,...,k_n),其中k_i =个有序边数进入节点i(度数)

输出

  • n节点(没有自循环)与给定的度数k_1,...,k_n的强连接有向图,其中每个可能的此类图以相同概率返回

我对n很大且k_i很小的情况特别感兴趣,因此简单地创建图表并检查强连通性是不可行的,因为概率基本上

我浏览了各种各样的论文和方法,但找不到任何可以解决这个问题的方法。

1 个答案:

答案 0 :(得分:1)

继续创建一个随机路径,直到有一个循环:

node1-&gt; node2-&gt; node3 ...-&gt; nodek-&gt; noder其中r&lt; = k

现在,用blob替换循环noder-&gt; noder + 1-&gt; nodek,让我们称之为blobr。现在继续将其连接到其余节点(这样节点不在此blob中)。每次你进入一个循环,只需创建一个更大的blob。

这将最终创建一个随机的极小强有向图。然后,添加随机边缘以满足传入标准。

这肯定会创建您需求的所有组合。我认为所有组合都是同样可能的,但我必须考虑更多。

算法:这是一个粗略的方案。我实际上并没有在这里重新讨论图形结构而没有解决边缘条件,但这应该是相当直接的。

function randomStrongGraph(list<set<node>> chain, set<node> allnodes)
    Node newnode = random(allnodes - head(chain))
    alreadyEncountered = false
    for (i=0,i<chain.length-1;i++)
        if (newnode in chain(i))
            consolidate(chain, i)
            alreadyEncountered = true
            break
    if !alreadyEncountered
        chain.append(new set().add(newnode))    
    randomStrongGraph(chain, allnodes)