Rincón Matemático

Matemática => Matemáticas Generales => Mensaje iniciado por: sadzas en 19 Enero, 2022, 12:06 am

Título: Distribución de llamados por porcentajes de operadores.
Publicado por: sadzas en 19 Enero, 2022, 12:06 am
Estimados, NO SOY MATEMATICO, soy desarrollador y vengo a pedir humilde ayuda para lograr un algoritmo que me está volviendo loco. Tal vez para ustedes es sencillo, para mi es francamente imposible.

Les relato el problema.

Llegan llamadas a lo largo del día a un CallCenter. El CallCenter cuenta con X operadores y cada operador posee un porcentaje de llamadas que debe recibir. El objetivo es que cada operador reciba la cantidad de llamadas acorde a su porcentaje.
El algoritmo debería entender a quien derivarle la siguiente llamada.

Ejemplo:

| OperadorA | OperadorB | OperadorC | OperadorD |
|----------------|-----------------|----------------|-----------------|
|       20%     |       30%      |      25%      |        25%     |
|--------------------------------------------------------------------|

Si para el final del día ingresaron 1000 llamadas, el operadorA debió recibir 200, el B 300, el C y D 250 cada uno.

Es decir, frente a cada llamada, el algoritmo debe tener en cuenta las llamadas actuales recibidas por cada uno para decidir a quien se le debe derivar la siguiente.

A tener en cuenta:

- No puede haber operadores de brazos cruzados. Si se satura de llamados, las llamadas deben intentar desde el primero al último por porcentajes correspondientes.
- Salen e ingresan nuevos operadores.

Estos puntos rompen con la lógica de porcentajes, está claro. La idea es que frente a una saturación de las llamadas, todos los operadores estén ocupados. Sin embargo, cuando cada llamada ingresa, debe intentar alcanzar al operador correspondiente por porcentaje. Desde el mas al menos.

Sé que les estoy pidiendo un montón, pero también sé que para mi ese cálculo es imposible.

Gracias por cualquier ayuda que puedan darme.
Título: Re: Distribución de llamados por porcentajes de operadores.
Publicado por: Juan Pablo Sancho en 19 Enero, 2022, 01:23 am
No sé programar, te pongo la caca en spoiler.
Spoiler
//Te pongo un intento en C.
#include<stdio.h>
int main()
{
   int numero_llamadas = 0 , opera_A = 0, opera_B = 0, opera_C = 0, opera_D = 0;
   
   float porcentaje_A = 0 , porcentaje_B = 0 , porcentaje_C = 0 , porcentaje_D = 0;
   //Si el numero de llamadas es cero, entonces la siguiente llamada , (la primera) es para cualquier de los  operadores.
  for(numero_llamadas = 1  ; numero_llamadas < 41 ; numero_llamadas++)
   {
   
      while(opera_A + opera_B + opera_C + opera_D <40 )
       {
          if(opera_A < 10)
          opera_A++;
          else if(opera_B < 10)
          opera_B++;
          else if(opera_C < 10)
          opera_C++;
          else if(opera_D < 10)
          opera_D++;
      }
     
    }
   
    for(numero_llamadas = 41 ; numero_llamadas < 1001 ; numero_llamadas++)
         {
            if(opera_A *1.0 / numero_llamadas * 100 < 20  &&  (opera_A + opera_B + opera_C)*1.0 / numero_llamadas * 100 < 75)
               {
                 opera_A++;
                 porcentaje_A = opera_A*1.0/numero_llamadas * 100;
               }
                 
               
             else if(opera_B *1.0 / numero_llamadas * 100 < 30 && (opera_A + opera_B + opera_C)*1.0 / numero_llamadas * 100 < 75)
               {
                 opera_B++;
                 porcentaje_B = opera_B*1.0/numero_llamadas * 100;
               }
               
            else if(opera_C *1.0 / numero_llamadas * 100 < 25 )
               {
                 opera_C++;
                 porcentaje_C = opera_C*1.0/numero_llamadas * 100;
               }
               
            else if(opera_D *1.0 /numero_llamadas * 100 < 25)
               {
                 opera_D++;
                 porcentaje_D = opera_D*1.0/numero_llamadas * 100;
               }
         }
         
       
         
         
         
         
         
         
         
         
         
   
   
     printf("%d %d %d %d\n " , opera_A , opera_B , opera_C , opera_D);
     printf("\nPorcentajes   A = %g  ,   B = %g   ,   C = %g    ,   D = %g \n" , porcentaje_A , porcentaje_B , porcentaje_C , porcentaje_D);
                         



return 0;     
       
     
     
}
   
