朝日ネット 技術者ブログ

朝日ネットのエンジニアによるリレーブログ。今、自分が一番気になるテーマで書きます。

席替えをGraphvizに任せてみた

開発部の8lukaです。

当社オフィスの開発部執務スペースでは、各自にパーティションつきの座席とデスクトップPCが割り当てられています。 2021年2月現在リモートワーク中心の業務体制が敷かれている状況ではオフィスの座席の物理的な位置の意味は薄いのですが、 出社時には従事している案件に応じて近い位置でやりとりができることが重要で、時々席替えが実施されます。

今回は、そんな席替えの効率化の試みについての簡単なレポートです。

席替えの段取り

席を移動するといっても、机ごと動かすことは稀で、大抵は機材や荷物を各メンバーが新しい席へ運んでいくことになります。 まずある人が荷物を移し、その空いた席へ別の人が入ってくる。この繰り返しです。 最初に動くのは誰なのか。どことどこは同時に移動できる、あるいは同時に移動しなければならないのか。スムーズな席替えのためには、段取りが欠かせません。

f:id:an8luka:20210118180401p:plain
新旧の座席と移動の例

この画像例の規模ならプリントアウトを手描きで辿るなりで何とでもなるのですが、ある日の席替えでは数十人が一斉に移動することになり、段取りが複雑化してしまいました。席替えを主導する立場の方は多忙を極める中、まもなく開始時刻を迎えてしまいます。開発部のみんなが困ってしまう前に、計算機の力で助けになれないでしょうか?

Graphvizで段取りを可視化する

ここで、グラフを可視化するGraphvizのことを思い出しました。これを使えば 席替えをグラフで表現することで、段取りが可視化される かもしれません。

直前の小さな例で試してみましょう。席替えは次のようなグラフになります1

% cat sekigae-small.dot
digraph sekigae {
graph [rankdir = LR];
node [shape = box];
1 2 3 4 5 6;
node [shape = ellipse];
// before
1 -> 社員A  2 -> 社員B  3 -> 社員C
4 -> 社員D  5 -> 社員E
// after
社員C -> 1  社員D -> 2  社員A -> 3
            社員B -> 5  社員E -> 6
}

冒頭に書式設定が数行ありますが、そのあとは

  • 移動前の座席については 席番号 -> 人
  • 移動後の座席については 人 -> 席番号

ひたすら書き並べるのみです。わかりやすいでしょ?

それでは Graphviz で可視化します。コマンドは dot です。

% dot -Tpng sekigae-small.dot > sekigae-small.png

f:id:an8luka:20210118215329p:plain
席替え(例)の可視化結果

Eさんがまず動かなければならないことや、AさんとCさんはえいやっと入れ替わってもらわないといけなさそうなことなどが、一目瞭然ですね。

実際の席替えは、以下のようなグラフになりました。

% cat sekigae-large.dot
digraph sekigae {

node [shape = box];
96 97 99 100 101 102 103 104 105 106 107 108
109 110 111 112 113 114 115 116 117 121 125
12 14 15;
node [shape = ellipse];

// before
12  -> 社員A  14  -> 社員B  96  -> 社員C  97  -> 社員D  99  -> 社員E
100 -> 社員F  101 -> 社員G  102 -> 社員H  103 -> 社員I  104 -> 社員J
105 -> 社員K  106 -> 社員L  107 -> 社員M  108 -> 社員N  109 -> 社員O
110 -> 社員P  111 -> 社員Q  112 -> 社員R  113 -> 社員S  114 -> 社員T
115 -> 社員U  116 -> 社員V  117 -> 社員W  121 -> 社員X  125 -> 社員Y
                                                        
// after                                                
社員E -> 12   社員A -> 14   社員B -> 15   社員N -> 96   社員L -> 97
社員M -> 99   社員O -> 100  社員F -> 101  社員P -> 102  社員Q -> 103
社員C -> 104  社員D -> 105  社員S -> 106  社員U -> 107  社員V -> 108
社員W -> 109  社員T -> 110  社員I -> 111  社員J -> 112  社員K -> 113
社員H -> 115  社員G -> 116  社員R -> 117  社員Y -> 121  社員X -> 125
}

その可視化は次のとおりです。 Graphviz の サポートするレイアウトごとにコマンドが何種類かあります が、今回は neato がいい感じでした。

% neato -Tpng < sekigae-large.dot > sekigae-large.png

f:id:an8luka:20210118173246p:plain
席替え(本番)の可視化結果

1本の長いチェーンと4つのループがあります。 特に一番大きなループは、どこか空きスペースに荷物を退避する等の工夫が必要そうです。この中にいる人たち2、がんばってー!

まとめ

  • 座席表を宣言的に記述することで、席替えを可視化できました。Graphvizすごい。
    • タスクの依存関係として捉えると「Aさんが1番から3番へ移動する」ような記述が一見して最小単位に思われるかもしれませんが、今回は結果的に、それすらGraphvizが導出しています。
  • コマンドラインで画像を生成するのも簡単ではあるのですが、技術者以外でも気軽に使えるように Viz.js 等でweb化するのも楽しそうです。

採用情報

朝日ネットでは新卒採用・キャリア採用を行っております。

新卒採用 キャリア採用|株式会社朝日ネット


  1. DOT言語によるグラフの記述です。席や人を頂点とし、辺は移動を表すことにします。

  2. 筆者も入ってました。このあとめちゃくちゃがんばった