2017年7月8日土曜日

Watts-Strogatzモデルのネットワーク作成

土曜日あるある:平日に寝なさ過ぎて土曜日は昼まで寝ている。

【ネットワーク解析】
np.random.choice():replace=Falseで重複なし

今日はWatts-Strogatzモデルのネットワークを作成する関数。
ちゃんと作れているのかの検証が出来ないのでなんともいえないのだが、とりあえず何か隣接行列っぽいものを出力してくれる。Pythonでネットワークを可視化してくれるやつ絶対あるだろうし、その手のパッケージを探したほうがいいんだろう。いいんだろうけども、そんなん絶対WSモデル作る奴なんてあるだろうし、そういう意味で調べたら負けだと思っているが無駄である。
--------------------------------------------
import numpy as np

def mk_WSmodel(N, k_half, p, matrix):
    list=reorder(mk_extended_cycle(N, k_half, matrix=False))
    change_index=np.random.choice(list.shape[0], np.int(list.shape[0]*p), replace=False)
 
    for index in change_index:
        match=match_list(list, index, N)
        list[index, 1]=match[np.random.choice(match.shape[0], 1)]
     
    if matrix:
        list=list2matrix(list)
     
    return list

def mk_extended_cycle(N, k_half, matrix):
    list=np.zeros(2).reshape(1, 2)
    for i in range(N):
        j=1
        while j<=k_half:
            list=np.r_[list, np.array([i, i+j]).reshape(1, 2)]
            j=j+1  
    list=list[1:, :]%N
 
    if matrix:
        list=list2matrix(list)

    return list

def reorder(list):
    for i in range(list.shape[0]):
        if zero_one()==1:
            temp=list[i, 0]
            list[i, 0]=list[i, 1]
            list[i, 1]=temp
    return list

def match_list(list, index, N):
    match=np.ones(N)
    match[np.int(list[index, 0])]=0
    for i in range(list.shape[0]):
        if list[i, 0]==list[index, 0]:
            match[np.int(list[i, 1])]=0
        elif list[i, 1]==list[index, 0]:
            match[np.int(list[i, 0])]=0
    return np.arange(0, N, 1)[match==1]

def zero_one():
    return np.random.choice(2, 1)

def list2matrix(list):
    link=np.zeros(N*N).reshape(N, N)
    for i in range(list.shape[0]):
        link[np.int(list[i, 0]), np.int(list[i, 1])]=1
        link[np.int(list[i, 1]), np.int(list[i, 0])]=1
    return link

0 件のコメント:

コメントを投稿