与えられたノード数Nと各ノード間にリンクが出来る確率pから作成されたランダムネットワークを返す関数mk_random_network(N, p)
与えられた隣接行列が示すネットワークが分断されている場合に、各分団(?)間にリンクを追加して連結した隣接行列を返す関数connect_network(link)
数日間のまとめ。
---------------------------------------------
import numpy as np
inf=np.float('inf')
def count_network(link):
group=np.zeros(link.shape[0])
i=0
while np.min(group)==0:
i=i+1
group[dykstra_linkmatrix(link, np.argmin(group))!=inf]=i
return i
def dykstra_linkmatrix(link, start):
end=np.zeros(link.shape[0])+inf
pre_end=end.copy()
end[start]=0
while np.sum(end==pre_end)!=end.shape[0]:
pre_end=end.copy()
length=link+end.reshape(link.shape[0], 1)
length[:, end!=inf]=inf
if np.min(length)!=inf:
end[np.argmin(length)%link.shape[0]]=np.min(length)
return end
def mk_random_network(N, p):
link=np.zeros(N*N).reshape(N, N)+inf
for i in range(N):
link[i, i]=inf
i=1
while i<N:
j=0
while j<i:
if np.random.uniform(0.0, 1.0, 1)<=p:
link[i, j]=1
link[j, i]=1
j=j+1
i=i+1
return link
def connect_network(link):
group=np.zeros(link.shape[0])
i=0
while np.min(group)==0:
i=i+1
group[dykstra_linkmatrix(link, np.argmin(group))!=inf]=i
while np.sum(group)!=group.shape[0]:
con_group=np.random.choice(np.int(np.max(group)), 2, replace=False)+1
indexs_group1=np.arange(0, group.shape[0], 1)[group==con_group[0]]
index1=indexs_group1[np.random.choice(indexs_group1.shape[0], 1)]
indexs_group2=np.arange(0, group.shape[0], 1)[group==con_group[1]]
index2=indexs_group2[np.random.choice(indexs_group2.shape[0], 1)]
link[index1, index2]=1
link[index2, index1]=1
i=0
group=np.zeros(link.shape[0])
while np.min(group)==0:
i=i+1
group[dykstra_linkmatrix(link, np.argmin(group))!=inf]=i
return link
0 件のコメント:
コメントを投稿