2. 4 訪問診療クリニック勤務表設計例

夜勤はありませんが、オンコールや、訪問看護等のシフトがあります。固定または、変動の公休日はありません。代わりに、複雑な半日または、1日代休処理が必要となります。

1 制約仕様

コア制約と希望制約に分けて記述します。

○コア制約

●外来勤務、オンコール、訪問看護が明示的なシフトになります。
●その他、半日代休、1日代休、および希望休があります。
●常勤6名、パート1名
●外来勤務は、水土は、半日のみ、日曜祝日は、休み。
●オンコールは、年中無休 1名必要
●訪問看護は、日曜休み、祝日も行うときがある。

※祝日についてですが、訪問診療を同じ曜日で月4回は行いたいので、4週と5週で祝日の取り方が変わります。
5月で考えますと、3日(火)は火曜日が5週まであるので、休みとなります。
4日(水)5日(木)は4週しかない曜日なので祝日も訪問診療に行きます。
6月は祝日なし。
7月は18日(月)月曜日が4週ですので訪問行う
8月祝日なし
9月19日(月)訪問行う。22日(木)休み
10月10日(月)休み
11月3日(木)訪問行う。23日(水)休み
12月に関しましては、年末年始がありますので23日(金)は訪問行います。
以上祝日につきましてはこのようになります。
この祝日に訪問に行った看護師は代休(1日)となります。


●勤務者数

外来 訪問看護 オンコール
2名以上
2名以上
2名以上
2名以上
2名以上
2名以上
- -

●希望休の前にオンコールは入れない
●土曜日の訪問診療に出た看護師は日曜日オンコールをやらない
●半日代休がつくのは?

外来 訪問看護 オンコール
決してつかない 水土に出勤した場合 外来休み日に勤務した場合

*外来休み日の定義:日曜または祝日

●1日代休がつくのは?

外来 訪問看護 オンコール
決してつかない 祝日に出勤した場合 決してつかない

○希望制約

日曜日・水曜日のオンコール、月の総合回数を均等回数になるように
○各曜日の訪問回数の平準化
○訪問看護、オンコールは、連続出勤しない
○休みの前にオンコールは、配置しない 

希望として
・希望休の設定
・出勤するがオンコールのみ出来ないという設定
・水曜日、土曜日の出勤調整(外来のみしかできないなど)
・訪問診療に行きたい希望

○個別制約

スタッフ名 常勤・パート 休み制限 訪問看護 オンコール 備考
A 常勤
B 常勤
C 常勤
D 常勤
E 常勤
F 常勤 水曜休み 行わない 月曜日のオンコールは行わない
G パート 木曜休み 行わない 行わない



2 制約設計

2.1 シフトの割付

勤務の種類に名前をつけていきます。(WとXは使えません。日本語は使えます。) 



2.2 自動スケジュール用のありえる勤務シフトを列挙する

自動割付するシフト(希望休以外)を列挙します。





2.3 外部制約

オンコールや訪問看護を行うと、日によっては、半日もしくは、1日代休が発生します。この発生分に等しい勤務(半日代休、1日代休)を割り振る必要があります。
GUIでこれを行うことは出来ないので、外部制約にて記述しています。



for (人 in 全スタッフ){
	vector VD1,VD,VH1,VH;
	for (day in 全日){
		if (day >=スケジュール開始日){
			if (day in 外来休診日){
				$And($Inv(X[人][day][O]));//外来禁止
				$And($Inv(X[人][day][H]));//半休禁止
				$And($Inv(X[人][day][D]));//1日代休禁止
			}else {
				VD.push_back(X[人][day][D]);//1日代休CNT
				VH.push_back(X[人][day][H]);//半休CNT
				

			}

			if (day in 訪問休診日){
				$And($Inv(X[人][day][V]));//訪問禁止
				VH1.push_back(X[人][day][C]);//オンコール
			}elsif (day in 外来休診日){
				VD1.push_back(X[人][day][V]);//祝日訪問のみ一日代休CNT
				VH1.push_back(X[人][day][C]);//オンコール
			}elsif (day in 水 || day in 土){
				VH1.push_back(X[人][day][V]);//訪問
			}
		
		}
	}
	//print(V1,VD);
	ハード制約A:$And($SeqComp(VD1,VD));
	ハード制約B:$And($SeqComp(VH1,VH));
}


2.4 スタッフプロパティ


個別仕様に基づいて、実装します。(将来の変動に対して強いように)





2.6 パターン制約


オンコール回数、訪問CNTは、最大、最小を狭めることで、平準化を図っています。
また、各曜日の訪問回数も最大値を規定することで、平準化を図っています。従い、スタッフ数の増減があった場合には、この制約により「解がない」事態になり得ます。




また、仕様にはありませんでしたが、C*Cおよび、C**Cを禁止して、オンコールの集中を防いでいます。

2.7 列制約

コア仕様に従って、記述します。



2.8 祝日の定義の仕方

カレンダ上の祝日と、訪問看護の祝日は、異なるので、毎月設定する必要があります。月毎に変る曜日集合は、カレンダで設定します。設定の仕方は、こちらをご参照ください。


2.9 求解


未だ、希望入力していないので、この段階でエラーが出ることは、同じスタッフ設定ではないはずですが一応確認しておきます。


2.10 希望を入力する


コは、オンコール、外は、外来勤務、希望休みは、希、訪問看護は、訪で書き込んでください。

希望の入力によっては、解がない場合もありえます。その場合、希望入力を見直してください。

2.11 スケジュール期間の変更


次月を作成するために、スケジュール開始日、終了日、表示スタート日を下のように変更します。 




2.12 解を予定入力に送る

4月の解を入力に送ります。




送られた側(予定入力には、4月末のデータがはいます。) この作業は、5月1日においても、勤務の連続性を保証させるために必要です。

2.13 祝日を再定義する


訪問看護の祝日を定義します。




2.14 名前を変更して保存する

名前をつけて保存します。必ず名前をつけて保存で保存してください。本プロジェクトの場合、プロジェクトファイル以外に外部制約ファイルを使います。
外部制約ファイルは、プロジェクト名.txt になっています。(名前をつけて保存すると外部制約ファイルも同時に生成コピーされますので、外部制約ファイルの存在を気にしなくてもよくなります。)


以上で、5月のプロジェクトファイルが出来上がりました。勤務希望入力して解を得てください。


3 追加設計

3.1 オンコール→訪問パターンの禁止


3.2 希望半代休の追加