Middleware チャンネル


コールセンターのオペレーター、病院の看護士、工場の作業員など、シフト勤務の業務はたくさんありますが、そのシフト表を計画するために、担当するマネージャーは毎月かなりの時間を費やしています。この仕事は人間同士の利害を調整するので、コンピューターで計算するのが難しい領域とされてきました。

シフト管理の一番の問題点は、確定するまでのスピードです。前月の最終日までシフト表が確定せず、従業員は翌月の休みがなかなか計画できない、という不満をよく耳にしますよね。

シフトを計画する際、マネージャーの頭の中はさまざまな条件を「ちょうどいい」バランスに調整するよう、グルグルと回っています。

  • 従業員が休みを希望する日を外してシフトを入れる
  • 仕事の日数を公平に分散させる
  • 従業員のスキルを考慮して仕事を割り当てる
  • 契約条件に違反しないように仕事を割り当てる

などの条件を満たしながら、従業員の公平性・満足度などを最適な状態にしようと考えているはずです。

このマネージャーの思考ロジックに似た試行錯誤を、コンピューターで効率的にシミュレーションすることができるのが、今回ご紹介する「ビジネスリソースプランナー」です。

ビジネスリソースプランナーは、JBoss BRMSの1機能として提供されています。従来、人間が行っていた属人的な計画系業務において、「なるべく」最適な解をコンピューターが提示することで、最終的に人間が意思決定するまでのスピードを速めることを目的としています。名前のとおり「業務におけるリソースを最適に計画する」業務に適用できるものです。

今回はデモに含まれる「シフト管理デモ」を、分かりやすく日本語化したバージョンを使用して説明したいと思います。

実はこのデモ、「INRC2010 (International Nurse Rostering Competition 2010)」 という国際コンペティションの要件を忠実に実装しており、かなり現実に近い要件を考慮して計算できます。シフト計画の中でも複雑とされる、看護婦のシフト要件を題材にしており、以下の属性を考慮して最適なシフト表を作成します。

  • スキル:一般職、マネージャー職
  • シフトタイプ:早番、遅番、昼勤、夜勤、マネージャー昼勤
  • シフトパターン:遅番の次の日は昼勤、昼勤ー早番ー昼勤、など
  • 契約形態: フルタイム、75%、50%
  • 休日希望日(またはシフトタイプ)

条件に相当するものは、ビジネスリソースプランナーでは「制約」と呼ばれ、BRMSのルールとして記述されています(20パターンが事前定義されています)。制約には、絶対違反してはならない「ハード制約」と、なるべく違反しないようにする「ソフト制約」の2種類が定義されており、例として次のような制約があります。

  • ハード制約の例
    • 同じ人を1日に1回以上シフトを割り当ててはいけない。違反した場合は、ハード制約のスコアを−1点する
  • ソフト制約の例
    • 休日の希望日はなるべくシフトを割り当てない。違反した場合は、ソフト制約のスコアをX点減点する
    • スキルを指定したシフトの場合、なるべく該当スキルを持った人を割り当てる。違反した場合は、ソフト制約のスコアをY点減点する
    • 契約で定められた最大勤務日数はなるべく超えないように割り当てる。違反した場合は、超過した日数分のスコアを減点する

それでは早速セットアップしてみましょう。今回使用した環境は以下の通りです。

CPU MacBook Air 1.7GHz Intel Core i7
メモリ 8GB
OS Mac OS X El Capitan 10.11.4
JDK Oracle JDK 1.8.0_77-b03
Maven 3.3.9
JBoss BRMS 6.3.0.GA

 

まずは、現在最新版の6.3.0.GAのバージョンをベースに、シフト管理デモのみを日本語化したソースコードを、Githubからダウンロードします。(注意:このコードは今回の説明用に簡単に日本語化したもので、必要最低限の変更のみとなっています。)

Download URL: https://github.com/kkomazaw/optaplanner

kkomazaw02

ダウンロードしたZipファイルを任意の場所に展開し、直下のディレクトリに移動した後、Mavenでデモをビルドします。(事前にMavenの設定が必要です)

$ mvn clean install -DskipTests

次にoptaplanner-exampleディレクトリに移動し、サンプルデモを実行します。

$ mvn exec:java

以下のメイン画面が表示されます。

kkomazaw03

ここで「従業員のシフト管理」デモをクリックしてください。以下の画面が表示されたら、左側のデータパターンのリストから、「long01_ja.xml」を選択してください。下記画面のように、縦に従業員リスト、横にカレンダーが表示され、上部には毎日のシフトタイプごとに必要な人数が表示されています(Eは早番、Lは遅番、Dは昼勤など)。また、カレンダーの灰色の部分は、各従業員が休みたい日(またはシフトタイプ)を表しています。

kkomazaw04

人のアイコンをクリックすると、その人のスキルや契約形態が表示されます。(これは今回のデモ用に追加した機能です。Thanks to yhasegaw@redhat.com)

kkomazaw05

それでは上部の「計算」ボタンをクリックして計算してみましょう。

しばらくすると、シフトが自動的に入れ替わりながら表示されます。画面の下部には、「最新のベストスコア 0hard/-221soft」などと数値が表示されています。これは、「ハード制約」は0点で、「ソフト制約」は−221点であることを示しています。このソフト制約のスコアをなるべく小さく(0に近づける)ように、ビジネスリソースプランナーが動作します。ただしこのスコアはいつまで待っても0にはなりません。なぜかというと、今回のシナリオでは、すべての制約条件を満たす組み合わせが存在しないほど、過密なシフトスケジュールを要求しているからです。現実の世界でもこのようなケースがほとんどであり、ハード制約の違反は必ず0にしつつ、ソフト制約の違反を「なるべく」少なくなるように決めていくことになります。

kkomazaw06

では、どのようなソフト制約が違反しているのか見てみましょう。画面下部にある、「マッチした制約パターン」というボタンをクリックします。

kkomazaw07

このように制約違反しているルールと、対象となった従業員や日付のデータが関連づけられて表示されます。これによりシフトの公平性や妥当性が定量的に説明できるようになることは、従業員への信頼感にもつながるでしょう。

 

いかがでしたでしょうか?

実際に実用化するためには、デモが実装している機能以外にもいろいろな機能との連携が必要になります。

  • 要員計画:今月何人の要員が必要になるのかを計画する機能
  • シフト希望入力:各従業員に休日希望やシフト希望を入力できる機能
  • 勤怠管理:実際の勤怠実績を入力する機能
  • 給与計算:勤怠情報から給与を計算する機能

しかし、このデモで実現している機能要件は、マネージャーの負担を大幅に軽減し、業務改善に大きく貢献できる分野といえます。このデモをベースにカスタマイズしてみることで、実用性を検討してみるのも良いでしょう。

興味を持たれた方は、ぜひビジネスリソースプランナーを試してみてください。

レッドハット・エバンジェリスト・プロフィール

RED HAT JBOSS MIDDLEWARE

Red Hat JBoss Middleware エバンジェリストチーム

レッドハットを代表するRed Hat JBoss Middlewareの精鋭エバンジェリストたちが、JBossの魅力を余すところなくご紹介します。
詳細はこちら »