2024年3月7日木曜日

連続勤務禁止しているのに先月から6連続勤務になってしまう

 Q.

行制約グループ1の7行目で6連続勤務禁止の制約をしているのですが、求解するとxxの先月29日から今月3日まで6連続勤務となってしまいます。

解決方法をお願いします


Ans.

パターン最初の曜日タイプの指定を外してください。

「パターン最初の曜日タイプ」がブランクだとすると、7日パターンの場合、

先月部から制約されます。これがあるべき姿です。

しかし、「パターン最初の曜日タイプ」が「今月」だとすると、パターン先頭は、「今月」である黄色領域に限定されます。従って、先月領域にはマッチしないため、制約が利かず、
ご指摘の現象となります。その他のパターンも不要と思います。外してください。

<短いパターンは、長いパターンを含む>

なお、別件ですが、

6連続禁止記述があれば、7連続禁止も含んでいます。7連続禁止と6連続禁止は、同じハード制約として、記述されています。従い7連続禁止制約は、冗長であり不要です。長いパターン程、メモリを食い高速化の妨げになる傾向があります。必要がなければ外すようにしましょう。

2024年3月6日水曜日

週当たりの勤務数について

 Q. Aさんは日曜始まりの1週間に4日勤務の条件があります。スケジュールナースのブログを見てPython制約でできるのを読みましたが、どのように解決したらよいか分からない状況です。自分なりに行制約の「Aさん」のタブに制約をしてみましたが何か間違っているような。。。。Python制約なら便利そうなのですが。。



Ans.
良いと思います。解もちゃんと4回づつになっていました。上のように、マウスホイールボタンを押して、各集合が意図通りになっていることを確認すると間違いなく制約できます。



端数の第5週は手入力にしてもよいでしょう。

別解は、以下をご覧ください。

「日曜日始まりの一週間」を先月からの1週間も見て継続する場合のやり方です。

表示開始日が6日間に限定した場合の話ですが、Pythonを使わなくても可能です。

先月が6日分あるとすると、以下の色部分に最初の日曜日がどのパターンにも一個だけ含まれます。

これを利用して、次のように曜日集合を構築出来ます。


最初の日曜日の定義です。
日曜日の第一週集合です。
同様にして第2週も定義できます。
第5週の定義です。月によっては第6週まで必要です。


これで、必要な曜日集合が定義できました。

定義した集合を用いて制約します。


<端数の処理>

第5・第6週は、端数になる可能性があります。そのためマクロを定義します。

次は、マクロの値をマウスホイールボタンを押して確認しました。第5週の値は、1になっていることが分かります。ちゃんと端数処理されていることが分かります。(第6週の値は0になっていました。)

マクロの記述です。
Cは、集合要素を数える関数です。

切り捨て処理を0桁目で行う処理です。rounddown(X,1)だと小数点第一まで出ますが整数でしか処理できないので、0を指定しています。従来floorを使用していましたが、間違いでした。この例のようにrounddown/roundupが正しい切り捨て、切り上げ処理になります。


注意:

残念ながら自動で次月も自動計算するように出来ていないので、その月毎、マクロの設定を押す必要があります。次のリリースで改善予定です。

→BUILDMAR072024で改善しました。

https://www.nurse-scheduling-software.com/japanese/constraints_faqs/chapter35/

2024年3月5日火曜日

トレーニングプロジェクト

 最近のサポート経験から、

看護系ではハード制約で躓く傾向がある、

介護系では、リソースのないところでどうやって人員を捻りだすか?

について、各々トレニンーグが必要との想いを抱くようになりました。

そこで、上記異なる二つの目的を一つのトレーニングプロジェクトにしてみました。目標となる解を示してあります。この解に準じた解を引き出せるようならスケジュールナース有段者、と言えるのではないかと思います。普段のシフト形態とは異なるかもしれませんが、シフトには依存しないように書いたので、どなた様も挑戦して頂きたいと思います。制約そのものを弄ることなく、ハード制約とソフト制約、スタッフプロパティ設定・重みだけで、全く違った解になる醍醐味を味わっていただけます。

schedule_nurse_practical_training.pdf (nurse-scheduling-software.com)

2024年3月4日月曜日

2024年3月1日金曜日

エジプトのナーススケジューリング

 A new formulation and solution for the nurse scheduling problem: A case study in Egypt - ScienceDirect

この論文の通りに実装してみました。

1.The planning horizon is one week, i.e., 7 days.

2. Each day has three types of shifts: morning shift (7 h) from 8:00 AM to 3:00 PM, afternoon shift (7 h) from 3:00 PM to 10:00 PM, and night shift (10 h) from 10:00 PM to 8:00 AM. 

3. Saturday is the first day of each week.

4. The hospital administration is aiming to limit the nurses to work between six and eight shifts a week. 5. The head nurses work only in the morning shifts

Phaseは、3フェーズで、

早番 7時間

遅番 7時間

夜勤 10時間

を定義します。

です。恐ろしいのは、これに残業がオプションで加わります。つまり、10+7で最長17時間勤務がある、ということ。日本より過酷な勤務をする国は、私が知る限り、ここだけです。(EUでは、そもそも10時間以上の連続勤務はあり得ない)

 Each nurse takes at least one day off. 

 Each nurse takes at least two successive shifts off working one shift. 

 If a nurse is assigned to two consecutive shifts, then he/ she takes at least three

1シフト勤務なら、そのあと2連続以上のシフトインターバル、2シフト連続勤務なら、3連続以上のシフトインターバルにします。



法律上、週に56時間Maxなので、次のようにします。また、週1回の休みを制約します。


従来、ExclusiveCheckで、このフェーズ変数の組み合わせ集合は許していませんでしたが、
Primitive(単独Phaseタスク)同士は、許容する仕様変更を行いました。これにより、各フェーズ毎の時間加算が可能になりました。

主任は、早番だけです。
また、上記論文では、前週からの連続性については、言及されていませんが、考慮するべきでしょう。

解は、以下のように、週6シフトを超えた分がコスト超過とみなし、それを最小化する系となっています。

Gurobiで、1秒以下とのことでしたが、スケジュールナースAL3 で、4秒程度でした。

スタッフ数は、46人ですが、スケジューリング期間が1週間と短く小さいインスタンスです。一般に、小さいインスタンスではMIPソルバが有利です。


いつも思うのは、モデリング時間です。世の中にあるナーススケジューリング関係の論文は多分1万を超えていると思います。仮にソルバーが解く時間が1秒だったとしても、モデリング時間は、恐らく、専門家が記述して、今回のような小規模でもデバッグ検証で十数時間かかると思います。だとすると、人との比較は、十数時間+1秒 対 人力時間 であるべきだと思います。

ナーススケジューリング問題でアカデミックが抜けている視点は、モデリング時間とコンフリクト解析 です。人がモデリングする以上、どうしても間違いがあり、そこにデバッグの必要性が生じます。MIPソルバにしても、それに対して解析の手段を持ち合わせてはいません。ハードエラーに対する原因解析機構があるのとないのでは、デバッグ時間に雲泥の差が生じます。私が知る限りにおいて、ハードエラー解析機構を備えているのは数あるソルバーの中でもスケジュールナースのみです。

スケジュールナースなら、上記問題も15分あれば、モデリング可能です。