2025年8月28日木曜日

Q.夜勤の際に、特定の人間との夜勤の回数を一回以下にしたいのですがどのようにすればよろしいでしょうか。

 Ans.

似た実装として例として、以下があります。

https://schedule-nurse.blogspot.com/2024/04/q_14.html

題意は、特定のスタッフとそれ以外との夜勤ペア回数を最大1回にしたいということですが、

これは、日々の列制約(全てのペア組み合わせ)に対して、行制約=今月期間中に最大1回と、列と行の複合制約となります。こうした複合制約については、Pythonでしか書けません。

以下は、プロジェクトを走らせた様子です。解がない可能性がありますので、

■ソフト制約にする(ソフトレベル設定で、適用と重みを設定)

することと、言語制約にチェックを入れることが必要です。



スタッフプロパティシートで、ペア回数を最大1回にするスタッフを設定します。

上のメニューにするためのグループ定義記述です。

解になります。ペア回数を最大1回にしたところのスタッフは、全スタッフに対して最大1回にソフト制約されます。
このように、Python記述をブラックボックスとして、将来に渡る変更は、スタッフプロパティシートで吸収できるようにするのが、良い実装です。スタッフ個別名を用いていない点に注意してください。


実装は、以下となります。Python記述は、ブラックボックスとして扱えるように記述しています。(僅か十数行です。”夜勤”の部分をご自分のプロジェクトのシフト名に入れ替えれば汎用的に使える記述です。)



import sc3


def ペア回数制限Sub(person1,person2):
    if person1==person2:#同じ人は制約しない
        return
    list=[]
    for day in 今月:
        v1=sc3.GetShiftVar(person1,day,'夜勤')
        v2=sc3.GetShiftVar(person2,day,'夜勤')
        list.append(v1&v2)
    s=staffdef[person1]+"と"+staffdef[person2]+"の組み合わせ回数"
    print(s)
    sc3.AddSoft(sc3.SeqError(0,1,3,list),s,5)#min max allowable errors 最大1回に制限

def ペア回数制限():
    for 特別person in 夜勤ペア最大1回:
        for person in 全スタッフ:
            ペア回数制限Sub(特別person,person)

ペア回数制限()


0 件のコメント:

コメントを投稿