2017-01-12 5 views
1

Есть ли способ ограничить количество присвоений для определенного значения переменной?Предельное значение присваивания - Choco

Я пишу расписание с использованием Choco [4.0.1] с курсами, учителями и временными слотами. Тот же учитель может преподавать много курсов, и мне нужно определить количество курсов, которые он может преподавать. Я думал о подсчете количества временных интервалов, например, Учитель B мог работать 12 hours (12 timeslots), поэтому я мог бы разместить ограничение, например arithm(), чтобы это обеспечить. Есть идеи?

[Обновлено]

Вот код:

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

Для каждого курса есть учитель и N временных интервалов, поэтому Учитель А может научить {1,2,3,4} и учитель B {3,4,5}, и каждый курс имеет 4 часа в неделю. Теперь представьте, что A может работать 12 часов. Я бы хотел ограничить A, чтобы преподавать только 12 часов (3 курса), в то время как B преподавал оставшиеся курсы;

Я не могу сказать, сколько курсов есть учитель, но, сколько он/она может научить, поэтому я использую

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

Ну, вот мое решение. Я создал класс Timeslot для представления лекции, содержащей 1 преподавателя, 1 курс, m номеров и n слотов (m=n), поэтому в моей модели есть коллекция timeslot объектов для всех курсов. Я использовал model.count(...), чтобы проверить, сколько временных слотов имеет учитель, и я ставил нуль как нижнюю границу, потому что учитель может быть выбран или нет, а двенадцать - как верхняя граница.

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(); 

Я не знаю, если это оптимальное решение, но в данный момент он работает для меня, и даже времени разрешения был улучшен путем кодирования этого. Благодаря!

Смежные вопросы