制約のタイプ
「ペア禁止」と「AならばB] 制約の二つがあります。
ペア禁止は、AさんとBさんの一緒の勤務を禁止するといった制約になります。(シフトを同じにすれば、その勤務で働くことが禁止になります)
個人の名前で制約するときは、演算子「または」「かつ」はどちらでもOKです。
必ず設定しないといけない項目
■適用 チェックしないと制約は無視されます。
■設定 変更後は、設定ボタンをクリックしないと反映されません。
■ペア制約名 曜日タイプ グループタイプ シフトタイプ、制約タイプは、 必ず記載する必要があります。
■制約タイプ 「ペア禁止」「AならばB] のいずれかを指定します。
■ソフトレベルに1から7のいずれかを記載した場合は、ソフト制約、記載しない場合はハード制約となります。
ソフト制約
求解時には、列制約レベルとして表示されるので、該当レベルの適用をチェックしてください。
ペア禁止の解表示
OK/NGが列制約結果部に表示されます。
AならばB制約
Aが真ならばBも真となるようにする、という制約です。Aが真でないときは、Bは何も規制されません。
■演算子 上記例で<=0になっています。この記法で「または」と「かつ」演算子を書くと、次のようになります。
「または」 → >=1
「かつ」 → >=当該全スタッフ
■日オフセット BのAに対するDayオフセットになります。上の例で説明します。
このプロジェクトの「週末」定義は、土日になります。集合としては、先月部から
週末=土日土日土日…
という集合になります。日オフセットが-1のとき、Aが07日で(Sun)で真だったとすると、Bは、その一日前06(土)日に真でなければなりません。
Aが13日で(土)で真だったとすると、Bは、その一日前07(Sun)日に真でなければなりません。
■解表示は、Aが真であるときのみ行います。そのDayは、BのDayです
リニアペア制約
下図青部右クリックで、メニューが出るので、リニアペア制約のを挿入を行います。
数理的表現による制約です。
係数*A 演算子 係数*B +数値オフセット
による制約となります。
新人(A)二人につき、最小一人の指導者の例
新人(A)二人につき、最小一人の指導者(B)を割り当てたいとします。
新人 | 指導者最小人数 |
---|---|
0 | 0 |
2 | 1 |
4 | 2 |
6 | 3 |
ここまでは、依存ないと思います。
奇数人数の扱いについては、
新人 | 指導者最小人数 |
---|---|
1 | 1 |
3 | 2 |
5 | 3 |
7 | 4 |
とするやり方の場合は、次のように記述します。
A<=2*B
新人一人のとき、最小0人の指導者でもよい場合は、
A<=2*B+1
とすれば、
新人 | 指導者最小人数 |
---|---|
1 | 0 |
3 | 1 |
5 | 2 |
7 | 3 |
となります。
会議の制約の例
A*B参加者人数<=B
とします。B集合の人数は、BFULLとしておくと、会議参加者の人数、メンバー等が変更になっても、この制約のメンテは不要です。(AFULLも同様の作用です。) 次の例の場合は、看護師長のみに会議用シフトを割り振っています。この制約とは別に、行制約でこの会議シフトが月に何回あるかの記述が必要です。
フェーズペア制約
下図青部右クリックで、メニューが出るので、フェーズページを挿入を行います。
■シフトAまたはタスクAのうち、どちらかまたは両方が記述されている必要があります。
■シフトBまたはタスクBのうち、どちらかまたは両方が記述されている必要があります。
■フェーズNo.は、必ず指定します。
■フェーズオフセットは、オプションです。指定しないと0となります。
■Bフェーズは、Bフェーズ=Aフェーズ+フェーズオフセット となります。B曜日は、次のように、曜日集合で指定される曜日が計算されます。
例:A曜日=曜日集合[ADay],APhase=5 phase_offset=-6 Phase数6のとき、BPhase=5 B曜日=曜日集合[ADAY-1]
例:会議日に日勤者増
マクロ記述