隣接行列について
過去に隣接行列についてまとめたブログがあるので、隣接行列についてはこちらをご覧ください。
↓を参照しておきます。
隣接行列の積をPythonで表現する方法
今回も、この無向グラフを用いて考えていきます。
そのため、隣接行列は↓のようになりますね。
経路数を求めるには、隣接行列の積を求める必要があります。
隣接行列は必ず正方行列となるため、正方行列の積を求める関数「multiply」を作成します。
また、行列計算で用いられる方法である。二重リストを用いて隣接行列Aを表現します。
これらをPythonで表現すると↓のようになります。
N=4#節点数(節点0,1,2,3の4つ) def multiply(c,a,b):#N次正方行列の積を求める関数 for i in range(N): for j in range(N): s=0 for k in range(N): s+=a[i][k]*b[k][j] c[i][j]=s #長さ2の経路数を表す行列Cを作成 C=[[0 for j in range(N)] for i in range(N)] #隣接行列Aを2重リストを用いて表現 A = [[0,1,1,0], [1,0,0,1], [1,0,0,1], [0,1,1,0]] # 隣接行列 A multiply(C,A,A) # 行列Cを計算(C=A*A) #行列Cを表示 for i in range(N): for j in range(N): if j == N-1: print(" ",C[i][j]) else: print(" ",C[i][j],end="")
これを実行すると、
手計算した場合と比較しても、上手くいっていることがわかります。
正常に「長さ2」の経路数が求められています。
「長さ3」の経路数をPythonで求める方法
「長さ3」の経路数を表す行列Fを、隣接行列を用いて手計算で求める場合、
となります。
これを先ほどのPythonプログラムコードを用いて、表現したいと思います。
N次正方行列の積を求めてくれる 関数「multiply」 を使えば、
行列Fも簡単に求められます。
N=4#節点数(節点0,1,2,3の4つ) def multiply(c,a,b):#N次正方行列の積を求める関数 for i in range(N): for j in range(N): s=0 for k in range(N): s+=a[i][k]*b[k][j] c[i][j]=s #長さ2の経路数を表す行列Cを作成 C=[[0 for j in range(N)] for i in range(N)] #長さ3の経路数を表す行列fを作成 F=[[0 for l in range(N)] for i in range(N)] #隣接行列Aを2重リストを用いて表現 A = [[0,1,1,0], [1,0,0,1], [1,0,0,1], [0,1,1,0]] # 隣接行列 A multiply(C,A,A) # 行列Cを計算(C=A*A) multiply(F,C,A) # 行列Fを計算(F=C*A) #行列Fを表示 for i in range(N): for j in range(N): if j == N-1: print(" ",F[i][j]) else: print(" ",F[i][j],end="")
青字の所が、先ほどのプログラムコードからの変更点です。
行列Fを求めるコードを追加し、表示する2重リストをFに変更しただけですね。
長さ3以降の経路数を表す行列も、同じように求めていくことができます。
コメント