2017-01-12 7 views
1

변수의 특정 값에 대한 할당 수를 제한하는 방법이 있습니까?할당 값 제한 - Choco

나는 과정, 교사 및 타임 슬롯과 Choco [4.0.1]를 사용하여 일정 문제를 쓰고 있어요. 같은 선생님이 여러 과목을 가르 칠 수 있으며 가르 칠 수있는 과목의 수를 정의해야합니다. 나는 교사가 B를 12 hours (12 timeslots) 일할 수있는 것처럼 timeslots의 수를 세고 생각했다. 그래서 나는 arithm() 같은 제약을 게시 할 수 있었다. 어떤 아이디어?

은 [업데이트] 여기

몇 가지 코드 : 교사 A는 가르 칠 수 있도록 교사와 N 타임 슬롯이 있습니다

IntVar [] teachers; 
IntVar [][] teacherTimeslots; 
IntVar [] courses; 

각 코스에 대한 {1,2,3,4} 교사 B {3,4,5} 그리고 각 과정은 주당 4 시간을 가지고 있습니다. 이제 A가 12 시간 동안 일할 수 있다고 상상해보십시오. B가 나머지 과목을 가르치는 동안 A 만 12 시간 (3 과목)을 가르치도록 제한하고 싶습니다; 나는 선생님을 얼마나 많은 과정 말할 수 없다

하지만 얼마나 많은 그/그녀가 가르 칠 수있는, 그래서 그/그녀가 특정 과목을 가르 칠 수 있는지 확인하기 위해

Tuples tuples = new Tuples(true); 
tuples.add(1, 1); 
... 
tuples.add(2, 5); 
model.table(teacher, course, tuples).post(); 

제약 조건을 사용하고 있습니다.

teacherTimeslots은 모든 가능한 타임 슬롯으로 채워져 있으며 각 교사 타임 슬롯을 고유하게 유지하기 위해 model.allDifferent(teacherTimeslots[teacher]).post()을 사용합니다.

내 코스는 너무

course[0] = 1; 
... 
course[4] = 5; 

나는 내 모델을 짓고 있어요 때 선택에는 슬롯이없는 교사에 대한 모든 슬롯을 받고 있지만, 생각 고정, 그래서 모든 가능성을 얻을 '.

+1

다른 코드를 우리와 공유 할 수 있습니까? 그렇지 않다면 질문이 너무 광범위 할 수 있으므로 먼저 시도해야합니다. –

+0

각 시간대에 코스를 지정하고 이전에 할당 된 것이 있다면 그에 따라 행동합니다. 즉, 타임 슬롯과 교사 당 하나의 코스 만 허용하고 갈 수 있어야합니다. – Thomas

+0

@TimBiegeleisen 질문에 대한 몇 가지 코드를 적어 두었습니까? –

답변

0

음, 여기 내 솔루션입니다. 1 교사, 1 코스, m 개의 방과 n 슬롯 (m=n)을 포함하는 강의를 표현하기 위해 Timeslot 클래스를 만들었습니다. 따라서 내 모델에는 모든 코스에 대해 timeslot 개체의 컬렉션이 있습니다. 나는 model.count(...)을 사용하여 얼마나 많은 timeslots에 교사가 있는지 확인하고 교사가 선택 될 수 있고 그렇지 않은 경우 상한으로 12 번 있기 때문에 0을 하한으로 두었습니다.

List<IntVar> teachersTimeslotList = new ArrayList<IntVar>(); 

List<IntVar> teachersList = new ArrayList<IntVar>(); 

for (int i = 0; i < timeslots.size(); i++) { 

    for (int j = 0; j < timeslots.get(i).getTimeslots().size(); j++) { 

     IntVar timeslot = timeslots.get(i).getTimeslots().get(j); 
     IntVar teacher = timeslots.get(i).getTeacher(); 

     IntVar sumTeacher = model.intVar("sumTeacher", 0, 100000); 

     teachersList.add(teacher); 

     model.sum(new IntVar[]{model.intScaleView(timeslot, 1000), teacher}, "=", sumTeacher).post(); 

     teachersTimeslotList.add(sumTeacher); 
    } 
} 

for (int i = 0; i < teacheresId.length; i++) { 
    model.count(teacheresId[i], teachersList.toArray(new IntVar[teachersList.size()]), model.intVar(0, 12)).post(); 
} 

model.allDifferent(teachersTimeslotList.toArray(new IntVar[teachersTimeslotList.size()]), "NEQS").post(); 

이 최적화 된 솔루션의 경우 나도 몰라하지만 지금은 저와도 해결 시간을 위해 일하고있어이 코딩으로 향상되었다. 감사!