自動勤務表スケジュール ナースⅡ チュートリアル マニュアル Jul.20.2016 菅原システムズ スケジュールナースⅡとは? バージョンアップにより、より一層使いやすくしました。勿論、スケジュールナースの以下の特徴 は堅持しています。また、一般の勤務シフト作成問題についても作成し易いように配慮しました。 高速性能 特許技術(特許登録5807978,5807980)により高速に解の探索が可能 です。 複数の解提示 指定回数分、異なる解の提示が可能です。 解がないことの証明 解がないことや、制約の矛盾の指摘が可能です。無駄に長時間お待たせ しません。 柔軟な制約記述 柔軟な制約記述が可能です。言語処理による高度な記述もサポートして います。 検証も充実 大規模な記述の場合、目視のチェックでは辛いものがあります。Pythonソ ースコードも吐けるので、統計解析、自動チェックが容易 ポスト処理 Excelで読み込み可能なCSV出力をサポートしています。 過制約対応 7段階のソフト制約をサポートしています。 制約を満足する最小 解がない場合でも、予定変更を最小にする解の提示が可能です。 変更予定 エラーの原因解析 制約記述には、必須の機能です。 2 スケジュールナースⅠとの違い 項目 Ⅰ Ⅱ 内容 Windows構造 タブ MDI 複数のWindowを同時に開けるようにしました。 制約名 オプション 必須 行Day制約 あり なし 替わりにスタッフWindowsのシフトで個人毎に設定します。 スタッフプロパティ項目 なし 必須 項目の明確化 外部言語制約 あり なし 内部に言語制約として取り込み ペア 強制 AならばB 機能強化(AND,OR,<=,>=演算子追加) 制約の順番変更 不可 可能 ドラッグ&ドロップで可能 設定項目数 固定 可変 行挿入・行追加・列挿入により制限がありません。 予定入力リソース変更時 リセット リセットしな い リソース変更時も維持するように変更 プロジェクトファイル XML JSON 互換はありません。 3 用語集 ソルバ 答えを出す脳、に相当するソフトウェア 制約 勤務のルール 解 制約を満たす答え ハード制約 必ず満たさないといけない制約。 ソフト制約 出来れば満たしたい制約 オプティマイズ 最適化。エラーの数を1個づつ減らして最小化すること。 リソース 人的資源。使用例)リソースがない➡人がいない 行 横方向の列 列 縦方向の列 充足 制約を満たすこと エラー 失敗。誤差(目標値からのずれ、ペナルティ) ボトルネック その制約を満たすことが難しいために解がない状態 トレードオフ 何かを達成するために別の何かを犠牲にしなければならない 4 関係のこと。 用語集2 プロジェクトファイル 制約,予定入力や解を収めたお客様専用設定ファイル通常 月毎に名前を変えて作成します。 弊社SE 弊社システムエンジニア ハードエラー 解が存在しないこと(ソルバが矛盾を認識したときに出すエ ラー) solution1 1番目の答え、solution2は、2番目の答え 5 はじめに 本チュートリアル&マニュアルは 、最初から読みながら実際にやっ てみてください。 これ一冊で他には何も見なくても よいようにしています。 項数は、大変多いのですが、操作 のパターンはどれも同じです。 6 よくある失敗 ➡1)何も指示しなければ何も出来ません。 ➡2)リソースを超えて配置できません。 ➡3)トレードオフの関係を理解していない。 さすがに、1)は理解して頂けるのですが、2)を理解していない方が、時 折見受けられます。仕様を頂いて実装してみると、どうみてもリソースが不足し ているのです。 で、実際の勤務表をみると全く仕様に合致していません。スケ ジュールナースは、リソース不足をなんとかしてくれる道具ではありません。リ ソース不足を指摘することはできますが、リソース不足を補う道具でもありませ ん。お客さまにおかれましては、こうあったらよいという楽観的希望ではなく、 今あるリソースの中で、今出来ている仕様から始めて頂きたいと思います。 3)使い慣れた方でも、あちらをたてればこちらがたたず、トレードオフの関係 を理解されない方がいらっしゃいます。解が出た後でも、気になってあちこち手 直ししてしまう、という方がおられます。実は、人間が手直しした勤務表を入力 として再求解してみると、当初の制約を守っていることは稀です。このようなと きは、もう一度、仕様、優先順位について整理することが必要でしょう。 7 ナーススケジューリングと数独パズルは同質の問題 勤務表の込み入った拘束条件を満たす解の解法というのは、方程式を解 くようなものではなく、基本的には探索によるものです。その意味で数 独のパズルとナーススケジューリングというのは、同じ種類の問題です 。 左の問題は、フィンランド の数学者が3ヶ月かかって 作った世界一難しい問題と いわれているその世界では 、有名な問題です。数独の 名人でも、数日かかるとさ れているこの問題をスケジ ュールナースは、1秒もか からずに解く事ができます 。 8 勤務シフト表は、制約で解く そんな難しいナーススケジューリング問題に対して、紙と鉛筆、あるいは Excelで立ち向かおうとする人もいるかもしれません。しかし、数独名人 が3日かかる問題を1秒で解けるパワーをうまく活用できれば、毎月の勤務 表作成コスト(作成者のQOL)と作成品質(業務の達成度あるいはスタッ フのQOL)のどちらにも利が得られるのではないでしょうか? スケジュールナースという道具はここにあります。 本チュートリアルでは、簡単な例でスケジュールナースの使い方を見てい きます。 9 起動直後の画面 起動直後の画面は下のようになっています。 メニュー の求解を クリック します。 10 いきなり求解してみます。 下のように求解ページが現れます。求解ボタンをクリックします。 11 解のページが現れます。 下のように解が現れます。 未だ、なにも設定していないのに何故解がでたのでしょうか? 実は、初期状態では、36人スタッフ、36日期間、36シフトを が既に設定してあります。 しかしながら、制約については何 も設定していません! 制約の世界では、なにも制約され ないことは、なにを割り当てても 自由という意味になります。ルー ルがないのでなにをやっても自由 といういわば無法地帯状態です。 解を見ていると、ここはこうした いという自然な欲求が出てきます が、それは、未だ制約が足りない からだ、と理解してください。 12 欲しい結果を出すには制約が必要 探索する組み合わせの数を数え上げていく と宇宙の全量子数よりはるかに多い組み合 わせの数になるのが普通です。(これを組 み合わせ爆発と呼んでいます) これをまともに見ていくと現在のスーパコ ンピュータの100万倍の速度があるマシン があったとしても、宇宙の生涯中にスキャ ンし終えることはできないことになってし まいます。 ナーススケジューリング問題というのは、 膨大な組み合わせのなかから最適な一つを 選ぶ計算機にとっても難しい問題です。 解というのは、膨大な初期状態から、制約 で生き残るものになります。制約というフ ィルタで、ありえない組み合わせや禁止事 項は取り除かれ、下に落ちてくるものが、 最終的な解になります。 13 解画面の操作の仕方 解画面上の任意点をダブルクリックすることで拡 大と縮小を行き来(トグル)します。 14 画面レイアウト変更 下のようにレイアウトを変更することが出来ます。 15 スタッフ名の変更 メニュー設定 ➡スタッフ定義をクリックします。 16 スタッフ名の画面 17 スタッフ名の編集 スタッフ名をクリックします。するとセルが選択されたことを表す、色表 示になります。この段階は、セル選択段階であり、未だキーボードによる 編集はできません。 右クリックで、 下のようなメニ ューが現れ、 各操作が可能で す。例えば、 Excelからスタ ッフのリストを コピペすること もできます。 18 セル内の編集 もう一度クリック又は、ダブルクリックでセル内の編集モードになります。 セル編集モードに 入れない場合は、 他のセルをクリッ クしてから再クリ ックしてください 。 19 スタッフ名の適用 チェックボックスのチェックを外すと、そのスタッフは、いなかった (存在しない)ことになります。 編集後は、設定 ボタンをクリック することで、スタ ッフ名の表の変更 が適用になります 。 設定ボタンをクリ ックしないと変更 は適用されないの で注意してくださ い。 20 予定入力をクリックします。 スタッフ名 の変更が 反映されて いることが 分かります。 21 制約の3要素 どのような制約でも、右のような3要 素の規定が必要になります。3要素は 、いずれも要素の集合から成ること に注意してください。スケジュール ナースでは、任意の集合を指定し易 いように配慮しています。 以下、具体的に集合要素の指定の仕 方について見ていきます。 日(Day)集合 シフト集合 制約 スタッフ集合 22 日集合 メニュー 設定 ➡ 画面となります。 曜日定義をクリックすることで下の •期間の設定 •設定済み曜日 •特定の日の設定 •曜日集合の設定 のメニューがあ ります。 23 期間の設定 制約開始日と制約終了日は、最低限設定する必要があります。 表示開始日は、特に必要がなければ自動で設定されるので入力する必要が ありません。 カレンダ上の日 付を選択して、 設定をクリック すると設定され ます。 制約開始日、制 約終了日、(表 示開始日)の順 番で設定してく ださい。 24 制約開始日の意味 制約開始日は、通常、勤務表上の今月最初の日にします。 表示開始日は 、通常、先月 からの勤務の 連続性のため に必要です。 通常、前月の データを入れ るのでスケジ ュールする余 地はありませ ん。 表示開始日以降 制約開始日以降 25 制約開始日は、基準 殆どの曜日は、制約開始日を基準として記述します。特定の日の設定では 、これとは関係なく絶対月日で記述しますが、それ以外の殆どの曜日は、 制約開始日が基準になります。こうすると、来月の曜日制約では、期間の 設定を変えることで、その他の曜日もこれにリンクして変わることになり ます。(月々のメンテナンスは、できるだけ少ない方がよいでしょう。) 26 設定済みの曜日 設定済みの曜日は、表示開始日ー制約終了日内の曜日を自動で設定しています。 これらは、期間 の設定で一意に 決まります。( このページで設 定することはあ りません。) 今月は、制約開 始日ー制約終了 日内になります 。今月をクリッ クする右の表示 となり確認が可 能です。 27 日の定義 表示開始日ー制約終了日期間内の日曜日が表示されます。 28 特定の日の設定 このページでは、表示開始日以降の1年間の日を設定することができます 。期間の設定が変更されても影響はありません。 設定ボタンをクリ ックすることで設 定されます。 空白の曜日設定の 場合(名前だけ定 義したい場合)で も、設定ボタンを クリックする必要 があります。入力 ミスをしたときは クリアをクリック してやり直してく ださい。 29 曜日集合の設定 このページでは、前に定義した曜日名を使って様々な曜日集合を設定する ことが出来ます。 右のように初期 状態で、既に色 々な集合が定義 されています。 例えば、平日を クリックすると 右のように結果 集合がカレンダ 上に表示されま す。 平日は、月また は、火または...で あることが確認 できます。 30 週末の定義 同様に、週末は、土または、日の集合であることが分かります。 ここでの定義は 、ユーザが自由 に変更して構い ません。 31 稼働日の定義 稼働日=休日でない ですので、演算子がでないになっています。集合 演算は、表示設定日ー制約終了日を全体集合として行われます。 32 曜日集合は、集合演算で作る 演算子をクリックすると、様々な演算子が選択できます。よく使うの は、または(OR) 、でない(NOT) 、かつ(AND)です。 これらが、どうい う風に集合演算を することになるの かは、カレンダ上 の表示で確認して ください。 このようにして、 任意の集合を期間 の設定を基準にし て作ることが出来 ます。 33 曜日集合を追加する 自分のプロジェクト用に曜日集合を追加定義することも出来ます。 金土日月以降 に定義してく ださい。 自分用に定義追加していく。 なお、適用の チェック、設 定のクリック を忘れずに行 ってください 。これらが行 わないと設定 が反映されま せん。 34 シフト メニュー ➡シフト定義クリックで下の初期画面が現れます。 シフトは、初期状 態で36シフトが定 義されていますが 、 自由に編集してく ださい。 35 シフト定義 シフトは、必要なものだけを残して後は削除します。シフトの数は、通 常、数個以下で、出来うる限り削減してください。(求解時間・所要メ モリに影響があります。) 別名ラベルは、制約上 の区別はないけれども 、予定入力時、見易く するために用います。 また、予定入力時に既 に予定が決まっている 場合(ソルバで自動割 り当てする必要がない 場合)は、自動シフト のチェックを外します 。 36 別名追加 別名を追加するには、右クリックでメニューを出し、列挿入を行います。 別名数は、制限がありませんし、性能への影響もありません。 編集が終わった ら、適用、設定 を忘れずに行っ てください。 37 シフト集合 例えば、予定入力で、深夜以外というラベルを作りたいときに使います。 シフト集合で、 ラベルの別名は サポートしてい ないので、別名 が必要な場合は 、別なシフト集 合名を作成して ください。(右 図、休み・調整 ) 38 シフト集合 でない演算で簡潔に記述する あるユーザ様の例ですが、制約上、「勤務」というなんらかの勤務 をしている状態の集合が必要でした。 シフトは、全体で2 3個もあり、内22 個がなんらかの勤務 を行っています。こ れを、または(OR) で記述すると22個記 述しないといけませ んが、でない(NOT) で記述すれば一個(休 み)で済みます。大 規模なシフトの場合 、簡潔に記述するこ とで、パフォーマン スにも良い影響が期 待できます。 39 予定入力 別名ラベルとシフト集合を駆使することで、多彩な予定入力が可能にな ります。 右は、あるユーザ 様のプロジェクトの 予定入力ですが、シ フトは、7個しかな いのですが、25個 ものラベルが定義さ れています。 表示しきれないラベ ルは、ここをクリッ クすると出ます。 40 スタッフの移動 ここをクリックして行を選択します。 41 スタッフの移動はドラッグ&ドロップ もう一度クリックすると、バーが出現します。 クリックしたままでバーを移動先にドラッグします。 42 スタッフ移動 しました。 43 スタッフ集合 下は、あるユーザ様のスタッフ定義です。これを例にしてスタッフ集 合の作り方を説明します。 44 スタッフ毎のシフト スタッフ毎のシフトのページでは、スタッフ毎のあり得るシフトを機 チェックします。 この場合、スタッフ 名1は、看護師長で あり、夜勤はないの で、深夜と準夜勤の チェックを外してい ます。 あり得ないシフトは 、このページのチェ ックを外しておくこ とで、制約の記述も より簡素化できる可 能性が高まります。 45 グループ定義 最初の全スタッフ属性の行は、初期から入っています。消さないでくださ い。 2行目以降が、新た に追加したものです 。属性の名前があっ て、その属性に属す るメンバー名(師長 、副師長..)が並びま す。メンバー名は、 自由に設定して構い ませんが重複は許さ れません。設定ボタ ンをクリックすると スタッフ定義に反映 されます。 46 各スタッフの属性を記述する グループ定義で設定した項目が定義順に出てくるので、各スタッフの 該当する属性を設定します。 47 グループ集合 制約の記述で、必要となるスタッフ集合についてここで設定します。 グループ集合名 をクリックすると 該当するスタッフ が下に表示 されます。 演算子は、Day集 合の場合と同様に 作用します。各演 算がどのように作 用するかが確認で きます。 このようにして、 任意のスタッフ集 合を定義できます 。 48 制約の3要素のまとめ 以上、具体的に集合要素の指定の仕 方について見てきました。集合とい うと、なんだか難しそうに聞こえま すが、やってみるとそれほど難しく はない、と実感してもらえたと思い ます。 任意のDay集合、任意のシフト集合 、そして任意のスタッフ集合を自由 に設定できるようになったと思いま すので、いよいよ制約について見て いきましょう。 日(Day)集合 シフト集合 制約 スタッフ集合 49 よりよい自動勤務表とするために 失敗の経験から、言えるのは、 ・絶対に守らなければいけない仕様 ・できれば守りたい仕様の優先度 が分離できていない、もしくは、ごっちゃになってしまっているという ことではないかと思います。 仕様は、プログラムではなく日本語です。いきなり設定を始めるのでは なく、仕様をしっかり書いてから始めましょう。 50 サンプル仕様 絶対に守る制約とできれば満たしたい制約の2つに分けます。絶対に守る 制約は、同時に、絶対に守れる制約でなけれなりません。(そうでなけ れば、できれば満たしたい制約と分離する意味がありません。) •スタッフ数18人 •2交代 •シフト数4:入り・明け・公休・日勤 •看護師・准看護師 •夜勤には、看護師が一人必要 •公休数9 •明けの後は、公休 •入り明け各2人 •日勤者数 平日10人以上・休日5人以上 •連続6日勤務禁止 •夜勤回数の平準化 •明けの後は、できれば2連休 •休み希望2回まで 絶対に守 る制約 できれば 満たした い制約 51 制約の種類 制約の種類としては下のように4種類あります。 最後の言語によ る制約は、行制 約、列制約、ペ ア制約では、設 定できないとき にだけ使います が、通常は、必 要ありません。 52 制約方向 行制約は、横方向、各スタッフに関する制約です。 列制約は、縦方向、各日に関する制約です。 行制約 列 制 約 53 サンプル仕様実装ーシフト 下のように4シフトを設定します。 54 サンプル仕様の実装ースタッフ 下のように18人に設定します。 55 求解 シフトとスタッフしか設定していません。しかし、求解してみると、解 はあるはずです。制約はなにも設定していないので、無秩序な割り当て になります。 56 列制約の設定練習その1 分かりやすい例として下のように設定してみましょう。 この日勤強制制約は、今月の各日について、全スタッフが日勤を強制します。 編集し終わったら 設定をクリックします。 57 求解結果 今月は、全部 日勤になりました。 58 列制約の設定練習その2 今度は、次のように、週末は入りにしてみます。 59 列制約の設定練習その2 結果 確かに、週末は、入りになりました。他の部分は、何も制約していないの で、自由な結果になります。 60 列制約の実装 入りの人数は、各日2人です。ですので次のように記述します 。 61 入り二人制約の結果 62 明け二人制約 明け制約は、入り制約と殆ど同じなので、入り制約の行コピぺで実装します。 63 明けは、二人制約の実装 行1をコピーし、行2に貼り付けします。 ヘッダをクリックすると行コピー 64 明けも二人制約の実装 下のように編集しました。編集し終わりましたら、設定のクリッ クをお忘れなく。 65 入り明け二人の制約実装結果 確かに、各日、入りと明けに二人づつ入りました。 66 ここまでのまとめ ・制約は、一つ実装したら確認、また一つ実装したら確認...必ず、一つ づつ確認を行ってください。面倒なようでも、これが一番の近道です。 ・制約していないところは、無秩序な割り付けになります。これを制御 するには、「制約を追加する」 しかありません。 67 夜勤には、看護師が一名以上必要 これを実装するには、スタッフのなかで、看護師・准看護士の属性を設定 する必要があります。そこで下の青部のように追加します。 68 スタッフ属性の設定 スタッフ定義のページを開くと職能とうアイテムが追加されているので、 各スタッフについて設定します。(青部) 69 入り明け看護師一人以上 下青部の通り追加します。 70 入り明け看護師一人以上結果 職能選択 ブランク 選択で全体 表示となり ます。 71 入り明け看護師一人以上結果 表示方法 准看護師選択 で准看護師だ けの表示にな ります。 72 列制約 日勤者数 下のように入力します。 73 列制約 日勤者数結果 74 以上で、列制約については、実装終了しました。 行制約 下が、サンプル仕様に対する行制約です。適用のチェックが入っていない ので、このページの行制約は、ないものとして扱われます。 75 行制約未入力状態 では、入り明けの関係が無秩序になっていることが分かります。 まず、この関係を直しましょう。 76 入りの後は明け 行制約1を見ましょう。行制約は、シフトパターンで記述されるます。 多くは、パターン禁止になります。シフトパターンでチェックが入っているの は、でない(NOT)の意味です。ですから、入りの後、明けでないパターンは禁 止という意味になります。 77 入り明けだけでは十分ではない 確かに、制約が効いている今月内では、入りの後は、全て明けになっています 。不思議なのは、明けの前は、入りという規定を未だ入れていないにも関わら ず、ほぼ全てのパターンが入り明けになっています。これは、列制約で、入り 明け各二人という制約が効いているためです。制約開始日だけ、明け単独パタ ーンが見られるのは、このためです。 78 明けの前は入り そこで、明けの前は入りというパターン制約を追加します。ここで、今月自動について 説明します。パターンが2個ある場合は、制約開始日の1個手前からパターンを適用する 必要があります。いちいちパターン数に応じて、曜日タイプを設定するのは、煩わしい ので、今月自動という便宜タイプを用意しています。今月内に適用する場合には、これ を設定しておくとその辺を自動で設定します。(次回より置き換わります。) 79 入り明け制約結果 入り明けの関係については、まともになりました。 80 明けの後は公休 続いて、明けの後は、公休を実装します。具体的には、「明けの後 は、公休でない」 を禁止すればよいでしょう。 81 明けの後は公休の結果 入り明け公のパターンが完成しました。 82 公休数設定 公休数は、固定9という仕様なので、行制約4の通りとします。 83 公休数結果 行制約の各適用項目について、集計結果を見ることができます。 84 6連続勤務禁止 勤務=公でない なので、6個の公でないを禁止します。。 85 6連続勤務禁止結果 確かに今月内に限っては6連続勤務禁止になっています。しかし、スタッフ名 3の最後のパターンを見てください。来月は、明けですので6連続勤務になっ てしまいます。今月は良くても、来月必ず、制約矛盾となってしまうので、こ れは、今月内で避けなければいけません。 86 6連続出勤防止 シフトパターン[0]の曜日を指定することで、制約6のパターンは、それ 以外の曜日ではヒットしなくなります。制約最終日に入り、その前公休4 個連続というパターンだけに作用し、それを禁止することになります。 87 6連続出勤防止結果 これで、来月の制約矛盾の心配がなくなりました。 88 夜勤間隔改善 短いパターンを禁止にすればよいでしょう。 89 制約前です。 90 入り**入りパターン禁止結果 91 入り***入りパターン禁止結果 92 入り****入りパターン禁止 93 入り****入りパターン禁止結果 良い感じになってきました。 94 明けの後できれば2連休 経験上、出来たことがない、もしくは、全員が取得するのは、無理という制約はソフ ト制約にします。全員が取得することはできなくても、できるだけ多くのスタッフに 取得して欲しい、そういう制約がソフト制約です。これに対して、ソフトレベルがつ いていない制約は、ハード制約です。ハード制約は、一人でも満たさないと解がない という事態になってしまうので、必ず出来る制約でなければなりません。 ソフト制約は、7つの優先度指定が可能であり、7が最強、1が最弱です。 95 求解ページ 求解ページを開くとソフトレベル設定という項目が現れるので、適用 にチェックして、許容エラー数を設定します。ここでの許容エラー数 は、通常1にします。(この例の場合、2連休取得できないのは、各 スタッフあたり1個まで、という意味になります。)1で駄目だった ら2、2で駄目だったら3という具合にしていきます。 96 求解結果 ソフト制約の場合、ソルバは、一個づつエラーの数を削減していきま す。下にその様子がでていますが、最終的には、エラーの数が0にな ったことを示しています。つまり全員が2連休を取得できた、という ことになります。 ソルバからの求解状況報告 エラーを1個づつ 減らしていく 97 2連休取得ソフト制約結果 結果を見ると、確かに、全員が2連休取得できていることが分かります 。 98 夜勤回数の平準化 夜勤回数の平準化は、全員の夜勤回数が同じであることが望ましいとい うものです。まずは、現状、どの程度になっているか、回数を集計して みます。下の記述は、最小0回という意味のない制約になっています。 これで、なにも制約せずに、集計結果を表示することが出来ます。 99 夜勤回数のカウント 2回から5回にばらついているので、3回から4回位が適当でしょう。 100 夜勤回数の平準化 良い感じになりました。 101 実際的な問題 ここまでは、予定入力なしで来ましたが、予定入力なしというのは、 実際的ではありません。制約は、全て満足しましたが、それは、各ス タッフの休み希望や、予め決まっている会議や研修等を無視したもの になっています。 そこで、実際的な検討をするには、なんらかの予定入力が必要になり ます。適当に入力する替わりにランダムで生成する機能があるので、 これを使って、どのような問題が潜んでいるのかをシミュレーション してみましょう。 102 ランダム予定生成 右クリック➡ランダム予定生成➡稼働日➡公休 とすると以下になりま すので、公休1をクリックします。 103 ランダム予定生成 稼働日公休 稼働日に、各スタッフ1個の公休が入りました。 104 ランダム予定生成 休日 公休 右クリック➡ランダム予定生成➡休日➡公休➡公休1で次のように生成しまし た。休日に休み希望が多いことをシミュレーションしています。 105 ランダム予定生成 稼働日 日勤 右クリック➡ランダム予定生成➡稼働日➡日勤➡日勤1で次のように 生成しました。研修等をシミュレーションしています。 106 求解してみます。 今度は、エラーが3個出ていることが分かります。 107 ソフト制約のハード制約化 試しに、許容エラー数を0にしてみます。 ソフト制約をハード制約に変更することを意味しています。 すると、解がやはりありません。 108 求解 再びソフト制約に戻して求解すると、今度は、4個のエラーとなりました。 確かにエラーの出ているスタッフで2連休になっていないことが確認できます。 一般に、予定入力追加により、解空間は狭まり、解が得にくくなります。 予定入力数が多ければ多いほどこの傾向は強まります。 109 予定入力のソフト化 下のように今月部を選択し、右クリック➡選択部をソフト制約にする➡ レベル2 をクリックします。 110 ソフト制約部 拡大してみると、ソフト制約部したセルの淵に色がついていることが分か ります。これらがソフト制約化した予定入力部になります。 111 ソフト制約化した予定入力の求解 予定入力のソフトレベルの許容エラー数を2にして求めました。(許 容エラー数1では解がありませんでした。)すると、行制約3の方の エラー数は、0になりましたが、予定入力の方は、17個のエラーが残 ってしまいました。 112 ソフト制約化した予定入力の求解結果 全員の2連休は確保しました。しかし予定入力の変更を余儀なくされて います。これは、予定入力のソフトレベルを2、行制約のソフトレベル を3にした結果、行制約が優先されて配置されたからです。予定との相 違部は、赤で示されています。 113 ソフト制約化した予定入力の求解結果 これは、予定入力側でみた、相違部の表示です。解のペ ージで、右クリック➡予定入力との比較 で相違部表示 となります。 114 妥協点を探す 行制約と予定制約を同時に満足させることは出来ません。どちらか一方を 満足させることは出来ました。ならば、中間の点で妥協することも可能でしょう。この ための設定としてソフトエラーの最小化を外して、行制約全体許容エラー数を2にしま す。行制約を緩くした分だけ予定入力のエラー数が減らすことが期待できます。 115 妥協点を探した結果 行制約2個、予定制約エラーは、9個に減少しました。 116 最後に気合を入れる 最後に、気合を入れます。ソフトタイムアウトを10 ➡30にしまし た。約2分30秒後に、ソフトエラー数が0まで減少しました。 117 気合を入れた結果 予定制約は、全て満足しました。行制約は2個のエラーのままです。 118 トレードオフは自分で探す 何かを採るには何かを捨てなければなりません。これをトレード オフといいます。この関係は、限界まで突き詰めようとすると必 ずと言って言いほど現れます。スタッフのQOLに配慮する人ほど 、この辺は悩みどころかもしれません。どこを使うかは、複数の 結果を見ながら、自分で判断することになります。 面倒だと思った方は、多いと思いますが、紙と鉛筆では一回しか できなかった試行が、会話的に出来るようになったことが大きな 違いです。作成工数を大幅に減らせるばかりか、大多数のスタッ フのQOL向上に大いに貢献できるでしょう。 119 メンテナンスのし易さの為に 固定部と変動部に分けます。 固定部は、ハード制約部になります。また、未来永劫というと大げさ ですが、今後制約をいじくる必要がないところの制約集合になります 。この制約集合だけで求解すると容易に解が得られる状態である必要 があります。 変動部は、今後変動するハード制約、ソフト制約の集合です。 このようにすれば、今後のメンテナンスは、変動部だけに着目すれば よいことになります。また、解がない場合でも、変動部だけに着目す れば良いことになります。 120 固定部・変動部 例 恒久的な制約は、 こちらに集約 月々変更の可能性がある 制約はこちらに集約 121 マクロの使用 複数の箇所で同じ定数を定義したいときは、マクロを定義すると便利です。月 々のメンテは、期間の設定とマクロの値の変更だけで済めば楽です。 122 制約の管理 制約のタブは、色をつけたり、順番の変更が出来ます。 青部右クリックでタブページ管理のメニューが出ます。 123 スタッフプロパティに対する管理 スタッフプロパティによる違いにより、殆ど同じ制約群だけども微妙に異なる制約の設定例 です。同じ色にすると分かりやすい。 ほぼ同じ制約群 124 月々の変更のし易さ 期間の設定とマクロの変更だけでは対応不能な変更も入るでしょう 。そうした場合でもスタッフプロパティ(下のページ)の変更だけ で済むように制約をブラシュアップして行きましょう。制約の中身 をいじらないで済めば、それに越したことはないです。 125 その月だけ・その個人だけ 制約化するよりも予定入力してしまった方が早いです。制約化するのは、複数 のスタッフに当てはまる、もしくは、将来も使う制約のみです。 解がない場合(制約設計後) 制約設計終了後では、固定部と変動部が分離しているはずです。固定部 の状態だけにすれば、解が必ずあるはずなので、ここに戻して解の存在 を確認します。固定部だけにするには、各制約ページごとに適用のチェ ックボックスがあるので、変動部ページの適用のチェックを外します。 予定入力の前に まず入力する前に解が容易に求まる状態であることを確認します 。一般に、予定を入れると解空間は狭まり解を得にくくなります 。ですので、予定を入力する前では、容易に解が出てくる状態で なければなりません。(そのように制約設計してください。) 予定の入力 入力したい箇所でマウスをクリックしてセル を選択します。(下図状態) 予定の入力 次にパレットを選択すると入ります。(下図では公を選択。)する と選択が右にずれます。 ブランクに したいとき 取り消し 取り消しボタンを押すと やり直し 今の入力が取り消されます。取り消しを取り消したいときは 、やり直しボタンを押します。 複数セル入力結果 複数入力 複数のセルを一気に入力できます。 入力途中で、求解 入力途中で、時々求解し、解をあることを確認します。 求解結果 エラーが出てきました。すぐに出てくるエラーは、単純な記述 ミスが多いです。 エラーの原因を箇所を見る この例の場合 制約 夜勤なし 祝でない休診日では、公休をシフト強制していました。 もともと、夜勤なしのスタッフに準夜を入れて しまったのでエラーとなったことが分かります。 記述ミスは取り消しで取り消す 取り消し操作は、ほぼ無制限に後戻りできるので、解があるところ まで戻ることが出来ます。 ロック方法 入力を編集ミスで消さないようにロックが可能です。右クリック➡ ロックで下のメニューが出ます。 ロック状態 黄色になり、ロックしていることを表します。 Excel へのコピー 選択した後、右クリック➡テキストとしてコピーをクリックし ます。 スケジュール ナースⅡ間で は、コピーで 行ってくださ い。 Exceからの貼り付け Excel上でコピーを行います。 注意 完全に ラベル名 が 同じで ないこと コピー されませ ん。 Excelからのコピー ポイントを選択して貼り付けします。 Excelからの貼り付け結果 Excelから貼り付け されました。 解を入力に戻す 二つの目的があります。 1)別解を求める 2)来月のデータ予定入力に前月分データとして入れる 部分的な別解を求める 入力は、解(出力)で埋まっています。この状態では解は一個しか ありません。そこで部分的にブランクにして解を求めてみます。 1日だけブランクにしてして別解を求める 求回数を2に設定 元の解は1個必ずあります。そこで、求回数を2にして2個の解がえ られたなら別解が初めて得られたということになります。 別解は得られませんでした。 すぐに解がないと言ってきます。これは探索空間が狭く解が他にないこと の証明が容易なためです。(一般に、解がないことの証明は、解があることよりはる かに難しい) 別解は得られませんでした。 ブランク部を下のように広げても解はありませんで した。 別解が得られました。 ようやく得られました。このようにして、勤務表をリリースした後で、何か対応が必要にな ったときに解を求めることができます。しかし、制約を順守すると、このように範囲を相当 広げないと解がないのが普通です。これは、ナーススケジューリングの本質的な難しさを示 していると思います。と同時に、解が出た後で人間が手直しする難しさも示していると思い ます。現実的な対応としては、制約を緩めて求解するか、あるいは、制約をある程度度外視 して人間が手直しするか、のいずれかでしょう。 前月分データとして入れる 期間の設定を来月の期間とすれば、予定入力(=今月の解)を来月か ら見て、前月末のデータとすることが出来ます。 予定入力の外し方 今月の予定入力を全てソフト制約化して、ソフト制約のチェック をしなければ、予定入力をしていない状態になります。 予定入力をなしにする。 チェックをして求解すれば、 予定変更を許した予定変更個数 の最小解が出力されます。 ペア制約 個人制約 AさんとBさんの一緒の勤務を禁止するといった制約になります。スケジュー ルナースⅡにおいては、ペア制約を大幅に拡張しています。 制約タイプは、ペア禁止とAならばBの2種類です。下でAとBカテゴリがありま す。それぞれに演算子がありますが、個人スタッフを指定している限りは、ま たは、かつ どれを選んでも動作は同じです。 制約7は、A・B共、個人スタッフを指定しているので、これにあてはまり、今 月中の各日について、スタッフ名2とスタッフ名3の一緒の深夜は禁止という 意味になります。一方制約8,9については、Bカテゴリにおいて、 ペア禁止 集合制約 スタッフ4に嫌われているという集合を定義しています。Bの演算子は、 または(OR)になっていて、これに対して集合演算が適用されます。 つまり、スタッフ4に嫌われている下の4人のうち一人でも同じ勤務であるこ とを禁止する動作になっています。これをかつ(AND)にすれば、4人全員が スタッフ4と一緒の勤務を禁止します。(4人のうち任意の3人がスタッフ4 と勤務することは禁止しない)という意味になります。 AならばB制約 制約1は、各診療日について、新人の日勤者が1名以上1名以下なら(A) 、新人以外の日勤者は、15名以上15名以下(B)という制約になります。 の日勤者が1名でないときは、B制約は適用されません。同様に制約2は 、新人の日勤者が2名なら、新人以外の日勤者は、14名、新人の日勤者 が3名なら、13名、4人以上なら、12名という制約になります。つまり 、Aならば、Bを真にするように働きます。AならばB制約においては、 このような不等式制約が使えます。または(OR)、かつ(AND)、も同 様に使えますが、またはは、1名以上に等価、かつは、全スタッフであ ることに注意すれば、自然な拡張であることが理解できると思います。 AならばB制約結果 ペア制約の結果は、列制約の結果のペインに出ます。禁止制約は、定義した 曜日の全てにおいて結果が表示されますが、AならばBについては、Aが 真のところしか表示していません。なおかつ、表示日は、Bカテゴリが適用の日になり ます。Bカテゴリの日オフセットは、当該曜日集合におけるオフセット値であることに 注意してください。例えば、12日に、「新人が4人日勤なら新人以外は12人」という制 約結果が出ていますが、Aの値が真になっているのは、15日です。診療日集合は、平日 集合です。オフセットがー1なので、Bの適用は、15日の一日前の平日となり14日では なく12日になります。 1日前ではなく1診療日前になる。 ペア制約Tips ある集合上で、任意の二人が一緒に勤務しないという制約はどのように 記述すればよいでしょうか? 実は、これは、既に下青部で記述しています。Aチーム若手の最大勤務者は1名で す。言い換えるとAチーム若手集合では、任意の二人が同時勤務 になることを禁止している、とも言えます。よって、若手集合内については、ペ ア制約で、各個人について記述することは冗長であり不要です。ペア制約では それ以外について記述しましょう。 会議制約 AならばBは、いわば片方向制約です。Aを新人、Bをチュータ、あるいは 、 Aがプリセプティ、Bがプリセプタならば、Aが夜勤なら、必ずBも夜勤と なるので問題ありません。しかし、Bが夜勤だったらAも夜勤という論理 は働かないことに注意してください。AもBも出席の会議は、両方向で記 述する必要があります。 しかし、やってみると分かるのですが、この会議制約は、重い制約(縛り がキツイ)でして、割に簡単に解がない状態になってしまいます。何人か の人が一同に集まるのは、労力が要るものなでしょう。それとは反対に、 ペア禁止制約は、軽い制約らしく、結構入れても問題なく解が求まるよう です。 ウィンドウが隠れているときは? ウィンドウの整列のメニューでどれかをクリッ クすると出てきます。 ソフト制約におけるエラーカウント方法 M<=x<=N という制約があった場合、1制約あたりの許容値が1とき、 x==M-1 もしくは、x==N+1のとき、1個のエラーとしてカウ ントします。つまり1個のエラーは、範囲を超えて許容される ことに注意してください。もし、どうしても2個以上のエラー になってしまう、もしくは、時間内にM-1<=x<=N+1範囲を満 たすxを見つけ出すことが出来ない場合は、ハードエラー( 解がない)として報告されます。 大規模な勤務表について 規模は、以下の式で表現できます。 規模=シフト数x 制約日数x スタッフ数 つまり、同じ1か月30人の勤務表でもシフト数が4と40では、10倍も規 模が違うことになります。なので、大体平均的な、作成規模は、25人、 一か月7シフトです。このレベルなら、ソフト制約が複雑に入ったもの でも60秒あれば、実用的な解に達します。規模が大きいと、それだけメ モリを食うことになります。大規模と考えられるのは、シフト数4で考 えると、一か月、100人程度以上になります。この以上でしたら、32ビ ットシステムでは、メモリ不足になる恐れがあるので64ビットシステム なおかつ潤沢なメモリをご用意ください。また、所要メモリは、並列に 走らせるCPU数倍近くになります。 大規模勤務表の求解時間 下は、あるユーザさんの求解設定です。大規模な場合、探索空間の増 大により求解時間もそれに伴って増えます。また、ソフト制約レベル 数、許容エラー数が多いと所要メモリが増えます。 求解時間とエラー数の関係 1時間でほぼ最適に達しています。32ビットOS4CPUでは、メモリ不足で求まりませ んでした。下は、32ビットOS2CPUでの結果です。求解時間が長いとそれだけ、多 くの学習量を蓄えることとなり、単調に所要メモリが経過時間とともに増加します。 初期250MB、終了時1.5GB-2GB程度と推定されます。32ビットOSのユーザ空間は2 GB ですから、少なくとも本プロジェクトには64ビットOSが必要です。さらに、狙う 精度と搭載メモリに応じて、ソフトタイムアウトを適切に選択する必要があります。 (大きい値ならよいというものではありません。) 各 レ ベ ル の エ ラ ー 数 求解時間 人との能力比較 リソース削減(人員削減)の観点から、人が作成したものとの経験的な比 較です。 30人レベルでは、1人未満です。スタッフのQOL向上は出来ますが、1人 以上削減という効果は見られません。ただし、人間にはできないようなレ ベルでの配置は可能です。(全日を殆どフラットにするような芸当) 50人レベルで、1人位削減可能と推察します。 120人ー4シフト数で、5-6人程度削減。人間の方は、フルタイムで2週間程 度作業しています。
© Copyright 2024 ExpyDoc