勤務表自動生成の仕組み(2017.3.10)

 自動生成とはどんな仕組みなのか?勤務表作成に携わる人でなくても興味があるのではないでしょうか?当社の自動生成はGA(遺伝的アルゴリズム)を使用しているのですが、その仕組みを簡単にお話ししたいと思います。

勤務表を手作りするのはとても重労働


 まず、病棟師長さんはどうやって勤務表を作成しているのか?いろいろな方法はありますが、我々が多くの師長さんから聞いた中でも一般的流れをご紹介します。紙と鉛筆で作る場合もエクセルなどで作る場合も全体の考え方は同じだと思います。

1)まず勤務希望をベースにする。
2)全スタッフにそれぞれの土日の休みを割り振る。
3)チーム毎に夜勤を割り振る。
4)遅出を割り振る。
5)残りに日勤を割り振る。

 概ねこんな流れが一般的だと思います。1)ではスタッフの希望をできるだけ叶えてあげたいという気持ちが伝わってきます。そして2)では月1回は土日連休にする、土日連勤にしない、などの条件を満たすための措置だと思われます。そして3)で夜勤を満遍ななく割り振るとなります。ここでは主任以外に夜勤を割当て、難しい場合は主任を含めるなどといった別の配慮も出てくるはずです。次に4)日勤であっても数が少なかったりして対応できるスタッフや全員が担当できるとしても公平性が求められるシフトを割り振って、5)各スタッフに今月取得させるべき公休数を全て割り振って…最後に6)日勤で埋めてゆくわけですが、ここで日勤の最低配置数を確保できない場合は公休を取り崩すなどの作業が発生してくると思われます。
 言葉で書くと簡単に思えますが、日々の看護の質を均一にする…例えばベテランばかりが固まらないとか、初心者が夜勤に入るときはリーダーを一緒につけるとか、病棟ごとの細かなルールを反映しながらというのは実に大変な作業です。それほど苦労して作り上げても…最後のマスがどうしても埋まらない…最初からやり直しなどという事態になってしまうことも多々あると聞いています。

 実際に作業時間を計ってみたら想像以上の時間が費やされている現状に唖然とすると思います。ある病院様で調査されたと聞いたことがあります。純然たる勤務表作成時間だけで平均すると8時間ほどだったようです。もちろん連続してこの時間が取れる訳ではなく、日々の激務のなかでこの時間を抽出するわけですからとても大変なことです。さらには出来上がるまでは相当なプレッシャーも感じていらっしゃると思います。

コンピューターで作る場合には最初が肝心


 ではコンピューターはどうか?こちらは作成時間は至って短く、スタッフ数や条件、環境(コンピューターの性能など)にもよりますが概ね1分程度です。もちろん事前に作成条件が登録され、勤務希望も入力されている前提が必要です。勤務希望については、紙で回収して管理者が入力する方法もありますが、各スタッフがネットワーク内の別端末から入力できる仕組みもありますから、その場合は転記時間なども省くことが可能です。(こちらはまた別の機会に)

 とはいえ忘れていけない大原則は、自動生成は設定していない条件は考慮しないということ。こんな組み合わせ常識的にする訳ないでしょ!ということはコンピューターには通用しません。ですから最初はほんの少し大変ですなのですが、条件を作るときに自分の病棟の作成条件を言葉にしてみる=病棟運営のあり方を棚卸ししてみるという作業にもなりますから、無用な慣例を見直したり、配慮が一部分にしか届いていなかったことに気づいたり…思っている以上に有益な作業でもあります。

 自動作成のルールとは、例えば2交代のスタッフであれば、『入→明→公という順番を必ず守る』とか、『遅→日といった逆進のシフトの連なりを避ける』といったベーシックなものから、『リーダー以上には入→明→入→明という2連続夜勤を月に1回だけ許す。その場合は続けて2連休(公→公 とか 公→有とか)を与える』とか『夜勤に初心者が割り振られた場合は、その日の夜勤人数を1名増やす』などといた少し高度なものまで様々です。

 このような条件設定が完了した段階でやっと自動生成が実現するわけです。

自動作成の全体イメージ


 まずはこちらの動画をご覧ください。(これは生成エンジン部分を画像処理したものでソフトウェアの画面ではありません。)




 目まぐるしくシフトが入れ替わっている様がわかると思います。画面にもある通り、動きが早すぎるためスロー再生をしています。

 ここで注目していただきたいのはシフトが激しく入れ替わっても日ごとの各シフトの合計を変化させないように交換が行われているということです。

交叉


 こちらの画像は前と同じ生成過程を示しているものですが、色がついています。




 この例は2チーム制ですから各チームが別々に並行して生成が進んでいるのですが、動作としては、

1)ランダムに2人を選択(画面上はブルーになっている2人)
2)2人のオレンジ部分を交換してみる(これを交叉と言います)
3)交換した結果を評価(最初に設定した条件に照らし合わせる)
4)結果が良くなれば残し悪くなれば捨てる

 これを繰り返しています。

エラー得点


 こちらも生成過程を別の尺度で見たものです。先に説明した「結果が良くなれば残し 悪くなれば捨てる」の評価しくみです。勤務表に対して設定した条件がどれだけ守られていないか(エラーが多いか)が変化していく様子を表しています。



 一つの条件が叶えられた結果、別の条件が叶えられなくなった。ということもありますし、2つ叶えられたけど、より重要な条件が1つダメになったということもあります。

 ここでの注意点は、守られていない条件の数=評価ではないということです。 条件の間にはそれぞれ重要度を示す度合いが設定されており、場合によっては軽微な条件5つがダメになるよりも重要な条件1つがダメとなる方が悪い勤務表という評価になる場合もあります。

エラー集計


 こちらはその評価、すなわち各条件のエラーの合計の推移を表すグラフです。



 生成が進むに連れてエラーの総計が次第に0(ゼロ)に近づいてゆくのがわかります。ゼロまでたどり着ければ設定した条件は全て満たされた、理論上は完璧な勤務表が生成された。ということになります。

 とはいえ実際にはスタッフ数がギリギリであったり、勤務希望が多かったり、条件が厳しかったりしてエラーが全くないということはあまり多くはありません。

自動生成完了


 指定された世代数の交換を終えると結果がエンジンからソフトウエアに送られ、生成結果として表示されます。



 この結果をベースに手動で編集を行ったり、再度自動生成を行ったりします。再生成を行う場合は、条件を少し変えてみる場合と条件を変えずに再度生成を行う場合の2通りがあります。交叉のところで触れた通り、ランダムに2人選び、その中の一部を交換してみる…という作業が何千回も行われるわけですから同じ条件でも生成結果は毎回異ります。このため何度か生成を繰り返すことによって、条件を変えずとも良い生成結果が出てくることもあるのです。


 いかがでしたでしょうか?コンピューターよる自動生成の仕組みがなんとなくお判りいただけたのではないかと思います。実際には世代交代の仕組みや条件の反映のさせ方など多くのノウハウが反映されてソフトウェアが成り立っています。