Это проблема, которая у меня возникла на уме в течение долгого времени. Будучи сыном учителя и программиста, мне это приходило на ум раньше, но я до сих пор не нашел для него решения.
Итак, это проблема. Нужно создать график занятий для школы, используя некоторые ограничения. Они обычно делятся на две категории:
Проверка безопасности
- Учитель не может одновременно преподавать два класса.
- Студент не может одновременно выполнять два урока.
- Некоторые учителя должны иметь по крайней мере один выходной день в течение недели.
- Все дни недели должны быть покрыты таблицей времени
- Тема X должна иметь точно так же часы каждую неделю.
- ...
Предпочтения
- Расписание каждого учителя должно быть как можно более компактным (т.е. учитель должен работать все часы в течение дня подряд без пауз, если это возможно)
- Учителя, у которых есть выходные, должны быть в состоянии выразить предпочтение в этот день.
- Учителя, работающие неполный рабочий день, должны быть в состоянии выразить предпочтение, следует ли работать в начале или в конце школьного дня.
- ...
Теперь, после нескольких лет отсутствия решения (и тем временем обучения чему-то еще...), я понял, что это пахнет проблемой NP-hard.
Насколько он доказан как NP-жесткий?
Есть ли у кого-нибудь идея о том, как взломать эту вещь?
Глядя на этот, я задумался над этой проблемой и применим ли в этом случае генетические алгоритмы. Однако было бы довольно сложно изменять возможности при сохранении правил проверки работоспособности. Также мне не ясно, как отличить несовместимые требования.
Небольшое добавление, чтобы лучше определить проблему. Это применяется к классам итальянского школьного стиля, где все учащиеся связаны в разных классах (например, 1-й раздел A), и учителя перемещаются между классами. Все ученики одного и того же класса имеют одинаковый график и не имеют выбора, по которым будут проходить занятия.