networkX
問題を解決する必要はありませんnumpy
。背後にある数学を理解していれば問題を解決できます。無向で重みのないグラフは、常に [0,1] 隣接行列で表すことができます。nth
この行列の累乗は、次のステップからのステップ数を表し(i,j)
ますn
。adj の行正規化形式であるマルコフ行列を使用できます。マトリックス。この行列の累乗は、グラフ上のランダム ウォークを表します。グラフが小さい場合は、行列の累乗を取り、(start, end)
関心のあるインデックスを調べることができます。最終状態を吸収状態にし、ウォークがスポットに到達すると、それは逃れられません。各パワーn
で、 から拡散する確率が得られます(i,j)
。ヒット時間は、この関数から計算できます (正確な離散ステップのヒット時間)。
以下は、エッジ リストによって定義された単純なグラフの例です。最後に、このヒット時間関数をプロットします。参照ポイントとして、これは使用されるグラフです。

from numpy import *
hit_idx = (0,4)
# Define a graph by edge list
edges = [[0,1],[1,2],[2,3],[2,4]]
# Create adj. matrix
A = zeros((5,5))
A[zip(*edges)] = 1
# Undirected condition
A += A.T
# Make the final state an absorbing condition
A[hit_idx[1],:] = 0
A[hit_idx[1],hit_idx[1]] = 1
# Make a proper Markov matrix by row normalizing
A = (A.T/A.sum(axis=1)).T
B = A.copy()
Z = []
for n in xrange(100):
Z.append( B[hit_idx] )
B = dot(B,A)
from pylab import *
plot(Z)
xlabel("steps")
ylabel("hit probability")
show()
