仕様は以下です。
長日者数3名のとき、要求をそのまま実装しようとすると、2+2+2+2=8名となってしまい、7名以上を上回ることになってしまいます。
ただし、仕様をよく見ると、そういう場合は、1名でも良いことになっています。
これらを勘案すると、共通ルールは、AチームBチーム共、日勤者3名以上、ということになります。ただし、長日2名時は、AチームBチーム共、日勤者4名以上という特殊ルールとなります。一般に、上のように一見複雑な仕様を紐解き、シンプルな制約に変換するのは、熟練を要します。
<等号関係を見つける>
長日2名+Aチーム4名==6
長日3名+Aチーム3名==6
とう等式が見つかりました。
ただし、長日3名時全体として、日勤者7名以上が要請されているので、Aチームまたは、Bチームのどちらかは4名、どちらかは3名になります。次の不等式を満たせばよいことになります。
長日(全体)+A/Bチーム≧6
ここで、長日とA/Bチームの集合が違うことに注意してください。集合が異なるのでGUIでは記述できません。Pythonによる記述となります。長日に対しては、全体集合、チームに対しては、A/Bチームで足し算を行います。Min=6、Max=7、Tolerance=4、レベル2で制約しています。
これは、結構難しい制約です。
別解としては、日勤者3名以上を標準列制約、長日2名時ならば、Aチーム4名以上というペア制約AならばBで制約する手があります。この方法はGUIで記述出来ますが、重いので、今回はPythonで記述しました。
0 件のコメント:
コメントを投稿