Я думаю, что вы описываете ситуацию, когда у вас есть две «приоритетные очереди» - одна для рабочих мест и одна для рабочих. Наивный подход заключается в том, чтобы взять работу с наивысшим приоритетом и работника с наивысшим приоритетом и попытаться соединить их. Но, конечно, это не помогает, когда работник не может выполнить задание.
Чтобы исправить это, я бы предложил сначала взять на себя работу с наивысшим приоритетом, а затем итерировать по всем рабочим в порядке убывания приоритета, пока не найдете тот, который сможет обработать эту работу. Если никто из работников не может обработать задание, тогда возьмите вторую работу с наивысшим приоритетом и так далее. Таким образом, у вас есть вложенные циклы, что-то вроде этого:
def getNextWorkerAndJobPair():
for job in sorted(jobs, key=priority, reverse=True):
for worker in sorted(workers, key=priority, reverse=True):
if worker.can_process(job):
return (worker, job)
Приведенный выше пример сортирует данные без необходимости много раз. Чтобы избежать этого, лучше всего хранить данные уже в отсортированном порядке. Что касается того, какие структуры данных использовать, я не совсем уверен, что лучше. В идеале вам нужно, чтобы O (log n) вставляло и удаляло, и чтобы можно было перебирать коллекцию в отсортированном порядке за O (n). Я думаю, что PriorityQueue соответствует первому из этих требований, но не второму. Я полагаю, что сортированный список из пакета blist сработает, но я сам не пробовал, и на веб-странице не говорится о гарантиях производительности, которые предлагает этот класс.
Способ, которым я предлагал сначала выполнить итерации по заданиям, а затем по рабочим во внутреннем цикле, - это не единственный подход, который вы могли бы использовать. Вы также можете изменить порядок циклов, чтобы сначала выбрать работника с наивысшим приоритетом, а затем попытаться найти для него работу. Или вы можете найти допустимую пару (работа, работник), которая имеет максимальное значение f (priority_job, priority_worker) для некоторой функции f (например, просто добавить приоритеты).