[cerrar]
   
Título: Re: Distribución de llamados por porcentajes de operadores.
Publicado por: sadzas en 19 Enero, 2022, 04:05 am
Excelente Juan.

Hice la pregunta en un foro de matemática ya que el cálculo que hice no me cerraba para nada.
Tu ejemplo es práctico y entiendo cómo modificarlo para n operadores, ya que el ejemplo que diste es para los operadores de MI ejemplo.

Por tanto, el cálculo es tan simple como:

operadorx *1.0 / numero_llamadas * 100 < 30 && (sum(n operadores)*1.0 / numero_llamadas * 100 < 75)

No estoy tan seguro que esto funcione cuando un operador toma llamadas en caso de estar ocupado otro.
Puede suceder que por situación forzada, el operador que menos llamadas deba recibir, termine siendo uno de los que más reciban.

Me pregunto si la operación podría funcionar en tal caso.

Voy a hacer pruebas.
Título: Re: Distribución de llamados por porcentajes de operadores.
Publicado por: Luis Fuentes en 19 Enero, 2022, 08:57 am
Hola

 La cosa es. ¿Puede haber operadores de brazos cruzados (libres) aunque haya llamadas en espera? Porque si NO puede haber operadores de brazos cruzados, si la frecuencia de llamadas es muy alta no se pueden respetar los porcentajes. Como caso extremo imagina que hay llamadas todo el tiempo, entonces simplemente un operador en cuanto queda libre debería de coger otra llamada... y nada que ver ahí el porcentaje que tenga asignado.

 Aclara esto.

Saludos.
Título: Re: Distribución de llamados por porcentajes de operadores.
Publicado por: manooooh en 19 Enero, 2022, 09:58 am
Hola

La cosa es. ¿Puede haber operadores de brazos cruzados (libres) aunque haya llamadas en espera? Porque si NO puede haber operadores de brazos cruzados, si la frecuencia de llamadas es muy alta no se pueden respetar los porcentajes. Como caso extremo imagina que hay llamadas todo el tiempo, entonces simplemente un operador en cuanto queda libre debería de coger otra llamada... y nada que ver ahí el porcentaje que tenga asignado.

