ヴォロノイさんのネットワークについて

April 2020 · 3 minute read

※前回の画像から。コンテナからターミナルをホストの画面に表示する様子 前回のコンテナ内からターミナルを起動する図

こんにちは。RockinWoolです。東京のコロナは収まってきましたが、自分の身近では感染が広がっている気がするので気を引き締めてGEEKをしていたいですね!

さて、今回は結構マイナーな話になってしまうと思いますので、全然興味ないと思ったらすぐに退避してください。
今回作成するプログラムは、簡単にいうと2つのネットワークを作成するものです。
一つ目はVoronoi図と呼ばれるものです。これはxy平面上にランダムにn個の点をばらまいて、2点間の距離が等しくなるところに境界線を引いていく・・というものになります。
これを簡単に実装するにはpythonのscipyライブラリ内にあるscipy.spatialを活用すればそれほど難しくありません。
二つ目はこのVoronoi図からもう一度Voronoi図を作成すした図です。まったく意味がわからないと思うのですが、これにより領域同士がどのように隣接しているのかを表現できるのではないか・・・?と期待してのものです。
それでは早速やっていきます。まず、単純なVoronoi図を表示する部分はこのようにしました。

from scipy.spatial import Voronoi, voronoi_plot_2d
import numpy as np
import matplotlib.pyplot as plt

maxvalue = 100
number_of_points = 100
A=np.array([[np.random.rand()*maxvalue,np.random.rand()*maxvalue] for i in range(number_of_points)])
vor = Voronoi(A)
voronoi_plot_2d(vor,show_points = False)
plt.show()

多分こんな感じで大丈夫だと思います。これを実際に走らせるとこんな感じの図形が出てきます。
Voronoi図

ちなみに最後のshow_pointsをなくせば、voronoi図の境界の交点に点がプロットされます。次に作成する図はこの点がどの領域と隣接しているのかを利用して作成します。
ちなみに今回使用していませんがVoronoiライブラリにはほかにもいくつか便利なものがあるので、ここにメモって置きます

print(vor.points)#元の点の座標
print(vor.vertices)#Voronoiの点の座標
print(vor.ridge_vertices)#Voronoiのリンク。-1が外部とのリンクを示す
print(vor.ridge_dict)#どの点とどの点が隣接しているかを辞書型で表示

次にVoronoi図の領域間の隣接関係をネットワークに直します。以下のようにコードを書くとこのような図が出力されます。

pos = vor.vertices
illigal_points = []
N = [i for i in range(len(pos))]
for i in range(len(pos)):
    if(0 > pos[i][0] or maxvalue  < pos[i][0]):
        illigal_points.append(i)
    elif(0 > pos[i][1] or maxvalue  < pos[i][1]):
        illigal_points.append(i)
G = nx.Graph()
E = vor.ridge_vertices
G.add_nodes_from(N)
G.add_edges_from(E)
G.remove_node(-1)
G.remove_nodes_from(illigal_points)

#--グラフを返す--#
fout.figure_out(G,pos,'Voronoiz')

ここで使用したfigure_out関数は本当に適当にmatplotlibで書けば良いと思います。

Voronoi図2

こんな感じで図が出力されました。 ということで今回の実験は終了です。ここまで見てくださってありがとうございました。