【问题标题】:Creating all strongly connected graphs with given in-degree with equal probability以相等的概率创建具有给定入度的所有强连通图
【发布时间】:2015-04-16 06:35:12
【问题描述】:

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

输入

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

输出

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

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

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

【问题讨论】:

  • 我认为这个问题可能更适合math.stackexchange.com
  • 可以有平行弧吗?
  • 不,没有平行弧。从节点 i 到 j 只允许有一条边,但可以肯定的是,可以有两条边 (i,j) 和 (j,i)。
  • 你不能先创建一个随机欧拉回路,让你满足连通性吗?

标签: algorithm graph probability graph-theory


【解决方案1】:

继续创建随机路径,直到出现循环:

node1->node2->node3...->nodek->节点r

现在,将循环 node->noder+1->nodek 替换为 blob,我们称之为 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)

【讨论】:

  • 如果在第一步中得到太多边会怎样?
  • @ThomasAhle 你不能。第一步的边数是O(n)。
猜你喜欢
  • 2021-08-10
  • 2020-07-20
  • 2018-10-11
  • 2018-04-30
  • 2021-01-08
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多