我正在寻找一种从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
很小的情况特别感兴趣,因此简单地创建图表并检查强连通性是不可行的,因为概率基本上零
我浏览了各种各样的论文和方法,但找不到任何可以解决这个问题的方法。
答案 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)