シフト表を作ってみた
大学の後輩ちゃんが市役所の窓口で働いているのですが,
シフト表を作るのが難しくて毎月作成に時間がかかるのと, 市場のアプリを使っても要件が満たない.
ということで, 作ってくださ〜い,と可愛く頼まれたので作りました.
要件
- 窓口は2つ(メイン業務とサブ業務)。それが朝と昼に開催.空きを作ることは不可.
- A:朝メイン
- B:朝サブ
- C:昼メイン
- D:昼サブ
- 役割は3つ
- 1:正社員(朝昼[A,B,C,D]ともに就業可能)
- 2:時短社員A(朝[A,B]のみ就業可能)
- 3:時短社員B(昼[C,D]のみ就業可能)
- 仕事量は基本的に同等にする(公務員らしい!)
- 1人当たりのメインとサブの数も同等にする(公務員らしい!)
- 1人が仕事できるのは1日1回まで
完成図
だいたいこんな感じでできました.
SpreadSheetで作りました.
プログラムの概要
5時間ぐらいで作ったので, 雑すぎて見せれるレベルでは無いのです...
- 営業日をもとめる
- 祝日も判定できると尚よし
- 総仕事量をもとめる
- 営業日*役割(A,B,C,Dの4つ)
- 一人当たりの仕事量をもとめる
- まず平等数(基本的には最小公約数のもとめ方と同じ)
- 総数と上記の総和に差がある時はその分を各人に配賦
- A,B,C,Dを各人に配賦していく
- その際,各人の残りの配賦数が多いもの順から配賦
基本的には, これだけうまくいきます.
もっと単純に作ろうと思ったら人数分の配列に[A,B,C,D]をシャッフルさせながら入れていき,
エラーが出なくなったなるまで順番でズラしていくという"総当たり法"というやり方がありますが,
まぁそんな激しいことをしなくても十分作れます.
最後に
シフト表作成とかは, 経営工学とかオペレーションズ・リサーチと呼ばれるジャンルの初歩の初歩ですが,
自分で作ってみて意外と難しかったです.
非エンジニアの人と酒とか飲んで話していると経営工学チックなところでみんな悩んでいるなと印象があるので,
もっと汎用的な仕様にしたり, SpreadSheetでないアプリにしてみたいですね.
追記
調べたら リクルートさんのAirSHIFTっていうアプリを使えばものすごく便利やん!と後から気づく....
と言っても、平等にシフトを配賦するという機能は搭載してなさそうでしたが...
このアプリの追加機能作ってみたいですね.