1

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 時間未満の勤務で、昼休みも簡単な休憩もありません。洞察や助けをいただければ幸いです。私はこの問題に長い間悩まされています。 :(

4

1 に答える 1