Я только начал работать над проектом, который включает некоторую оптимизацию расписания, и я беспокоюсь, что у меня математические воды выше головы. Мне было интересно, можете ли вы придумать какой-нибудь умный способ сделать следующее.
Вот основы:
- У вас есть x количество временных интервалов
- У вас есть y количество интервьюеров преподавателей
- У вас есть z количество соискателей, прошедших собеседование
- x и y не обязательно должны быть равны (может быть разное количество интервьюеров и интервьюируемых)
- Возможно, что во временном интервале ни у кого не будет интервью.
- Они составляют таблицу в виде графика, в котором заголовки строк — это интервьюеры (представленные числами), заголовки столбцов — временные интервалы (представленные числами), а сами ячейки — это кандидаты, которые проходят собеседование.
Ограничения:
- Цифра z может появляться только один раз в каждой строке/столбце, как в судоку (поскольку заявитель не может пройти собеседование с одним и тем же интервьюером дважды, и он/она не может пройти собеседование дважды одновременно).
- Во всей таблице должно быть ровно 3 каждого числа z (потому что все кандидаты должны пройти собеседование ровно 3 раза).
В конце концов, будет использоваться некоторая формула для расчета взвешенного балла для каждой допустимой конфигурации, чтобы определить «наилучшее» состояние платы. Для пояснения мы просто скажем, что это что-то вроде 2a + 5b, где a и b — это разные качества, общие для интервьюеров и соискателей, но сейчас это не важно.
Я пытался придумать какой-нибудь способ генерировать все возможные допустимые конфигурации и, в конечном итоге, вычислять оценку каждой допустимой конфигурации, в конечном итоге выбирая ту, которая имеет наивысший балл. Я столкнулся с некоторыми проблемами, пытаясь найти умный способ сделать это.
Изначально я не чувствовал себя умным и думал о переборе, но это в принципе невозможно из-за большого разнообразия возможностей.
Можете ли вы придумать какой-нибудь более умный способ для меня сократить некоторые ошибочные конфигурации или более умный способ просто создать действительные доски для проверки взвешенных результатов?