2009-06-23 2 views
10

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

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

..

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

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

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

+0

Замечания о численных значениях выше, они не являются жесткими ограничениями, а средними. – sehugg

+0

О, а задания имеют определенные приоритеты (всего несколько). Я закрою сейчас :) – sehugg

+0

Я не совсем понимаю. «Задержка» означает время ожидания работы или неиспользуемые ресурсы? Если первый, просто вербуйте столько ресурсов, сколько сможете получить. Если последний, набирайте только 1 ресурс на жесткое ограничение для пригодности. Есть ли недостающая часть, или я просто неправильно понимаю проблему? –

ответ

2

Возможно, вы хотите изучить проблему knapsack problem или проблему bin packing, поскольку они в принципе похожи на то, что вы пытаетесь сделать здесь.

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

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

+0

Да, я не уточнил, что ресурсы связаны с их оперативным временем. Сожалею. – sehugg

0

Я бы посмотрел на него таким образом ... не уверен, что он все покрывает.

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

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

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

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

+0

uhm ... 2)? холод замедляется? Мы говорим о реальных людях? Я думал, что это про компьютерный процесс, когда рабочие делают «какую-то работу» (например, grep что-то в сети) – jitter

+0

Jas прав, ресурсы простужаются. Первоначальное приложение работает на персональном компьютере, хотя этот алгоритм применим и к машинам (рекрутирование == создание нового виртуального сервера) – sehugg

+0

btw это не исходящий колл-центр;) – sehugg

1

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

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

+0

John, спасибо за комментарий, у меня теперь есть новые и старые вещи для Google;) Проблема набора персонала в основном представляет собой проблему с прогнозированием, так как к тому времени, как я набрал ресурсы, прошло желаемое время завершения работы. Единственный способ, который я знаю для решения проблем прогнозирования, - «долго» :) Я думаю, что часть, которая может быть оптимизирована, наилучшим образом использует доступные ресурсы, и это кажется мне NP-трудным. Моделирование - это, вероятно, путь. – sehugg

+0

Пуассоновский процесс, кажется, тоже где-то там ... – sehugg

+0

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

0

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

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

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

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

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

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

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

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

+0

Спасибо за сообщение, хорошие идеи. Я думаю, что ситуация найма интересна, потому что вы хотите нанять «универсалов», которые имеют лучшие шансы на решение самых наступающих рабочих мест, а не на «специалистов», которые лучше работают на некоторых работах, но не могут выполнять других. Я почти обеспокоен тем, что моя проблема просто слишком общая :) И я беспокоюсь о наихудшей задержке, моя кишка просто говорит мне, что было бы невозможно сделать это таким образом. – sehugg

0

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

0

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

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

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

0

Звучит очень как Real-Time Operating System Планирование. Википедия подробно некоторые из алгоритмов, которые используются:

  • Cooperative планирования
    • Round-Robin Scheduling
  • Преимущественное планирования
    • Фиксированный приоритет упреждающего планирования, А.Н. внедрение прецизионное нарезное время
    • Критическая секция упреждающего планирования
    • Статическое время планирования
  • раннее Deadline Первый подход
  • Расширенное планирование с использованием стохастических и MTG
+0

Это правда, но определение графика - сложная часть здесь, а не просто выбор алгоритма планирования, который будет использоваться. –

0

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

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

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

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