Me has hecho acordar al video de Derivando sobre cuál sería la fila más rápida de un supermercado (https://www.youtube.com/watch?v=VPuRoEOVogo).

En definitiva el problema encaja de lleno en la teoría de colas (https://es.wikipedia.org/wiki/Teor%C3%ADa_de_colas), ¿no? Como para ponerle un marco teórico al problema.

Saludos
Título: Re: Distribución de llamados por porcentajes de operadores.
Publicado por: Richard R Richard en 19 Enero, 2022, 11:53 am
Sea \( x_i \) la fracción de llamados del operador \( i \) ,
Sea \( y_i \) el número de llamados recibidos ya en el día por el operador \( i \)


Es claro que


\(  \sum x_i=1 \)


Y que


\( \sum y_1=N \)


Siendo \( N \) el total de llamados hasta el momento ese dia.


Bien si cada vez que entre un nuevo llamado  se lo asignas al operador j tal que


\(
x_j>\dfrac{y_j}{N}
 \).


cumplirás con tu objetivo, cuando N es cero se lo asignas al primero que se te ocurra.


Ahora bien si al momento de asignar línea el operador está ocupado asignala al siguiente que cumpla la misma condición.


Si puedes hacer una lista de todos los que cumplen la condición asigna la llamada al que hace más tiempo está inactivo.


PD esto funciona si todos los operadores trabajan en el mismo turno es decir comienzan su jornada juntos y la finalizan juntos.
Título: Re: Distribución de llamados por porcentajes de operadores.
Publicado por: sadzas en 19 Enero, 2022, 01:22 pm
La cosa es. ¿Puede haber operadores de brazos cruzados (libres) aunque haya llamadas en espera? Porque si NO puede haber operadores de brazos cruzados, si la frecuencia de llamadas es muy alta no se pueden respetar los porcentajes. Como caso extremo imagina que hay llamadas todo el tiempo, entonces simplemente un operador en cuanto queda libre debería de coger otra llamada... y nada que ver ahí el porcentaje que tenga asignado.
Hola Luis, gracias por tu comentario.

Modifiqué la pregunta original agregando esta información.

NO, no puede haber operadores de brazos cruzados. Se entiende que la llamada debe intentar alcanzar a los operadores correspondientes por porcentaje, desde el mayor a menor.
Título: Re: Distribución de llamados por porcentajes de operadores.
Publicado por: sadzas en 19 Enero, 2022, 01:43 pm
PD esto funciona si todos los operadores trabajan en el mismo turno es decir comienzan su jornada juntos y la finalizan juntos.
Gracias por tu comentario Richard.

Los operadores cambian de turno todo el tiempo. Es decir, si la jornada arranca a las 8am, hay operadores que se sumaran a las 9am.

Entiendo que no se cumplan perfectamente los porcentajes. La idea es acercarse todo lo posible a los mismos.
Título: Re: Distribución de llamados por porcentajes de operadores.
Publicado por: martiniano en 19 Enero, 2022, 05:27 pm
Hola.

Entiendo que no se cumplan perfectamente los porcentajes. La idea es acercarse todo lo posible a los mismos.

Claro. Pero todo depende un poco de lo que signifique ese "acercarse todo lo posible".

Una opción razonable podría ser que cada vez que se reciba una llamada se calculen los porcentajes que lleva cada uno de los operadores que están libres y aquel que esté más por debajo del porcentaje que tiene asignado es el que debe responder a la llamada.

Un saludo.
Título: Re: Distribución de llamados por porcentajes de operadores.
Publicado por: sadzas en 19 Enero, 2022, 06:48 pm
Una opción razonable podría ser que cada vez que se reciba una llamada se calculen los porcentajes que lleva cada uno de los operadores que están libres y aquel que esté más por debajo del porcentaje que tiene asignado es el que debe responder a la llamada.
Gracias, si, hoy opté por ese camino.

Pensé que tal vez se podía resolver de otra forma pero no le encuentro vuelta. Por el momento comparo los porcentajes entre ideal y real y al menor valor le mando la llamada.
Título: Re: Distribución de llamados por porcentajes de operadores.
Publicado por: Richard R Richard en 20 Enero, 2022, 01:06 am
Los operadores cambian de turno todo el tiempo. Es decir, si la jornada arranca a las 8am, hay operadores que se sumaran a las 9am.
Entiendo entonces podrias intentar lo siguiente si te place
Cada operador \( i \)  va a trabajar turnos de \( m_i \) horas ese dia , \( m_i \) no tiene porque ser la misma cantidad para todos, ese operador  le asignas , por la razón que sea  la cantidad de llamados \( N_i \)
la carga horaria de llamados que debería recibir en promedio sería \( c_i=\dfrac{N_i}{m_i} \) (no hace falta suponer solo esta distribución lineal plana, sino que se asignar un valor de llamadas en función de la hora del día que se trate ),
entre la h y h+1 tienes varios operadores cada uno deberá  cumplir con su fracción
\( x_i=\dfrac{c_i(h)}{\sum c_i(h)} \)
cada inicio de hora o bien empiezas a contar llamados desde cero  o bien puedes adicionar datos de la hora anterior , eso es a gusto de como manejarlo

entonces luego  asignas la llamada cuando \( x_i>\dfrac{y_i(h)}{N(h)} \)
eso te aproxima a que la cantidad de llamadas que cada uno recibe este en proporción a lo que se espera pero como nadie te asegura que las llamadas entren durante el dia a la misma tasa, incluso la promedio que esperas, con esto te aseguras que la carga de trabajo del equipo presente  sea proporcional al flujo de llamadas, es decir si ese dia pocos llaman, todos recibiran pocas llamadas en esa proporción buscada, y si hay muchas también la proporción hará que el numero individual de llamadas recibidas  aumente.
Aún cuando la cantidad de llamadas recibidas en el callcenter varia con la hora, puedes mantener la proporción cuando adicionas mas operadores en horas pico, y tener un orden cuando lo que dura una llamada tiene un desvío estandar grande, puedes así empezar a ver quienes se demoran mas en resolver el tema de la llamada o quienes son mas expeditivos, bla bla bla.