Запланируйте расписание в optaplanner, которое учитывает перерывы - PullRequest
0 голосов
/ 05 апреля 2020

Короче говоря: я составил расписание, которое должно быть заполнено уроками. Я использую timegrains , поэтому уроки могут быть от 5 минут до 120 минут. Моя проблема в том, что иногда длинный урок содержит 1 или более перерывов по x минут.

Например: допустим, у расписания есть временные интервалы в 45 минут, а затем 15-минутный перерыв.

Monday:
09:00 -> 09:45 (timeslot1)
09:45 -> 10:00 (break1)
10:00 -> 10:45 (timeslot2)
10:45 -> 11:00 (break2)
11:00 -> 11:45 (timeslot3)
11:45 -> 12:00 (break3)
12:00 -> 12:45 (timeslot4)
12:45 -> 13:00 (break4)

Same schedule applies for the rest of the week...

Как мне запланировать 1 урок 90 минут (2 x 45 минут) и чтобы быть уверенным, что он идет после друг друга (скажем, timeslot1 и timeslot2)?

Я знаю, что могу сделать 2 урока по 45 минут, но тогда мне нужно логи c, чтобы справиться с тем, что уроки следует проводить друг за другом. И код станет еще «уродливее», если у меня будет расписание с разной длиной временных интервалов и перерывов.

Ответы [ 3 ]

0 голосов
/ 05 апреля 2020

Вы можете добавить проверку ограничения для общей продолжительности всех уроков этого типа, которая составляет 90 минут. Затем вы можете добавить, скажем, до 3 уроков этого типа и позволить длине урока быть равной 0. Затем Optaplanner либо поместит один урок в интервал 90 минут, а остальные уроки обнулят, либо поместит все 3 урока в слоты. скажем, 20, 20 и 30 минут. Затем вы должны добавить проверку ограничений для всех трех уроков, следующих друг за другом, как описано в моем другом ответе.

0 голосов
/ 07 апреля 2020

Идея попробовать:

  • использовать временной интервал шаблон.
  • интерфейс Урок (не объект планирования)
  • @ PlanningEntity ActiveLesson расширяет урок.
    • подлинный объект планирования
    • имеет подлинную комнату теневых переменных и временной интервал
    • имеет подписку FollowingLesson
  • FollowingLesson расширяет урок
    • объект планирования тени
    • его комната и временной интервал являются теневыми переменными, которые исходят из комнаты ActiveLesson (та же самая) и временного интервала (одна позже, ноль, если день между или последними). ​​
0 голосов
/ 05 апреля 2020

Я решаю эту проблему Double-Lesson , имея два отдельных урока по 45 минут и добавляя ограничение, которое вознаграждает их, если они проводятся непосредственно друг за другом. В API-интерфейсе потока ограничений это выглядит следующим образом:

factory.from(Lesson.class)
        .join(Lesson.class, equal(Lesson::getCourse, Lesson::getCourse),
            equal(Lesson::getDay, Lesson::getDay))
        .filter((first, second) -> (second.getTimeslot() - first.getTimeslot() == 1)
            && lessonNeedsToBeDoubleLesson(first))
        .reward("reward Double lessons", HardSoftScore.ofHard(1));

Функция lessonNeedsToBeDoubleLesson() проверяет, нужно ли планировать урок как Двойной урок .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...