Supongamos que hay n
líneas para una línea directa.
Cada vez que un cliente llama a la línea directa, la llamada se desvía a una de las n
líneas. Y quiero asignar un porcentaje de llamadas a cada una de las n líneas. Supongamos que hay dos líneas y una línea se asigna el 60% y otra es el 40%, el número total de llamadas es 10, por lo que la primera línea recibiría 6 llamadas y la segunda recibirá 4 llamadas.
Sé el porcentaje de llamadas a cada línea por adelantado, pero el problema es que no sé la cantidad de llamadas que se recibirían en un día.
¿Cómo puedo distribuir la cantidad de llamadas sin conocer el total de llamadas?
design
algorithms
akku
fuente
fuente
Respuestas:
Haga una contabilidad sobre las llamadas ya recibidas y calcule su distribución en las n líneas. Esto le da n valores porcentuales (su distribución ya alcanzada), que se pueden comparar con los n porcentajes que desea lograr. Cada vez que ingrese una nueva llamada, asigne esa llamada a la línea con la desviación más alta del valor objetivo (tenga en cuenta que siempre y cuando no alcance exactamente la distribución dada, siempre hay una línea que tiene muy pocas llamadas hasta ahora, en comparación con la distribución objetivo).
Por ejemplo: después de asignar la primera llamada a la línea 1:
...
EDITAR: Este enfoque podría mejorarse aún más al no usar la diferencia absoluta, sino al elegir la línea que minimiza la suma de cuadrados de todas las desviaciones. Eso también le daría un mejor resultado en caso de que alcance los valores objetivo exactamente.
fuente
fuente
Estoy de acuerdo con la solución de @ DocBrown. Colocándolo en una forma de algoritmo:
Delta está determinado por el porcentaje real menos el porcentaje esperado de una línea. De esta manera, aquellos con el mayor delta negativo son los que más requieren una llamada para cumplir con el porcentaje esperado.
Por ejemplo, en el caso en que los porcentajes esperados para las líneas 1 y 2 son respectivamente 60% y 40%, y sus porcentajes reales son 50% y 50%, vería la línea de pedido 1 seguida de la línea 2, desde -10 % es menos del 10%. Por lo tanto, la línea 1 recibiría la llamada.
Recomiendo encarecidamente utilizar la ordenación por inserción, ya que funciona mejor cuando la matriz ya está ordenada en su mayoría.
Además, como una optimización menor, si realiza un seguimiento del número total de llamadas hasta el momento, en lugar de tener que calcular el porcentaje real de cada línea, simplemente puede calcular el número total de llamadas para esa línea menos el porcentaje esperado para ese línea multiplicada por el número total de llamadas (delta = t_i - p_i * T). En este caso, el delta es simplemente el número negativo de llamadas para lograr el porcentaje esperado.
Espero que eso aclare cualquier otra duda.
fuente
O(n)
es lo que puede esperar al ordenar una lista ya ordenada con clasificación de inserción yO(n)
es lo que tendría que usar para encontrar el valor más pequeño. Solo asumo que lo solucioné.Suposiciones como OP declaró
Diseño de algoritmo
Defina cada línea por su%
Ordene cada línea por su posición lejos de 0 definida como (% actual de trabajadores -% asignado de trabajadores) o por asignación aleatoria si todas las líneas = 0
Desvía cada llamada a la línea más grande lejos de 0
Ejemplo: 3 líneas con un% de 20, 30 y 50 respectivamente. En el punto x en el tiempo, 1 persona llama y dado que cada línea está a 0 de 0, se asigna aleatoriamente, por ejemplo, a la línea 2, que debe contener el 30% de todas las llamadas. Como la línea 2 debería contener el 30% de todas las llamadas y ahora tiene el 100% de todas las llamadas, su posición desde 0 aumenta. La siguiente llamada ahora se asignaría a la línea 1 o la línea 3, etc. hasta el equilibrio (0) y, por lo tanto, el bucle se repite.
fuente
Esta es una solución ingenua y no supone nada, pero permitiría una distribución basada en porcentajes. Esta solución podría mejorarse de muchas maneras, pero esto es lo esencial. No estoy seguro de si esto es lo que está buscando, pero le daría una verdadera distribución.
código psuedo ...
fuente