内容
- グラフラプラシアン$L$を利用すると、状態変数が収束する形の合意形成が可能
- 1次元だと1つの値に合意形成された
- 2次元に拡張すると、$x$ 軸方向と $y$ 軸方向で合意形成され、$N$個のペア $(x_i, y_i)$ が合意形成されるはず
- 実際に確認してみる
下準備
-
$N$個の状態変数 $(x_i, y_i)$ を乱数で生成するスクリプトを用意
- CircleSimというモジュールにしておいた(機能が貧弱だけど)
- ファイル置き場: https://github.com/cocomoff/TIL/blob/master/julia/sim/circlesim.jl
-
実装している機能
- 以下の操作を$N$点分繰り返して、乱数位置を作成
- $\theta$を$[0, 2\pi]$の範囲から選択
- 実装上は$\Delta\theta$を受け取って、$0:\Delta\theta:2\pi$ からサンプリングする
- 位置がだいたい円上になるように、$[R_{min}, R_{max}]$の範囲から選択
- 実装上は$\theta$と同じく$\Delta r$の刻み幅でサンプリングする
- $\theta$を$[0, 2\pi]$の範囲から選択
- 2点 $(i, j)$ がしきい値$T$以下の位置にある場合、無向グラフの辺を置く
- 以下の操作を$N$点分繰り返して、乱数位置を作成
-
使ってみるとこういう感じになる
using CircleSim
N = 50
T = 3.0
points = generate(N)
edges = getedges(points, T=T)
circleplotedges(points, edges)
- 生成される図の例
- 作図機能は本当はアニメーションGIFが描けるようにしたかったけど、PyPlotでやるのが面倒な気がした(未調査)ので、アニメーションGIFの実装は諦めた
X軸、Y軸に関した合意形成結果
-
事前に試した例題と同様に、合意形成される
-
X軸
- Y軸
二次元プロット
-
最初のうち30ステップ程度から適当に選んできた収束様子は次のようになる
-
ここはアニメーションが作りたかった。。。
-
最初の5ステップ
- 30ステップ後(だいたい集まってきている)
コード
using CircleSim
N = 50
T = 3.0
points = generate(N)
edges = getedges(points, T=T)
# make (N, 2) matrix
xy = zeros(N, 2)
for i in 1:N
p = points[i]
xy[i, 1] = p.x
xy[i, 2] = p.y
end
# adjacency matrix, graph laplacian
A = zeros(N, N)
for i = 1:N, j in edges[i]
A[i, j] = 1
A[j, i] = 1
end
D = diagm(squeeze(sum(A, 2), 2))
Δ = maximum(D)
L = D - A
# simulation for both X (xy[:, 1]) and Y (xy[:, 2])
Δt = 0.05
tf = 10
xx = []
yy = []
for t in 0:Δt:tf
push!(xx, xy[:, 1])
push!(yy, xy[:, 2])
Δx = -L*xy[:, 1]
Δy = -L*xy[:, 2]
xy[:, 1] += Δx * Δt
xy[:, 2] += Δy * Δt
end