リニアペアフェーズ制約において、シフトA/シフトBをオプションとして追加しました。
オプションなので、なくても動作します。さらにAについては、タスクAもしくは、シフトAのどちらかが、Bについても、タスクBかシフトBのどちらかがあれば、よくなりました。
例えば、下のAタスクは、記載されていませんが、Aシフトは記述されています。Bについては、BタスクとBシフトの両方が記載されています。
記載されているということは、条件であり、ANDで結ばれることになります。これに対し、記載されてないことはDon't Careということであり、何であってもよい、ということになります。
この問題は、かなり高度な部類です。これ以上複雑なDay条件のときは、タスク予定上の予定テーブルによる記述の方がよいでしょう。
上の記述について解説します。上二つは、会議時に日勤者数最小を規制する制約です。副看護師長会議時の日勤者数を増やす記述です。具体的には、最小値を底上げする記述になります。
<最小値に条件を追加する>
A*Coff<=B*1+0
今、Aは、副看護師長会議時1、その他は、0とします。その他のときは、0ですから、0<=B 常に成立します。会議時は、
Coff<=B
となり、会議時は、Bシフト=日勤は、Coff人以上居ることを要求する記述になります。言い換えると、会議時以外は、何もせず、会議時は、日勤者数を規制する制約となります。この要領で、同じDay集合上に、いくつもの制約をオーバライドすることができます。これがMinに対する整数計画的記法となります。
<最大値に条件を追加する>
問題は、最大値です。
CoffA*A Operator ΣCoffB[i]*B[i]+offset
において、アクティブ0で条件が働くようにします。
通常時、Aは、1としてCoffA+Offset>=ΣCoffB[i]*B[i]
アクティブ時は、0としてOffset>=ΣCoffB[i]*B[i]
と作用させます。つまりOffsetは、Active時の最大値とすればよい訳です。ここで、
offset=-Offset
CoffAは、整数プログラミングの世界では、bigMという呼称が一般的です。
CoffA+Offsetがあり得る最大値以上すればにすれよく、CoffA=bigMがそのための定数です。数理ソルバー的には、一定以上であれば、問題ないのですが、2値ソルバー上では、大きすぎると問題ですので、必要以上に大きくしないようにします。
よって、次のようなマクロ記述になります。
BigMの計算方法
0 件のコメント:
コメントを投稿