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