Google OR-Tools の論理制約の構文が気になります。CPLEX で行った看護師のスケジューリング プロジェクトがあり、それを Google OR-Tools に変換しています。Google OR-Tools のチャネリング制約に関するドキュメントを見つけましたが、混乱しています。Google OR-Tools でこの CPLEX 論理制約を実装する方法を理解していただけますか? 試してみましたが、意図したとおりに機能していません:(
環境:
working_assignment_vars_long[r,h,i] は、役割 r の看護師 i が 15 分間隔 h (つまり 1:15PM) で勤務しているかどうかを示すバイナリ決定変数です。
lunch_break_assignment_vars_long[r,h,i] は、役割 r の看護師 i が 15 分間隔 h (つまり 1:15PM) で休憩中であるかどうかを示すバイナリ決定変数です。
simple_break_assignment_vars_long[r,h,i] は、役割 r の看護師 i が 15 分間隔 h で休憩中であるかどうかを示すバイナリ決定変数です。
したがって、CPLEX のこの制約は、特定の看護師が 15 分間隔で 31 回以下で勤務している場合、昼休みは 0 回、簡単な休憩は 1 回にする必要があることを示しています。
CPLEX 論理制約:
for r, num_role in role_dict.items():
for i in range(0,num_role):
model.add_if_then(
model.sum(model.working_assignment_vars_long[r,h,i] for h in range(0,144))
<= 31,
(model.sum(model.lunch_break_assignment_vars_long[r,h,i] for h in range(0,144)) ==
0) + (model.sum(model.simple_break_assignment_vars_long[r,h,i] for h in range(0,144)) ==
1) >= 2,
'less_than_8_hr_0_lunch_break_1_simple_break'
)
OR-Tools で次のコードを使用してこれを試みました。
for r, num_role in role_dict.items():
for i in range(0,num_role):
b=model.NewBoolVar(‘b’)
model.Add(sum(working.assignment_vars_long[r,h,i] for h in range(0,144)) <= 31).OnlyEnforceIf(b)
model.Add(sum(lunch_break_assignment_vars_long[r,h,i] for h in range(0,144)) == 0).OnlyEnforceIf(b)
model.Add(sum(simple_break_assignment_vars_long[r,h,i] for h in range(0,144)) == 1).OnlyEnforceIf(b)
ただし、これは意図したとおりには機能していません :( 看護師が 15 分間隔で 32 時間未満の勤務で、昼休みも簡単な休憩もありません。洞察や助けをいただければ幸いです。私はこの問題に長い間悩まされています。 :(