2024年9月2日月曜日

長日勤増と夜勤増の実装

 まずは、失敗例から。


Σ長日==Σ(夜勤+長多半)

Σ夜勤==Σ(長日+夜多半)

と制約しています。長多半は、長日の方が1個多いときだけ1、それ以外は0となるシフト、夜多半は、夜勤の方が1個多いときだけ1、それ以外は0となるシフトです。

これは、動きません。例えば、長日=5、夜勤=4だとすると、半休である、長多半が1となり良いように思います。しかし、このとき、第2式は、

4==5+夜多半

となりますから、夜多半がー1であることが要請されます。制約は、全て>=0が前提とされおり、そのような解は、ハード制約の場合許容されません。つまり、長夜差が±1となるようにしたいのに対して、±0しか満足する解はありません。両式をソフト制約とすれば、許容されますが、コストが発生するので、強くセンター±0にしようとする力が働いてしまいます。

なるべくセンター±0になるようにすることは顧客要請ではありますが、意図以上に強く働いてしまうことが問題です。

そこで、考えたのが次です。

両式を合体させた式で、制約式とします。

Σ(長日+夜多半)==Σ(夜勤+長多半)

これだと

長日 夜勤 長多半 夜多半

4   4   0   0

5   4   1         0

4        5          0         1

となって、良さそうです。

しかし、これとは別に、半日なるシフトが予定としてエントリされることがある、

ということです。半日は、0.5公休とカウントします。

半日  公休数(10個基準月)

0       10   

1           10.5

2           10

3           10.5

4           10

..

とカウントさせるのだそうです。上式と上表が独立であれば、何の問題もないのですが、

上表を組み込む必要があるのが、顧客要求です。

どのように、実装すればよいでしょうか?








0 件のコメント:

コメントを投稿