Red Hatのソリューションアーキテクトの森です。
ビジネスにおける最適化問題を解決するソリューションとして、Business Optimizerがあることをご存知でしょうか?
Business Optimizerは、Red Hat Decision Manager に含まれるAI制約ソルバーです。限られたリソース内で、様々な制約を満たしつつ、最良の結果を得たいというようなケースにおいて、どの組合せが最適かを現実的な時間で探索することができます。
Business Optimizerのユースケースの一例
- 時短勤務など柔軟な働き方に対応した従業員のシフト作成
- スタッフのスキルを考慮した効率的なタスクアサイン
- 燃料コストを抑えてかつドライバーの作業を平準化した配送ルートの算出
- 電気代をできるだけ安く抑える機材稼働スケジュール
- クラウドサーバのコアやメモリを複数プロセスに効率よく割当
- 収容人数とテーマを考慮したカンファレンスのタイムテーブル作成
以下では、COVID-19に対処する医療関係者の勤務シフトを、Business Optimizer のコミュニティ版である Optaplanner を活用し、効率的にスケジューリングしたケースについてご紹介していきます。
この記事は、OptaPlanner のブログ記事、AI versus Covid-19: How Java helps nurses and doctors in this fightの翻訳記事です。
はじめに
病院のスケジュールは大変な作業です。医療従事者の幸福と健康を維持するためには、病気の日や休暇の要求を考慮に入れ、またシフト間の十分な休息時間を確保する必要があります。これは、新しい病気への曝露を最小限に抑え、病気に対するさまざまな感受性を持つ看護師を必要とするパンデミックにおいては、尚更そうだと言えます。病棟間の相互汚染を最小限に抑えた上で医療従事者の幸福を最大化する病院の勤務表を、OptaWeb Employee Rosteringを使用して、どのように迅速かつ効率的にスケジュールできるかを見てみましょう。
ドメイン
最初に、モデルのドメインを設定します :
Wardsとは、病院のセクションであり、それはCOVID-19病棟と非COVID-19病棟に分かれています。
Employeesとは、病棟に割り当てることができる医師と看護師であり、それぞれがCOVID-19に対して異なる感受性を持っています。(例えば、一部の看護師は高齢であるため、より感受性が高い)
Skillsとは、特定の病棟で働くためには、どのようなスキルを持っている必要があるかを説明するものです。
Shiftsとは、指定の時間に指定の病棟で満足される必要があるポジションのことで、その病棟のものに加えて追加のスキルが必要になる場合があります。(例えば、COVID-19病棟では、看護師と医師だけでなく、リポジトリー専門の看護師が必要です)
最後に、Availabilitiesとは、医療従事者がいつ仕事ができないか、仕事をしたいか、または休暇を申請しているかを説明しています。
以下のクラス図は、このドメインを表すJavaクラスを示しています :
制約条件
OptaWeb Employee Rosteringには、ニーズに応じて追加、変更、削除が可能な組み込み制約のセットが付属しています。
いくつかの例を挙げてみましょう :
医療従事者は時間の重複する2つのシフトで作業することはできません。 一人の医療従事者が、同時に2つの場所で勤務をすることについて、想像できるでしょうか? これはハード制約であり、制約を満たすことができない場合は実現が不可能です。
医療従事者は、可能な限り、希望する日に勤務してはなりません。 但し、医療従事者が休日に仕事をしているときでもスケジュールは実行可能で、これはソフト制約です。
医療従事者のCOVID-19に対する感受性が高いほど、COVID-19病棟での勤務は少なくなります。これは別のソフト制約です。
これらとその他の制約は、 Drools制約ファイルにあります。これらは、OptaPlannerのConstraint Streams APIを使用してJavaで実装することもできます。
アプリケーションを使用する
OptaWeb Employee Rostering の GitHub リポジトリをクローンし、COVID-19 ブランチに切り替え、README の指示に従うことで、ローカルに OptaWeb Employee Rostering を構築して実行することができます。 OptaWeb Employee Rostering には、バックエンドとフロントエンドの両方が付属しています。 バンドルされているフロントエンドを使うこともできますし、バックエンドのRESTエンドポイントを使うこともできます。
アプリケーションにはデモ用のデータが含まれており、アプリケーションをすぐに試すことができます。 ここでは、サンプルのテナントの1つを使用して、その勤務表のスケジュールを解決してみましょう。
"Scheduling"のタブに移動し、スコアの右にある(?)のボタンをクリックすると、すべての制約のサマリーが表示されます。 リストの一番下に、"Assign every shift"という制約が1116マッチしていることがわかりますが、これは1116の未割り当てシフトがあることを意味します。 今すぐに、これを修正してみましょう。
制約のサマリーのポップアップを閉じて、"Schedule"ボタンをクリックします。
OptaPlannerは、勤務表のスケジュールの解決を開始します。約30秒後、あなたはこれ以上の未割り当てのシフトがないことがわかります。
つまり、OptaPlannerは、医療従事者が同時に2つのシフトを取得しないことを確認しながら、1116シフトのそれぞれに医療従事者を割り当て、すべての従業員は、各医療従事者が自分のシフトに必要なスキルを持っており、各医療従事者は、シフトの間に十分な休息を持っています。
手作業で1116シフトを割り当てることによって、実現可能なスケジュールを作ることを想像してみてください。
きっと30秒よりも長い時間がかかることでしょう!
スケジュール問題を解いている間、OptaPlannerはより良い解答を探し続け、少しずつスコアを上げていきます。
すでに何度かスケジュールが変わっているのを見たことがあるかもしれません。
ひとまず、解くのを中断しておきましょう。
病棟セレクター(ツールバーの左側)をクリックして、病棟 "COVID-19病棟1" に変更します。
シフトの上部に小さなマークがあり、その医療従事者のCOVID-19に対する感受性を表しています。
盾は予防接種を受けた医療従事者、つまりCOVID-19対する免疫を獲得した人々を表しています。
空に近い丸は、その医療従事者がCOVID-19に対する感受性が低いことを意味し、円が塗りつぶされているほどCOVID-19に対する感受性が高いことを意味します。
最後に、赤い丸は、医療従事者がCOVID-19の影響を非常に受けやすいため、COVID-19の病棟に入れてはいけないことを意味します。
COVID-19の病棟に極端なリスクのある従業員がいないことに注目してください。 さらに、COVID-19の病棟のシフトのほとんどは、予防接種を受けているか、リスクの低い医療従事者で構成されています。
ちょっと待ってください、電話がかかってきました。
Beth P. Wattが風邪をひいたため、今週の土曜日に彼女のシフトを作ることができません。
幸いにも、OptaPlannerはこのような突然の変更にも対応することができます。
"Availability" タブに移動します。
医療従事者セレクター(ツールバーの左側)をクリックして、 "Beth P. Watt"と入力します。
週セレクターの時計アイコンをクリックして、現在の週にジャンプします。
カレンダーの「土曜日」ラベルの下の領域をクリックします。
これにより、土曜日の医療従事者 Beth P. Watt の新しい出勤不可制約が作成されます。
ツールバーにスケジュールが実行不可能であることを示すメッセージが表示されます。 これは、Beth P. Wattが土曜日は出勤できませんが、既に土曜日のシフトに割り当てられているためです。 それを修正しましょう。 "Adjustments" タブに移動し、"Reschedule"をクリックします。 OptaPlannerはすぐに別の医療従事者にBeth P. Wattの2つのシフトを割り当てることにより、スケジュールが修正をしたことに気づくはずです。 また、OptaPlannerは、これらの2つのシフトのみを変更したことに注目してください。 OptaPlannerは公開済シフトの変更の数を最小限に抑えるように努めます。 (結局のところ、看護師や医師は、彼らのスケジュールを前提に計画された、彼らの生活を持っているのです)
このアプリケーションで実行できる他のいくつかのこと:
医療従事者を指定のシフトに「固定」できます。つまり、OptaPlannerはスケジュール問題の解決時にそのシフトの医療従事者を変更しません。
医療従事者のローテーションを作成して、日常生活の一貫性を高め、新しいシフトの自動プロビジョニングを可能にすることができます。
結論
これまでに見たように、OptaWeb Employee Rosteringは、医療従事者へのCOVID-19の影響を最小限に抑えるだけでなく、彼らの幸福度を最大化するように、簡単に勤務表を作成して最適化することができます。 このアプリケーションのソースコードは、OptaWeb Employee Rostering GitHubリポジトリにあります。 OptaPlannerには、新しい制約を追加することに対して、柔軟で簡単な方法があり、COVID-19に付属の新しい制約に対応するためにOptaWeb Employee Rosteringを素早く修正することができたからこそ可能になったものです。Geoffrey De Smet氏のアプリケーションに関する話にも、興味深い話題があると思います。