システムとモデリング

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

Juliaで可到達行列をレベル分けして並び替える

Design Structure Matrixのシーケンシング関連の記事です。今回の内容は以下の記事をJuliaで自動化したものになります。

otepipi.hatenablog.com

可到達行列を並び替えて下三角行列に近い形にします。

並べ替える前の可到達行列は以下のような形になります。

f:id:Otepipi:20190526082719p:plain

Juliaでの実装

Juliaでのプログラムは以下のようになります。

using Seaborn

Reachable=[ 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0;
1 1 1 1 1 0 0 1 1 0 0 0 0 0 0;
1 1 0 1 1 0 0 0 1 0 0 0 0 0 0;
0 1 0 0 1 0 0 0 0 0 0 0 0 0 0;
0 1 0 0 0 1 0 0 0 0 0 0 0 0 0;
1 1 1 1 1 0 1 1 1 0 0 0 0 0 0;
1 1 1 1 1 0 0 1 1 0 0 0 0 0 0;
1 1 0 1 1 0 0 0 1 0 0 0 0 0 0;
0 1 0 0 1 1 0 0 0 1 0 0 0 0 0;
1 1 1 1 1 0 1 1 1 0 1 0 0 0 0;
1 1 1 1 1 0 1 1 1 0 1 1 0 0 0;
1 1 0 1 1 0 0 0 1 0 0 0 1 0 0;
0 1 0 0 1 1 0 0 0 1 0 0 0 1 0;
0 1 0 0 1 1 0 0 0 1 0 0 0 0 1];


original = copy(Reachable);
(DSMsize,) = size(Reachable);
valuesDSM = collect(1:DSMsize);
count = 0;
level = zeros(Int,DSMsize);

while count < DSMsize
    
R = Reachable;
A = Reachable';
RA = R .* A;
(RAsize,) = size(RA);
elements = collect(1:RAsize);

    for i = 1 : RAsize
        
        if RA[i,:] == R[i,:];
            global count += 1;
            global level[count] = valuesDSM[i];
            global elements[i] = 0;
        end
    end

elements = filter(x-> x > 0, elements);
global Reachable = Reachable[elements , elements];
global valuesDSM = valuesDSM[elements];

end

orderedReachable = original[level,level]

heatmap(orderedReachable,annot=true, cbar=false,square=true,cmap="Blues",linewidths="0.5",linecolor="grey",xticklabels = level, yticklabels = level )
plt.savefig("orderedReachable.png",bbox_inches="tight");

これにより並べ替え済みの可到達行列orderdReachableは以下のように出力されます。

julia> orderedReachable
15×15 Array{Int64,2}:
 1  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 0  1  0  0  0  0  0  0  0  0  0  0  0  0  0
 0  1  1  0  0  0  0  0  0  0  0  0  0  0  0
 0  1  0  1  0  0  0  0  0  0  0  0  0  0  0
 1  1  1  0  1  1  0  0  0  0  0  0  0  0  0
 ⋮              ⋮              ⋮
 0  1  1  1  0  0  1  0  0  0  0  1  0  0  0
 1  1  1  0  1  1  0  1  1  0  0  0  1  0  0
 1  1  1  0  1  1  0  1  1  0  0  0  1  1  0
 1  1  1  0  1  1  0  1  1  0  0  0  1  1  1

ヒートマップにすると以下のようになります。

f:id:Otepipi:20190601175407p:plain

無事下三角行列形に並び替えられているのがわかります。

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