Processing math: 0%

2014年3月31日月曜日

連続休みを2回以上、連続休み間隔は2週間程度で平準化 その2

下は、連続休み2回以上の制約です。
パターンのところが新しいです。ひとつひとつ見ていきます。
まず、S関数ですが、パターンの加算に関する制約です。 S(min, max, type, pattern...)
これ自体は、今までの最大、最小と同じ意味で、
type 0:  min<= X <=max
type 1:  X>=min
type 2:             X<=max

という制約になります。上の
S(2,0,1..) は、最小2以上 という制約になります。 P(n, パターン)
nは、パターン開始日n のnです。
P(1, xx)は、パターン開始日1のところの日をxのスタートとする という意味です。ここでは、スケジュール開始日の第一日目がxで 第2日目もxであるならマッチして、P(1,xx)の結果は1を返します。
マッチしなければ、0を返します。

P(2,!xxx)は、パターン開始日2のところの日をxのスタートとするという 意味になります。パターン開始日2がスケジュール日(1月1日から1月29)の間 マッチするする部分をSで加算することになります。

まとめると、
最初の日のxxと、最初の日から1月29日まで!xxxにマッチする部分を
加算して、2以上という制約になります。

面倒ですが、「連続休みを2回以上」という制約にしたい場合は、
この行をコピペすればよいです。

勿論、xの定義、第一日の定義、スケジュール日の定義は各々の環境で違ってくるでしょうが、
単に置き換えればよいだけです。

なお、日の定義は左のようになっています。









これで平準化前の「連続休みを2回以上」制約が記述できました。
この結果は、勤務表自動作成ソフト スケジュールナースで、14秒かかりました。

今回は、前回と違って、分離した2回以上連続休みしか数えないので、公公公を 2連続休み2回とカウントする不具合はありません。




できれば、休み間隔は、公公-- 2週間--公公
にできればより良い(平準化)、というご要望がありました。
明日実装してみたいと思います。

0 件のコメント:

コメントを投稿