반드시 일정의 당신의 표현에 따라 달라집니다.
이진 가용성 매트릭스를 추가하는 것이 간단한 방법 중 하나입니다. 여기서 x [i, j] = 1은 j 번째 날짜에 i 번째 사용자를 사용할 수 있음을 표시합니다 (또는 일정 표시에 따라 바뀝니다) .
이 간단한 예는 MiniZinc의 간호사 이동을위한 표준 모델 ("tutorial/nurse.mzn", "regular"제약 조건 보여주기)을 사용하고 가용성 매트릭스를 추가하는 것입니다. 여기에 내 버전이 있습니다 : http://www.hakank.org/minizinc/nurse_rostering_with_availability.mzn
사람을위한 특정 슬롯에 대한 지정은 특정 날짜 ("available [i, j] = 1")로 표시된 특정 날짜에 작업 할 수 있도록해야합니다. 또한
% availability matrix
array[1..num_nurses, 1..num_days] of int: available =
array2d(1..num_nurses, 1..num_days,
[
% days
1,1,0,1,1,1,1, 1,1,1,0,1,1,1, % nurses
0,1,1,1,0,1,1, 0,1,1,1,1,1,1,
1,0,1,1,0,1,1, 1,0,0,1,1,0,1,
1,1,1,1,1,0,1, 1,0,1,1,1,1,0,
1,1,1,0,1,1,1, 1,1,1,1,0,1,1,
1,1,0,1,1,0,1, 1,1,0,1,1,1,0,
1,1,1,0,1,1,1, 1,1,1,0,1,1,1,
]);
% ...
% for each day the must be at least 3 nurses with day shift,
% and 2 nurses with night shifht
constraint
forall(j in 1..num_days) (
sum(i in 1..num_nurses) (
bool2int(x[i,j] == day_shift /\ available[i,j] = 1)) >= 3
/\
sum(i in 1..num_nurses) (
bool2int(x[i,j] == night_shift /\ available[i,j] = 1)) >= 2
)
;
는, 사람이 의무 날 그는 꺼져 있는지 강제로/그녀는 사용할 수 없습니다, 우리가 그것을 설정이 모델 "off_shift"로 설정합니다.
constraint
forall(i in 1..num_nurses, j in 1..num_days) (
if available[i,j] = 0 then
x[i,j] = off_shift
else
true
endif
)
;
[간호사 찾기] (https://www.youtube.com/watch?v=7nPagqJK3bs)와 어떻게 다른가요? 간호사 찾기를 위해 많은 알려진 모델 전략이 있습니다. INRC2011의 모든 요구 사항을 충족하는 [내 모델] (https://github.com/droolsjbpm/optaplanner/tree/master/optaplanner-examples/src/main/java/org/opt/planner/examples/nurserostering/domain)이 있습니다. –
컴퓨터 사이언스 스택 Exchange : http://cs.stackexchange.com/search?q=scheduling에서 행운을 빈다. –