1 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果我理解正確的話,這可以通過(guò)使用鄰接矩陣的矩陣冪的單線公式來(lái)完成。
根據(jù)您的原始代碼片段,您似乎有一些n
節(jié)點(diǎn)網(wǎng)絡(luò),鄰接信息存儲(chǔ)為中的列表列表adjacency
,并且您有一個(gè)r
與每個(gè)節(jié)點(diǎn)相關(guān)聯(lián)的值,這樣它在迭代時(shí)的值k+1
是每個(gè)節(jié)點(diǎn)beta
的總和的r
倍數(shù)它的鄰居在 iter k
。(你的循環(huán)在相反的方向構(gòu)造它,但同樣的事情。)
如果您不介意將您的adjacency
列表列表改造成更標(biāo)準(zhǔn)的鄰接矩陣,例如A_ij = 1
ifij
是鄰居,否則為 0,那么您可以使用一個(gè)簡(jiǎn)單的矩陣乘積完成內(nèi)部?jī)蓚€(gè)循環(huán),r[k+1] = beta * (A @ r[k])
。
按照這個(gè)邏輯,r[k+2] = beta * (A @ (beta * (A @ r[k]))) = (beta * A)**2 @ r[k]
或者一般來(lái)說(shuō),
r[k] = (beta * A)**k @ r[0]
讓我們?cè)谝粋€(gè)小型網(wǎng)絡(luò)上試試這個(gè):
# 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]
添加回答
舉報(bào)