Предположим, есть n
линии для горячей линии.
Всякий раз, когда клиент звонит на горячую линию, звонок переадресовывается на одну из n
линий. И я хочу назначить процент звонков для каждой из n строк. Предположим, что есть две линии, и одна линия назначена на 60%, а другая - на 40%, общее количество звонков - 10, поэтому первая линия получит 6 звонков, а вторая получит 4 звонка.
Я знаю процент звонков на каждую линию заранее, но проблема в том, что я не знаю, сколько звонков будет принято за день.
Как я могу распределить количество звонков, не зная общее количество звонков?
design
algorithms
Акку
источник
источник
Ответы:
Сделайте некоторую бухгалтерию о уже принятых вызовах и рассчитайте их распределение по n строкам. Это дает вам n процентных значений (ваше уже достигнутое распределение), которые можно сравнить с n процентами, которые вы хотите достичь. Каждый раз, когда поступает новый вызов, назначьте этот вызов на линию с наибольшим отклонением от целевого значения (обратите внимание, что, если вы не попали точно в данное распределение, всегда есть линия, на которой пока слишком мало вызовов, по сравнению с целевым распределением).
Например: после назначения первого вызова на линию 1:
...
РЕДАКТИРОВАТЬ: этот подход может быть улучшен не путем использования абсолютной разницы, а путем выбора линии, которая минимизирует сумму квадратов всех отклонений. Это также даст вам лучший результат, если вы точно достигнете целевых значений.
источник
источник
Я согласен с решением @ DocBrown. Поместив его в форму алгоритма:
Дельта определяется фактическим процентом минус ожидаемый процент строки. Таким образом, те, кто имеет наибольшую отрицательную дельту, являются теми, которые больше всего требуют вызова, чтобы соответствовать ожидаемому проценту.
Например, в случае, когда ожидаемые проценты для строк 1 и 2 составляют соответственно 60% и 40%, а их фактические проценты составляют 50% и 50%, вы увидите строку заказа 1, за которой следует строка 2, так как -10 % меньше 10%. Следовательно, линия 1 получит вызов.
Я настоятельно рекомендую использовать сортировку вставкой, поскольку она работает лучше всего, когда массив уже отсортирован.
Кроме того, в качестве незначительной оптимизации, если вы отслеживаете общее количество вызовов до сих пор, вместо того, чтобы вычислять фактический процент каждой строки, вы можете просто рассчитать общее количество вызовов для этой линии минус ожидаемый процент для этой линии. строка умножает на общее количество вызовов (delta = t_i - p_i * T). В этом случае дельта представляет собой просто отрицательное количество вызовов для достижения ожидаемого процента.
Я надеюсь, что это проясняет любые другие сомнения.
источник
O(n)
- это то, что вы можете ожидать, сортируя уже отсортированный список с сортировкой вставкой, иO(n)
это то, что вам нужно использовать, чтобы найти наименьшее значение. Я просто предполагаю, что это отсортировано.Предположения, как указано в ОП
Разработка алгоритма
Определите каждую строку по ее%
Сортируйте каждую строку по ее положению от 0, определенного как (текущий% работников - назначенный% работников), или по случайному назначению, если все строки = 0
Переадресация каждого звонка на наибольшую линию от 0
Пример: 3 строки с% 20, 30 и 50 соответственно. В момент времени x звонит 1 человек, и, поскольку каждая линия находится на расстоянии 0 от 0, она назначается случайным образом - скажем, на линию 2, которая должна удерживать 30% всех вызовов. Поскольку линия 2 должна удерживать 30% всех вызовов и теперь удерживает 100% всех вызовов, ее позиция с 0 увеличивается. Следующий вызывающий теперь будет назначен либо на строку 1, либо на строку 3 и т. Д. До равновесия (0), и, таким образом, цикл повторяется.
источник
Это наивное решение и не предполагает ничего, кроме как разрешить распределение в процентах. Это решение может быть улучшено многими способами, но в этом его суть. Я не уверен, что это то, что вы ищете, но это даст вам истинное распространение.
код псевдо ...
источник