Это хороший пример CSP (проблема удовлетворения ограничений) или COP (проблемы оптимизации ограничений), если вы не можете (или не должны) иметь идеальныйрезультат.
Я не буду писать для вас исходный код, но вот основная схема того, что вам нужно сделать:
Рекурсивно попробуйте все возможные комбинации, с сокращением и упорядочением. По сути это означает:
На каждом уровне рекурсии:
- Сортировать записи по количеству оставшихся назначаемых заданий
- Для одного с наименьшим числомзаданий, выберите один из них, чтобы сохранить его, и удалите его из всех остальных.
- Повторите эти шаги для этого задания
- Если вы обнаружите несогласованность (например, у человека больше нет заданий), вернитесь назад (вернитесь врекурсивное дерево до момента, когда было выполнено критическое назначение), и попробуйте другое назначение из оставшихся доступных. Если нет другого возможного назначения, которое не привело бы к несогласованности, вернитесь назад еще
- После того, как всем людям назначены роли, вы можете выйти. Если вы добираетесь до вершины дерева от обратного отслеживания, это означает, что решения не существует.
Все это выше предполагает, что у вас достаточно ролей для всех людей (например, каждый человек может сделать хотя бы одну вещьи вещь не такая, как все остальные). С некоторыми изменениями вы можете немного ослабить это условие (зависит от точного определения вашей проблемы)
Этот алгоритм может привести к нескольким решениям. Из вашего примера:
| 2 | Programmer, Doctor |
| 3 | Programmer, Doctor |
Есть (как минимум) 2 действительных результата. Person #1
будет Programmer
и #3
a Doctor
или наоборот
Есть много других способов ускорить это. Например, вы можете назначать роли людям в наиболее ограниченном порядке, что означает те, которые будут блокировать большинство других людей в первую очередь. Или между каждым шагом выполните проверку согласованности дуги , например AC-3