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]
添加回答
舉報