介護施設のシフト作成を数理最適化で自動化した話|希望休・夜勤回数・連勤を守って自動生成

介護施設のシフト作成を数理最適化で自動化した話|希望休・夜勤回数・連勤を守って自動生成

記事
IT・テクノロジー
介護施設の勤務シフトは、毎月の作成に丸2日かかる仕事でした。

24時間365日、人が途切れてはいけない職場です。夜勤は必ず一定人数を置く、夜勤の翌日は必ず休み、連勤は続けすぎない、希望休はできるだけ通す、常勤とパートで回数の上限が違う。条件が10も20もあって、しかも全部を同時に満たす必要があります。

Excelの表とにらめっこして、1マス埋めては別のマスが破綻し、また戻る。作成担当の主任がこれに2日を使い、しかも出来上がったものを見ると「この人だけ連勤が多い」といった歪みが残る。よくある光景だと思います。

これを、数理最適化という手法で自動生成するようにしました。今は5分程度で出来上がります。


■ 数理最適化とは何か

難しそうな名前ですが、やっていることは単純です。

「守るべきルール」を全部書き出して、コンピュータに「このルールを全部満たす組み合わせを探して」と頼む。それだけです。総当たりで探すのではなく、探索を賢く打ち切りながら答えにたどり着く仕組みが用意されているので、条件が多くても現実的な時間で解が出ます。

私が使っているのはGoogleが公開しているOR-Toolsというツールの、CP-SATという機能です。無料で使えます。


■ ルールを2種類に分ける

大事なのは、ルールを「絶対に守るもの」と「できれば守りたいもの」に分けることです。

絶対に守るもの(守れなければシフトとして成立しない)
・各シフトに必要な人数を必ず配置する
・夜勤明けの翌日は必ず休みにする
・法定の休日数を確保する
・資格が必要な業務は有資格者を入れる

できれば守りたいもの(点数をつけて、なるべく良い方を選ぶ)
・希望休はできるだけ通す
・夜勤回数は職員間で偏らないようにする
・連勤はなるべく短くする
・特定の組み合わせの人は同じ日に入れたい/避けたい

この分け方をしておくと、条件が厳しすぎて答えが出ないときに、どこを緩めればいいかがはっきりします。


■ やってみて分かったこと

・人間が作ったシフトには、必ず偏りがある
 自動生成した結果と、それまで手で作っていたシフトを比べると、夜勤回数が特定の人に寄っていることが数字で見えました。悪意はなく、「この人は文句を言わないから」と無意識に頼っていたわけです。これが見えるようになっただけでも価値がありました。

・答えが出ないときが、いちばん有益
 条件を全部入れると解が出ない月があります。これは「その人員では、そもそもそのルールを全部は守れない」という事実を突きつけられているということです。採用が必要なのか、ルールを見直すべきなのか。判断の材料になります。

・完全自動より「たたき台」として使うのが現実的
 最後は人が微調整します。ただ、白紙から2日かけて作るのと、8割方できた表を1時間直すのとでは、負担がまるで違います。

・出力形式は現場に合わせる
 出来上がったシフトは、現場が普段使っているExcelの様式と、勤怠システムに取り込める形式の両方で出しています。ここを手作業に戻してしまうと、せっかくの自動化が台無しになります。


■ 応用の幅は広い

同じ考え方は、シフト以外にも使えます。訪問診療のルート組み、担当割り当て、当番表。「制約を守りながら、限られた資源をどう配分するか」という形の問題は、だいたい同じ枠組みに落とし込めます。


■ 導入するなら

必要なのは、まず「ルールを言葉にすること」です。ここが8割です。

普段は暗黙のうちに守っているルールを、全部書き出す。「なんとなくこうしている」を「必ずこうする」「できればこうする」に分類する。この作業さえできれば、プログラムに落とし込む部分は後からどうにでもなります。

逆に言えば、ルールが曖昧なままだと、どんなツールを入れてもうまくいきません。


シフト作成の自動化や、条件が複雑な割り当て業務の仕組み化については、ココナラの「医療・介護の事務をPythonで自動化します」でご相談を受け付けています。「うちのルールでも組めるのか」といった段階のご相談でも大丈夫です。まずは守りたい条件を教えてください。
サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す