2024年1月14日日曜日

リニアペアフェーズの拡張

 リニアペアフェーズ制約において、シフト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 件のコメント:

コメントを投稿