Предельное значение присвоения - Choco

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

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

[Обновлено]

Вот код:

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

Для каждого курса есть учитель и Nвременных интервалов, поэтому учитель А может преподавать {1,2,3,4}, а учитель Б {3,4,5}, и каждый курс имеет 4 часа в неделю. Теперь представьте, что А может работать 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;

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


person psi_    schedule 12.01.2017    source источник
comment
Можете ли вы поделиться с нами каким-либо кодом? Если нет, то ваш вопрос может быть слишком широким, и вы должны сначала попробовать что-то.   -  person Tim Biegeleisen    schedule 12.01.2017
comment
Просто назначьте курсы для каждого временного интервала, и если что-либо было назначено ранее, действуйте соответствующим образом, т. е. разрешите только один курс для каждого временного интервала и учителя, и все будет готово.   -  person Thomas    schedule 12.01.2017
comment
@TimBiegeleisen Я добавил код на свой вопрос, не могли бы вы взглянуть?   -  person psi_    schedule 12.01.2017


Ответы (1)


Ну, вот мое решение. Я создал класс 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();

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

person psi_    schedule 14.01.2017