Scripts to basic queue simulation (batch processing)
Sistema de simulación de eventos discretos para modelar el funcionamiento de un call center con procesamiento por lotes (batch processing). Evalúa diferentes configuraciones de operadores para optimizar recursos y analizar métricas de rendimiento.
Clase OcupadoException (línea 12)
- Excepción personalizada para manejar conflictos de disponibilidad
- Permite control de flujo mediante try-catch en cascada
Interfaz IOperador (líneas 15-46)
class IOperador:
tipo = None
def ocupar(self, tiempo, duracion) # Marca slots de tiempo como ocupados
def is_ocupado(self, i) # Verifica disponibilidad
def getTiempoOcioso(self, tiempo_max) # Calcula tiempo no productivoCaracterísticas:
- Gestión de ocupación temporal mediante arrays NumPy
- Estados: -1 (no inicializado), 0 (libre), 1 (ocupado)
- Validación de conflictos antes de asignación
Clase Operador (líneas 49-52)
class Operador(IOperador):
def __init__(self, n, M):
self.tiempo = np.ones(n+M)*-1 # Array de estados temporales| Probabilidad | Duración (min) | Rango RN |
|---|---|---|
| 20% | 2 | 0-19 |
| 40% | 5 | 20-59 |
| 20% | 9 | 60-79 |
| 15% | 13 | 80-94 |
| 5% | 15 | 95-100 |
Técnica: Método de la transformada inversa
| Probabilidad | Tiempo (min) | Rango RN |
|---|---|---|
| 40% | 1 | 0-39 |
| 20% | 2 | 40-59 |
| 20% | 3 | 60-79 |
| 20% | 4 | 80-100 |
| Tipo | Probabilidad | Rango RN | Operador Asignado |
|---|---|---|---|
| Consulta | 40% | 0-39 | Junior |
| Turno | 30% | 40-69 | Junior |
| Garantía | 20% | 70-89 | Senior |
| Uso | 10% | 90-100 | Semi-senior |
| Archivo | Operadores | Distribución | Línea Definición |
|---|---|---|---|
call_center_4operadores-211.py |
4 | 2 Junior, 1 Semi-senior, 1 Senior | 45-48 |
call_center_5operadores_221.py |
5 | 2 Junior, 2 Semi-senior, 1 Senior | 48-52 |
call_center_5operadores-311.py |
5 | 3 Junior, 1 Semi-senior, 1 Senior | - |
call_center_6operadores_321.py |
6 | 3 Junior, 2 Semi-senior, 1 Senior | 50-55 |
Skill-based Routing con Fallback:
# Ejemplo para llamadas de "consulta" o "turno"
if tipo in ["consulta", "turno"]:
try:
op1.ocupar(tiempo, dur) # Intenta Junior 1
except OcupadoException:
try:
op2.ocupar(tiempo, dur) # Fallback a Junior 2
except OcupadoException:
no_atendido[i] = 1 # Llamada perdidaJerarquía de asignación:
- Consulta/Turno → Junior (con fallback entre juniors)
- Uso → Semi-senior (con fallback entre semi-seniors)
- Garantía → Senior (sin fallback)