まずは、失敗例から。
Σ長日==Σ(夜勤+長多半)
Σ夜勤==Σ(長日+夜多半)
と制約しています。長多半は、長日の方が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 件のコメント:
コメントを投稿