2014-03-06 4 views
1

나는 사전 정의 된 교대 (시간대)와 학생의 가용도 (시간대)를 기반으로 우리 학교의 학생 직원을 스케줄링하는 프로그램을 작성하고 있습니다.예약 가능 근무 시간 조정하기

이것은 직원이 일반적으로 사용 가능하지 않다는 제약 조건을 모델링하는 것을 제외하고는 Air Crew 문제와 유사합니다. 이는 일정에 따라 다릅니다.

노련한 제약 조건 프로그래머가이 문제를 해결하기 위해 권장 할 수있는 모델링 전략은 무엇입니까? 이 최고 (또는 좋은) 방법을 수행

(나는 Gecode을 사용하고 있습니다.)

+2

[간호사 찾기] (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)이 있습니다. –

+1

컴퓨터 사이언스 스택 Exchange : http://cs.stackexchange.com/search?q=scheduling에서 행운을 빈다. –

답변

3

반드시 일정의 당신의 표현에 따라 달라집니다.

이진 가용성 매트릭스를 추가하는 것이 간단한 방법 중 하나입니다. 여기서 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 
    ) 
;