システムとモデリング

modelica, Julia, Design Structure Matrix, SysML, 他モデリング全般について。

DSMを置換行列で並べ替える

前回の記事で行列を並べ替える置換行列を勉強しましたが、これをDSM(Design Structure Matrix)に応用してみます。

otepipi.hatenablog.com

例題

以下のDSMを対角線上に非ゼロ要素が集まるように行列演算で並べ替えます。

f:id:Otepipi:20190512195427p:plain

また、今回のDSMの隣接行列は以下のような7x7行列になります。


A =
\begin{bmatrix}
0 & 1 & 0 & 0 & 1 & 1 & 0\\\
0 & 0 & 0 & 1 & 0 & 0 & 1\\\
0 & 1 & 0 & 1 & 0 & 0 & 1\\\
0 & 1 & 1 & 0 & 1 & 0 & 1\\\
0 & 0 & 0 & 1 & 0 & 1 & 0\\\
1 & 0 & 0 & 0 & 1 & 0 & 0\\\
0 & 1 & 1 & 1 & 0 & 0 & 0
\end{bmatrix}

並べ替えるには以下のように各行を置換してやる必要があります。また、列についても同様の置換を行う必要があります。

置換前 置換後
B行 F行
C行 E行
E行 B行
F行 C行

この置換を行うための置換行列Pを作成します。この置換行列Pは7x7の単位行列Iから、表のように該当する行を置換した行列になります。


I =
\begin{bmatrix}
1 & 0 & 0 & 0 & 0 & 0 & 0\\\
0 & 1 & 0 & 0 & 0 & 0 & 0\\\
0 & 0 & 1 & 0 & 0 & 0 & 0\\\
0 & 0 & 0 & 1 & 0 & 0 & 0\\\
0 & 0 & 0 & 0 & 1 & 0 & 0\\\
0 & 0 & 0 & 0 & 0 & 1 & 0\\\
0 & 0 & 0 & 0 & 0 & 0 & 1
\end{bmatrix}
,
置換行列P =
\begin{bmatrix}
1 & 0 & 0 & 0 & 0 & 0 & 0\\\
0 & 0 & 0 & 0 & 0 & 1 & 0\\\
0 & 0 & 0 & 0 & 1 & 0 & 0\\\
0 & 0 & 0 & 1 & 0 & 0 & 0\\\
0 & 1 & 0 & 0 & 0 & 0 & 0\\\
0 & 0 & 1 & 0 & 0 & 0 & 0\\\
0 & 0 & 0 & 0 & 0 & 0 & 1
\end{bmatrix}

ここで、対角線上に非ゼロ要素が集まったDSMの隣接行列Bは以下のように求めることができます。


B = PAP^{t}

実際、この演算を行った後のDSMは以下のようになります。

f:id:Otepipi:20190512201734p:plain

グラフ表示

並べ替える前後のDSMをグラフで描画してみます。

並べ替える前

f:id:Otepipi:20190512203007p:plain

並べ替えた後

f:id:Otepipi:20190512203159p:plain

……隣接行列を並べ替えただけではグラフの描画は変わらないようです。

今回はここまでにします。

最後に今回使用したJuliaのコードを記載します。

using Seaborn

using LightGraphs

using GraphPlot

A=[ 0 1 0 0 1 1 0; 0 0 0 1 0 0 1; 0 1 0 1 0 0 1; 0 1 1 0 1 0 1; 0 0 0 1 0 1 0; 1 0 0 0 1 0 0; 0 1 1 1 0 0 0];

valuesA = ["A","B","C","D","E","F","G"];

P = zeros(7,7);

P[1,1] =1;

P[2,6] =1;

P[3,5] =1;

P[4,4] =1;

P[5,2] =1;

P[6,3] =1;

P[7,7] =1;

B = P * A * P';

valuesB = ["A","F","E","D","B","C","G"];

heatmap(B,annot=true, cbar=false,square=true,cmap="Blues",linewidths="0.5",linecolor="grey",xticklabels = valuesB, yticklabels = valuesB )

plt.savefig("DSMtest3.png",bbox_inches="tight");

GA = DiGraph(A)

GB = DiGraph(B)

gplot(GA,nodelabel = valuesA,nodelabelc= "black")

gplot(GB,nodelabel = valuesB,nodelabelc= "black")