Q.以下の画像の行制約において、No8の制約ではNo9・No10を合わせた制約と同じ効果を発揮しない。以下のようなパターンが解として出現してしまうのは、何故?
■No8の制約の意図するところを、言葉にすると、「夜勤2連勤の後、2連勤」を禁止
になります。Xは、休みで、✓X=勤務になります。
✓X✓X=2連勤務になります。
■解は、上制約に違反していないことに注意してください。解「2連夜勤勤務の後、勤入」は、「夜勤2連勤の後、2連勤」を禁止、となんら矛盾しません。禁止していないので、ありえることになります。
■パターンは、全要素に対してANDで動作します。No.8で禁止しているのは、6パターン全体のAND 「入明入明勤勤」を禁止しているだけです。これは、解「入明入明勤入」を含みません。よって「あり得る」ことになります。
一方、
■No.9は、「入明入明勤」を禁止にしています。もし「入明入明」が来たとすると次は、
「入明入明休」しかありえない訳です。
■No.10は、さらに「入明入明休」まできたときに「入明入明休勤」を禁止しているので、
「入明入明休休」以外ありえない、つまり「夜勤2連勤の後は、2連休でなけれならない」という仕様の実現になっている訳です。
こうした、パターンに関しては、制約設計者の生みの苦しみ部分だと思います。一般の利用書は、出来上がった行制約パターンを利用するだけで済むので、立ち入ることはないのですが、制約を設計する人は、そうはいきません。一つ一つ解決していけばよいと思います。
一般に、長いパターンは、短いパターンに規制されています。今回で言えば、
と記述されているので、夜勤2連続可能者の明け後は、すでに、No.6で、休みか入り、に限定されています。ちなみに、2連夜勤後の休みは、No.9で限定されているので、No.10のX✓Xの部分は、*✓Xとしてもよいです。(*は、Dont’care ブランク)
もう一つ注意点としては、パターンをいじったら、今月自動にしておくと、先月からの連続部分も正しく、動作します。その際に、先月分の長さが足りていることが必要になります。
0 件のコメント:
コメントを投稿