Алгоритмы оптимизации очереди заданий - PullRequest
11 голосов
/ 23 июня 2009

У нас есть приложение, которое требует назначения заданий ресурсам. Ресурсы имеют ряд атрибутов, которые определяют их пригодность для конкретной работы - некоторые из них являются предпочтениями, некоторые - жесткими ограничениями (все разнообразие членства, например, «ресурс A подходит для работ с цветом X, Y или Z»).

Ресурсы имеют стоимость, связанную с ними (продолжительность, которую они проводят онлайн). У нас есть возможность привлекать ресурсы - это занимает разное количество времени. Мы можем нанять на фиксированный интервал времени.

Чтобы дать представление о масштабе: в любой момент времени будет около 20 ресурсов, 100 выдающихся рабочих мест. Завершение работ занимает 5-15 секунд. Рекрутинг ресурса занимает около 1-2 минут, и мы можем нанять от 1 до 30 минут времени (повторный рекрутинг разрешен). У нас не так много хедз-апов на поданных работах, возможно, несколько секунд.

Целью является выполнение заданий с наименьшими затратами (использование ресурсов) для заданной средней задержки (время завершения задания).

Буду признателен за указатели на алгоритмы, библиотеки программного обеспечения или подходы к решению этой проблемы.

Ответы [ 9 ]

2 голосов
/ 23 июня 2009

Возможно, стоит рассмотреть проблему рюкзака или проблему упаковки бункера , поскольку в принципе они аналогичны тем, что вы пытаетесь сделать здесь.

В описании вашей проблемы вы упоминаете, что целью является выполнение заданий с наименьшей задержкой. Если это на самом деле ваша единственная цель, то решение простое - нанять все доступные ресурсы. Многие из них будут простаивать большую часть времени, но это в значительной степени гарантирует минимальную задержку.

Я подозреваю, что ваша настоящая цель состоит в том, чтобы как можно меньше свести к минимуму задержки и ресурсы простоя, поэтому здесь всегда будет компромисс между задержкой и потраченными впустую ресурсами.

1 голос
/ 23 июня 2009

Это похоже на несколько вещей: экономичный объем заказа, уравновешивающий первоначальную стоимость найма с затратами; LP или IP, минимизирующие формулу для общих затрат с учетом различных ограничений; а затем есть распределение вероятностей (время для найма; требуются ли рабочие ресурсы?), что делает все это стохастическим.

Это звучит достаточно сложно, что, если бы я делал это, я бы, вероятно, настроил симуляцию. Система не кажется слишком сложной, чтобы сделать это, или слишком математически обременительной, чтобы работать для большого количества итераций или длительного времени выполнения, поэтому вы можете получить довольно стабильные и полезные результаты.

0 голосов
/ 25 июня 2009

Несколько мыслей:

  • Существуют ли группы заданий, которые можно сгруппировать - все имеют одинаковые базовые требования?
  • есть ли люди, которые также могут быть группами вместе - все имеют базовые навыки

Если это так, то вы можете с самого начала уменьшить сложность, а затем использовать некоторую форму взвешенных средних для предпочтений. Кроме того, когда вы набираете, так как мин. Вы можете набирать на это 30 минут, и, предполагая, что они дороже, вы, вероятно, хотите убедиться, что они имеют самые высокие уровни использования.

Вот несколько статей, которые могут помочь:

0 голосов
/ 23 июня 2009

Это очень похоже на Операционная система реального времени Планирование. В Википедии подробно описаны некоторые используемые алгоритмы:

  • Совместное планирование
    • Круговое планирование
  • Упреждающее планирование
    • Фиксированное приоритетное упреждающее планирование, реализация упреждающее отсечение времени
    • Упреждающее планирование критического сечения
    • Статическое планирование времени
  • Самый ранний срок Первый подход
  • Расширенное планирование с использованием стохастика и MTG
0 голосов
/ 23 июня 2009

Удивительный вопрос !!

Я хотел бы изучить динамическое программирование, линейную оптимизацию и теорию очередей. К сожалению, для меня нет простого способа ответить на эти вопросы. У меня нет математических знаний, необходимых для того, чтобы дать вам надежный и оптимальный ответ на эти вопросы.

Однако, если вы увлекаетесь такими вещами, это звучит как возможность получить хорошее, хотя, вероятно, не оптимальное, решение с использованием алгоритма искусственного интеллекта. Я бы порекомендовал либо генетический алгоритм, либо смоделированный отжиг. Все это не займет много времени для написания кода. Идея состоит в том, что вы выбираете случайные, действительные входные данные и можете изменять эти потенциальные решения, превращая их в лучшие (или выбирая новые автоматически) с течением времени. Это хороший компромисс между получением оптимальных ответов и вечными затратами на кодирование и доказательство правильности.

0 голосов
/ 23 июня 2009

Боюсь, у меня нет простого ответа для вас, но вот еще несколько связанных ресурсов, которые можно прочесать для идей.

О многомерных задачах упаковки

Векторная стратегия динамического распределения ресурсов

0 голосов
/ 23 июня 2009

