Autor Tema: Distribución de llamados por porcentajes de operadores.

0 Usuarios y 1 Visitante están viendo este tema.

19 Enero, 2022, 12:06 am
Leído 526 veces

sadzas

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 5
  • País: ar
  • Karma: +0/-0
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.

19 Enero, 2022, 01:23 am
Respuesta #1

Juan Pablo Sancho

  • Moderador Global
  • Mensajes: 5,562
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
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]
   

19 Enero, 2022, 04:05 am
Respuesta #2

sadzas

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 5
  • País: ar
  • Karma: +0/-0
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.

19 Enero, 2022, 08:57 am
Respuesta #3

Luis Fuentes

  • el_manco
  • Administrador
  • Mensajes: 51,248
  • País: es
  • Karma: +0/-0
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.

19 Enero, 2022, 09:58 am
Respuesta #4

manooooh

  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 3,633
  • País: ar
  • Karma: +1/-0
  • Sexo: Masculino
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.

En definitiva el problema encaja de lleno en la teoría de colas, ¿no? Como para ponerle un marco teórico al problema.

Saludos

19 Enero, 2022, 11:53 am
Respuesta #5

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,093
  • País: ar
  • Karma: +0/-0
  • Sexo: Masculino
  • Oh Oh!!! me contestó... y ahora qué le digo...
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.
Saludos  \(\mathbb {R}^3\)

19 Enero, 2022, 01:22 pm
Respuesta #6

sadzas

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 5
  • País: ar
  • Karma: +0/-0
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.

19 Enero, 2022, 01:43 pm
Respuesta #7

sadzas

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 5
  • País: ar
  • Karma: +0/-0
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.

19 Enero, 2022, 05:27 pm
Respuesta #8

martiniano

  • Moderador Global
  • Mensajes: 1,943
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
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.

19 Enero, 2022, 06:48 pm
Respuesta #9

sadzas

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 5
  • País: ar
  • Karma: +0/-0
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.