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 件のコメント:

コメントを投稿