パターンのところが新しいです。ひとつひとつ見ていきます。
まず、$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の定義、第一日の定義、スケジュール日の定義は各々の環境で違ってくるでしょうが、
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGndJnRhzNfU62VJpa0B9phW8mjnpFdH97bKoSuA7HqEw-iwYOevwDpmBE3HyVyfNugALMgjLKdyHq4QDMGdbq_K1jdDSut-pWjcYd4nsJVgocT4jM1QQmhXt5sH_XWhcgynPB8vyu4pzW/s320/weekday_def.png)
なお、日の定義は左のようになっています。
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4rhNxjOdbruydhjATZAq2r7g9Wmw1Mv8SdP51_bp7cMuuLr5rirTfX75gWlAGP9Mz-9SJ1ZBsjWjJnXVKCr_tpIELb18dFLIytAv-Exxk2heMJm-UOSawt6CdNQoFC-CKqDOvoYJgEJ2u/s320/days2off_examples.png)
これで平準化前の「連続休みを2回以上」制約が記述できました。
この結果は、勤務表自動作成ソフト スケジュールナースで、14秒かかりました。
今回は、前回と違って、分離した2回以上連続休みしか数えないので、公公公を 2連続休み2回とカウントする不具合はありません。
できれば、休み間隔は、公公-- 2週間--公公
にできればより良い(平準化)、というご要望がありました。
明日実装してみたいと思います。