Design Structure Matrixのシーケンシング関連の記事です。今回の内容は以下の記事をJuliaで自動化したものになります。
可到達行列を並び替えて下三角行列に近い形にします。
並べ替える前の可到達行列は以下のような形になります。
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
ヒートマップにすると以下のようになります。
無事下三角行列形に並び替えられているのがわかります。
今回はここまでにします。