Эту проблему можно рассматривать как задачу линейной оптимизации, поэтому this должно быть началом. Я использовал эту библиотеку , однако в ней есть много других вещей, поэтому она может быть излишней. Вместо этого нетрудно разработать собственную библиотеку, в этой книге есть хорошая глава по LP.

0 голосов
/ 23 июня 2009

Мне неизвестна литература по таким проблемам. Я предполагаю, что есть некоторые, так как теория массового обслуживания - большая академическая область, и это не походит на смехотворно сложную ситуацию. Имейте в виду, тот факт, что вы заботитесь о средней задержке, а не о задержке в худшем случае или латентности N-го процентиля, может поставить вас в меньшинство.

Мой первый инстинкт заключается в том, что, поскольку кажется, что вокруг много рабочих мест, хорошее решение будет иметь несколько «гибких» работников, постоянно работающих. Это набор работников, которые между ними могут выполнять большинство типов общих заданий с приемлемой задержкой. Чем меньше задержка, тем больше ресурсов в этом наборе и тем больше времени они проводят в режиме ожидания. Кроме того, чем более «пакетным» будет ваш ввод (при условии, что пакеты непредсказуемы), тем больше времени простоя вам потребуется, чтобы предотвратить высокую задержку во время пакетов.

Затем в двух случаях вы нанимаете дополнительных «специализированных» работников:

1) Редкий тип работы, при которой ваш нынешний набор сотрудников может работать только при высоких затратах времени или нет вообще. Таким образом, вы нанимаете (грубо говоря) любого, кто может сдвинуть его, а затем максимально использовать оставшуюся часть своей очереди.

2) Нет такой работы, но вы найдете возможность нанять кого-то, кто, как оказалось, может взять какую-то комбинацию заданий из текущей очереди, и делать это дешевле, чем ваши текущие сотрудники, но не выходя из Текущие нанимает без дела. Таким образом, вы нанимаете этот ресурс.

Что касается фактического алгоритма: почти наверняка невозможно найти лучшее решение в вычислительном отношении, поэтому правильный ответ зависит от ресурсов обработки, а вы смотрите на эвристику и решение частичных задач. Пока все, кого вы нанимаете, заняты, и вы не можете нанимать кого-либо еще, не вызывая значительного простоя в какой-то момент в будущем, вы, вероятно, находитесь рядом с хорошим решением и где-то рядом с «наибольшим преимуществом за доллар» «точка компромисса между задержкой и стоимостью. Найм большего количества ресурсов после этого дает уменьшающуюся отдачу, но это не означает, что вы не готовы делать это за указанную задержку и / или указанный бюджет.

Но это зависит от того, как выглядят входящие вакансии: если у вас есть ресурс, который может выполнять только один тип работы, и эта работа выполняется только один раз в день / неделю / год, то, вероятно, лучше нанять их один раз в день, чем ждать, когда у вас будет достаточно этой работы, чтобы заполнить свой минимально возможный временной интервал (именно поэтому пожарные проводят большую часть своего времени, играя в карточные игры, тогда как машинистки проводят большую часть своего времени, печатая. Всегда достаточно набирать текст, чтобы сохранить хотя бы одну машинистку заняты, но пожары случаются редко. Кроме того, мы не хотим, чтобы при пожарах использовалось решение «большинство ударов за доллар», нам нужна более низкая задержка, чем это). Так что, возможно, есть возможность настроить алгоритм для вашего конкретного набора ресурсов и схемы входящих заданий, если вы решаете один конкретный случай проблемы, а не пишете общее программное обеспечение для планирования.

Плюс, предположительно, если ресурсы - люди, вы не можете гарантировать, что найм будет успешным. Они не будут сидеть без дела весь день, получая зарплату, когда случается, что работа идет поминутно, да?

0 голосов
/ 23 июня 2009

Я бы посмотрел на это так ... не уверен, что оно охватывает все.

1) Фактически «ресурс» можно рассматривать как «рабочий центр». Сколько рабочих центров, открытых для работы на «рабочих местах», зависит от того, кто вошел в систему.

2) Назначьте ресурсы по времени ожидания - чем дольше они ожидают задания, тем выше они должны быть в списке для следующего запроса. Таким образом, никто не простужается и не замедляется. Вам нужно будет найти и установить порог, по которому (относительно ресурсов и заданий). Вы можете решить, хотите ли вы, чтобы они нажимали, чтобы забрать свою следующую работу, или чтобы система автоматически получала одну из них между работами

3) Настройка очереди расписания заданий - Я не знаю, относится ли это к делу, но могут быть задания с высоким / низким приоритетом и т. Д. Вам необходим пул заданий, перечисленных "в порядке атаки «. Каждая работа в расписании работы может проходить различные этапы, чтобы вы знали, где все находится, и знаете, когда вы закончите, чтобы перейти к следующему. Планировщик заданий будет искать доступные ресурсы и назначать их заданиям в расписании. Скорее всего, это будет большая часть вашей системы планирования.

Я просто надеюсь, что вы не строите центр исходящих вызовов: P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...