(Прежде чем кто-нибудь спросит, это не домашнее задание.)
У меня есть набор работников с интересами, то есть:
-
Боб: Java, XML, Ruby
-
Сьюзан: Java, HTML, Python
-
Фред: Python, Ruby
-
Сэм: Java, Ruby
-
и др.
(На самом деле где-то в диапазоне 10-25 "интересов" для каждого работника, и у меня около 40-50 человек)
В то же время у меня очень большой набор задач, которые необходимо распределить между рабочими. Каждая задача должна быть назначена как минимум 3 работникам, и рабочие должны соответствовать хотя бы одному из интересов задач:
Задача 1: Ruby, XML Задача 2: XHTML, Python
и т.д. Таким образом, Боб, Фред или Сэм могут получить задание 1; Сьюзен или Фред могли получить задание 2.
Все данные хранятся в базе данных:
Task
id integer primary key
name varchar
TaskInterests
task_id integer
interest_id integer
Workers
id integer primary key
name varchar
max_assignments integer
WorkerInterests
worker_id
interest_id
Assignments
task_id
worker_id
date_assigned
У каждого работника максимальное количество заданий, которые они будут делать, около 10. Некоторые интересы встречаются реже, чем другие (т.е. только 1 или 2 работники указали их как интерес), некоторые интересы более распространены (т.е. половина рабочие перечисляют их).
Алгоритм должен:
- Назначьте каждую задачу 3 работникам (это предположил, что по крайней мере 3 из работники заинтересованы в одном из интересы задачи).
- Назначить каждому работнику 1 или более задач
В идеале алгоритм будет:
- Назначьте каждому работнику ряд задач, пропорциональных их максимальным назначениям, и общее количество задач. Например, если Сьюзан заявит, что она выполнит 20 заданий, и большинство людей выполнит только 10 заданий и будет 50 рабочих и 300 заданий, ей должно быть назначено 12 заданий (20/10 * (300/50)).
- Назначьте различные задачи каждому работнику, поэтому, если Сьюзен перечисляет 4 вопроса, она получает задания, которые включают 4 интереса (вместо того, чтобы получать 10 заданий с одинаковым интересом).
Самым сложным аспектом до сих пор было решение этих проблем:
- задачи, имеющие интересы с несколькими соответствующими работниками
- работники, у которых мало интересов, особенно
- работники, у которых есть несколько интересов, для которых существует относительно мало задач.