Цель В настоящее время я создаю симуляцию в Python для проверки различных балансов нагрузки для агентов для получения входящей работы на уровне обслуживания. Я упросту сценарий в надежде, что кто-то может направить меня в правильном направлении.
Наши призывы разбиты на приоритеты: Альфа, Бета, Гамма. Альфа - самый высокий приоритет, а гамма - самый низкий приоритет. Чтобы мы не пропустили уровни обслуживания, иногда мы «блокируем» наших сотрудников, чтобы они могли обрабатывать только альфа-объем.
Что я сделал Все классы построены: день , Интервал, звонок, агент. Я успешно создал день, состоящий из 48 получасовых интервалов. Каждый интервал имеет свой собственный персонал, среднее время обработки и атрибуты прогнозируемого объема. Существуют различные методы, которые я добавил, чтобы отслеживать, принадлежит ли вызов или завершен, и когда агент станет доступным следующим.
Имитация дня Вызовы находятся в списке, отсортированном по время они представлены (по возрастанию). Я перебираю этот список и нахожу, сколько вызовов не обработано до или во время вызова. В момент времени (t) в буфере может существовать любое количество вызовов. Этот список отсортирован по самому старому вызову с наивысшим приоритетом. Таким образом, при вызовах [0] вызов, который должен быть получен в первую очередь:
for call in curr_day.Calls:
for active_call in [c for c in sorted(curr_day.Calls, key=lambda x: x.Priority, reverse=False) if c.Presented_Time <= call.Presented_Time and call.Completed is False and call.Owned is False]:
Как только я получу список доступных вызовов, я затем через своих агентов провожу oop и найду подходящего совпадать для самого старого вызова с наивысшим приоритетом. Список агентов отсортирован по Busy_Until. У операторов [0] - это оператор, который имеет наименьшее значение для Busy_Until и первым получает другой вызов.
for agent in [agt for agt in sorted(curr_day.Staff, key=lambda x: x.Busy_Until, reverse=False)]:
Чтобы проверить, соответствует ли вызов оператору, У меня есть несколько операторов if для проверки в первую очередь.
if active_call.Priority in agent.Lb:
if agent.Busy_Until <= active_call.Presented_Time:
agent.assign_call(active_call, active_call.Presented_Time)
break
else:
agent.assign_call(active_call, agent.Busy_Until)
break
Примечания При назначении тревоги агенту атрибут агента Busy_Until изменяется на время, когда он получил вызов + среднее время обработки вызова. Вызов затем помечается как принадлежащий, поэтому другие агенты его больше не видят. Agent.Lb - это список всех приоритетов, к которым открыт агент. Если атрибут Busy_Until агента меньше или равен представленному времени вызова, передайте его им. Если атрибут агента Busy_Until больше представленного времени вызова, передайте его им, когда они закончат.
Проблемы Этот метод занимает слишком много времени для завершения. На самом деле, я не видел завершения выполнения программы после ожидания 10 минут. Мы видим около 6 000 звонков в день, поэтому их повторение занимает очень много времени. Я не вижу другого способа сделать это; тем не менее, я знаю, что должен быть элегантный, эффективный способ сделать это.
Полный код (без классов)
curr_day = Day()
for call in curr_day.Calls:
for active_call in [c for c in sorted(curr_day.Calls, key=lambda x: x.Priority, reverse=False) if c.Presented_Time <= call.Presented_Time and c.Completed is False and c.Owned is False]:
for agent in [agt for agt in sorted(curr_day.Staff, key=lambda x: x.Busy_Until, reverse=False)]:
if active_call.Priority in agent.Lb:
if agent.Busy_Until <= active_call.Presented_Time:
agent.assign_alarm(active_alarm, active_alarm.Presented_Time)
break
else:
agent.assign_call(active_call, agent.Busy_Until)
break
Любому, кто может предоставить даже немного руководства, я благодарю вас.