1 回答

TA贡献1804条经验 获得超7个赞
如果我理解正确的话,这可以通过使用邻接矩阵的矩阵幂的单线公式来完成。
根据您的原始代码片段,您似乎有一些n
节点网络,邻接信息存储为中的列表列表adjacency
,并且您有一个r
与每个节点相关联的值,这样它在迭代时的值k+1
是每个节点beta
的总和的r
倍数它的邻居在 iter k
。(你的循环在相反的方向构造它,但同样的事情。)
如果您不介意将您的adjacency
列表列表改造成更标准的邻接矩阵,例如A_ij = 1
ifij
是邻居,否则为 0,那么您可以使用一个简单的矩阵乘积完成内部两个循环,r[k+1] = beta * (A @ r[k])
。
按照这个逻辑,r[k+2] = beta * (A @ (beta * (A @ r[k]))) = (beta * A)**2 @ r[k]
或者一般来说,
r[k] = (beta * A)**k @ r[0]
让我们在一个小型网络上试试这个:
# adjacency matrix
A = np.array([
[0, 1, 1, 0, 0],
[1, 0, 1, 0, 0],
[1, 1, 0, 1, 0],
[0, 0, 1, 0, 1],
[0, 0, 0, 1, 0]
])
# initial values
n = 5
beta = 0.5
r0 = np.ones(n)
maxiter = 10
# after one iteration
print(beta * (A @ r0))
# [1. 1. 1.5 1. 0.5]
# after 10 iterations
print(np.linalg.matrix_power((beta * A), maxiter) @ r0)
# [2.88574219 2.88574219 3.4921875 1.99414062 0.89257812]
添加回答
举报