2017年7月7日金曜日

2日坊主回避

【ネットワーク解析】
与えられたノード数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 件のコメント:

コメントを投稿