巴拉布á;si–;Python中的Albert模型

巴拉布á;si–;Python中的Albert模型,python,random,graph-theory,graph-algorithm,Python,Random,Graph Theory,Graph Algorithm,我正在尝试使用这个函数生成一个合成网络。 我不希望使用任何“固定”库函数,因为稍后我打算修改涉及的数学表达式 吸引概率为∏(ki)=ki/∑j kj。当m=1时,以下代码似乎起作用: if random.uniform(0.0,1.0)在使用if not in neights\u per\u node[i]:条件使用,if not in neights\u per\u node[i]:,重复使用random.uniform(0.0,1.0)并绘制一个新的概率,直到t not in neights

我正在尝试使用这个函数生成一个合成网络。 我不希望使用任何“固定”库函数,因为稍后我打算修改涉及的数学表达式

吸引概率为∏(ki)=ki/∑j kj。当m=1时,以下代码似乎起作用:


if random.uniform(0.0,1.0)在使用
if not in neights\u per\u node[i]:
条件使用,
if not in neights\u per\u node[i]:
,重复使用
random.uniform(0.0,1.0)
并绘制一个新的概率,直到
t not in neights\u per\u node[i]

如果有帮助,我在C++中的代码是:

用于(int i=0;i
主要问题是随机生成
m
节点的子集,其中每个节点都具有所需的(非均匀)被选择概率

一种简洁的方法是将权重列表映射到一个权重列表,然后选择
m
最小的数字。这可以使用函数完成。将根据需要选择权重
w_1
的节点,而不是概率
w_1/(w_1+w_2)
权重
w_2
的节点

此解决方案称为“”,是由于

随机导入
def随机_子集_与_权重(权重,m):
映射的_权重=[
(随机指数变量(w),i)
对于枚举中的i,w(权重)
]
返回{i for i,i in sorted(mapped_weights)[:m]}
def barabasi_albert(北、南):
#在m个顶点上使用完整图初始化
邻域=[set(range(m))-{i}表示范围(m)中的i]
度数=[m-1表示范围内的i(m)]
对于范围内的i(m,n):
n_近邻=随机_子集_,带有_权重(度,m)
#添加具有后边缘的节点
neights.append(n_neights)
度。附加(m)
#添加前边缘
对于j in n_邻居:
[j].添加(i)
度[j]+=1
回乡
例如:

>>从pprint导入pprint
>>>pprint(barabasi_albert(30,3))
[{1, 2, 3, 4, 5, 7, 8, 17},
{0, 2, 3, 5, 8, 12, 15, 16, 17, 23},
{0, 1, 3, 4, 6, 9, 11, 13, 14, 16, 17, 18, 19, 20, 22, 24, 26, 27},
{0, 1, 2, 4, 6, 7, 10, 20, 22, 23, 24, 25, 27},
{0, 2, 3, 5, 6, 8, 10, 11, 13, 21},
{0, 1, 4, 7, 9, 19, 29},
{10, 18, 2, 3, 4},
{0, 3, 5, 15, 23, 29},
{0, 1, 4, 9, 11, 13, 21, 28},
{8, 2, 26, 5},
{21, 3, 4, 12, 6},
{2, 4, 8, 12, 14, 15, 18, 25},
{1, 10, 11, 14},
{8, 16, 2, 4, 20},
{2, 11, 12},
{19, 1, 11, 7},
{24, 1, 2, 13},
{0, 1, 2},
{2, 11, 6},
{2, 5, 15},
{29, 2, 3, 13, 22},
{8, 10, 26, 4},
{27, 2, 3, 20},
{1, 3, 25, 7},
{16, 2, 3},
{3, 11, 23},
{9, 2, 28, 21},
{2, 3, 28, 22},
{8, 26, 27},
{20, 5, 7}]
要通过更改计算权重的公式来调整算法,只需使用您自己的公式计算权重列表,并使用该公式而不是

集合理解
{i for_u,i in sorted(mapped_weights)[:m]}
返回
mapped_weights
m
最低数字的一组索引。对列表进行排序需要O(n logn)时间;因此,在
n
顶点上生成图形的总体复杂性为O(n²logn)


如果您正在生成大型图形,则使用优先级队列或算法来选择
m
最低数字将更有效;在这种情况下,总体复杂性为O(n²)。

非常感谢您的回复。我已经实现了一个不那么复杂的方法,我得到了以下结果:。绿点是实验结果,而红点是理论结果。不过我很担心,这两张图的最后部分(理论和实验)是不是应该互相吻合?或者这只是一个线性组合的问题?我不知道这张图显示了什么,你问我一个我没有见过的不同算法,所以我帮不上忙。也许将其作为一个单独的问题发布?绿点描绘了Barabasi-Albert模型产生的学位分布Pk。虽然我对这一点还不熟悉,但它应该是~k^(-3)一个用红点表示的关系。对于较小的k值,这两个图重合,但对于较大的k值,存在偏差。也许这是因为这里解释的线性宾宁:你是对的,我也许应该把它作为一个单独的问题发布