Мне бы просто хотелось, чтобы кто-нибудь проверил, является ли следующая задача NP-полной или есть ли на самом деле лучшее / более простое решение, чем простая проверка комбинации методом грубой силы.
У нас есть проблема с распределением ресурсов в нашем программном обеспечении, и я объясню это на примере.
Допустим, нам нужно 4 человека, чтобы быть на работе в дневную смену. Это число и тот факт, что это «дневная смена», занесено в нашу базу данных.
Однако нам не нужно, чтобы кто-то заполнял эти места, есть некоторые требования, которые необходимо заполнить, чтобы соответствовать требованиям.
Из этих 4, скажем, 2 из них должны быть медсестрами, а 1 из них - врачами.
Один из врачей также должен работать в составе определенной команды.
Итак, у нас есть этот набор информации:
Дневная смена: 4
1 врач
1 врач, необходимо работать в команде A
1 медсестра
Выше не проблема. Проблема возникает, когда мы начинаем выбирать людей для работы в дневную смену и пытаться выяснить, могут ли люди, которых мы выбрали до сих пор, действительно соответствовать критериям.
Например, допустим, мы выбираем Джеймса, Джона, Урсулу и Мэри на работу, где Джеймс и Урсула - доктора, а Джон и Мэри - медсестры.
Урсула также работает в команде А.
Теперь, в зависимости от порядка, в котором мы пытаемся удовлетворить весь счет, мы можем прийти к выводу, что у нас есть подходящие люди, или нет, если мы не начнем пробовать разные комбинации.
Например, если сначала пойти по списку и выбрать Урсулу, мы могли бы сопоставить ее с критериями «1 врач». Затем мы подошли к Джеймсу и заметили, что, поскольку он не работает в команде А, другие критерии, касающиеся «1 врач, должны работать в команде А», не могут быть им заполнены. Поскольку два других человека являются медсестрами, они также не будут соответствовать этим критериям.
Итак, мы вернемся назад и сначала попробуем Джеймса, и он тоже сможет соответствовать первым критериям, а затем Урсула сможет соответствовать критериям, которые нужны этой команде.
Таким образом, проблема выглядит так, что нам нужно попробовать разные комбинации, пока мы не попробуем их все, и в этом случае у нас есть некоторые критерии, которые еще не заполнены, даже если общее количество работающих головок одинаково как общее количество необходимых головок, или мы нашли комбинацию, которая работает.
Это единственное решение, кто-нибудь может придумать лучшее?
Редактировать : некоторые пояснения.
В комментариях к этому вопросу упоминается, что с этим небольшим количеством людей мы должны использовать грубую силу, и я согласен, что это, вероятно, то, что мы могли бы сделать, и мы могли бы даже сделать это, в той же полосе, на которую смотрят некоторые оптимизационные решения. размер данных и выбирает различные алгоритмы сортировки с меньшими начальными издержками, если размер данных небольшой.
Проблема, однако, заключается в том, что это является частью системы планирования реестра, в которой может быть задействовано довольно много людей, как «Нам нужны X человек в дневную смену», так и «У нас есть этот пул». из Y людей, которые будут это делать ", а также потенциал для большого" У нас есть этот список критериев Z для тех X людей, которые должны будут каким-то образом совпадать с этими людьми Y ", а затем вы добавляете к тому факту, что у нас будет несколько дней, чтобы выполнить тот же расчет в режиме реального времени, так как лидер корректирует реестр, а затем возникла необходимость в скорейшем решении.
По сути, лидер увидит на экране информацию о сумме в реальном времени, которая скажет, сколько людей все еще не хватает, как на дневную смену в целом, так и на то, сколько людей соответствует различным критериям и сколько люди, которых мы на самом деле нед в дополнение к тем, которые у нас есть. Этот дисплей должен будет обновлять период полураспада, в то время как лидер корректирует список следующим образом: «Что если Джеймс выберет дневную смену вместо Урсулы, а Урсула - ночную смену».
Но огромное спасибо людям, которые уже ответили на этот вопрос, проблема удовлетворения ограничений звучит так, как нам нужно, но мы определенно рассмотрим все ссылки и названия алгоритмов здесь.
Вот почему я люблю StackOverflow:)