Untitled
unknown
python
3 years ago
5.7 kB
13
Indexable
import numpy as np
from classes import usuario
# hay que hacer una acumulador a partir de los tiempos de llegada para sacar
# HORA de llegada
def crear_usuarios(tipo: usuario, nUsuarios: int, tEspera: int) -> np.array:
'''
Crea una lista de nUsuarios usuarios según su media de tiempo entre
usuario, teniendo en cuenta el tiempo de descanso (tEspera) del servicio.
'''
tiempos_entre_usuarios: np.array = np.random.exponential(tipo.media,
size=nUsuarios)
tiempos_llegada: np.array = np.cumsum(tiempos_entre_usuarios)
tiempos_servicio: np.array = tEspera + np.random.uniform(low=tipo.low,
high=tipo.high,
size=nUsuarios)
usuarios: np.array = np.array([tipo(tiempo_llegada, tiempo_servicio)
for tiempo_llegada, tiempo_servicio
in zip(tiempos_llegada, tiempos_servicio)
])
return usuarios
def insertar_salida(user: usuario,
# t: int,
# previousnUsers: int,
previous_tSalida: int,
nUsers: int,
events: dict[str:np.array],
anyQueue: bool
):
'''
Inserta salidas en el diccionario de eventos de salida.
'''
# + tEspera
# instante servicio será el mayor entre la hora de llegada del siguiente
# usuario y previous_tSalida.
# si len(cola = 0), entonces ponemos que user.instante_servicio = 0.
# sino, ponemos que es igual a previoustSalida
user.instante_servicio = user.t_llegada if anyQueue else previous_tSalida
# insert exit time
# events['hour'] = np.insert(events['hour'], -1,
# previous_tSalida)
# events['hour'] = np.append(events['hour'], previous_tSalida
# + user.t_servicio)
events['hour'] = np.append(events['hour'], user.instante_servicio + user.t_servicio)
# habrá que quitar tantos usuarios en cola de los eventos de entrada como
# eventos de salida haya habido previamente, pues enter_events acumulativo
# sin tener en cuenta las salidas.
# n: int = i - len(events['nUsers']) - 1
# insert nUsers
# events['nUsers'] = np.insert(events['nUsers'], -1, n)
events['nUsers'] = np.append(events['nUsers'], nUsers)
return events
def insertar_entrada(user: usuario, events: dict[str:np.array]):
'''
Inserta entradas en el diccionario de eventos de entrada.
'''
events['hour'] = np.append(events['hour'],
user.t_llegada)
previousnUsers: int = events['nUsers'][-1] if events['nUsers'].any() else 0
events['nUsers'] = np.append(events['nUsers'],
previousnUsers + 1)
return events
# def calcular_meritos(usuarios: usuario, jornada_laboral: int):
# # tiempos_llegada: np.array = np.fromiter(
# # (usuario.t_llegada for usuario in usuarios),
# # dtype=int
# # )
# # instantes_servicio: np.array = np.fromiter(
# # (usuario.instante_servicio for usuario in usuarios),
# # dtype=int
# # )
# # tiempos_espera: np.array = tiempos_llegada - instantes_servicio
# # medi_espera: float = np.mean(tiempos_espera)
# tiempos_servicio: np.array = np.fromiter(
# (usuario.t_servicio for usuario in usuarios),
# dtype=int
# )
# porcentaje_servido: float = (np.sum(tiempos_servicio) / jornada_laboral) \
# * 100
def calc_tmean_jornada(usuarios: usuario, jornada_laboral: int) -> float:
'''
Calcula el tiempo medio de espera en ola de un usuario promediado en una
jornada diaria.
'''
# ESTO VA A DAR ERROR: NO TODOS LOS USUARIOS HAN SIDO SERVIDOR, POR LO QUE
# NO TODOS TENDRÁN EL ATRIBUTO instante_servicio
# ## error solucionado ##
tiempos_llegada: np.array = np.fromiter(
(usuario.t_llegada for usuario in usuarios),
dtype=int
)
instantes_servicio: np.array = np.fromiter(
(usuario.instante_servicio for usuario in usuarios),
dtype=int
)
tiempos_espera: np.array = instantes_servicio - tiempos_llegada
medi_espera: float = np.mean(tiempos_espera)
return medi_espera
def calc_pct_ocupation(usuarios: usuario, jornada_laboral: int) -> float:
'''
Calcula el tanto por ciento de ocupación del servidor.
'''
tiempos_servicio: np.array = np.fromiter(
(usuario.t_servicio for usuario in usuarios),
dtype=int
)
# porcentaje_servido: float = (np.sum(tiempos_servicio) / jornada_laboral) \
# * 100
porcentaje_servido: float = (np.sum(tiempos_servicio[:-1]) / jornada_laboral) \
* 100
pc_ocupation2: float = (np.sum(tiempos_servicio) / jornada_laboral) \
* 100
return porcentaje_servido, pc_ocupation2
def calc_meanUsers(events: dict, jornada_laboral: int) -> float:
'''
Calcula el número medio de usuarios en la cola en una jornada diaria.
'''
time_increments: np.array = np.diff(events['hour'])
out_mean: np.array = np.sum(np.multiply(
events['nUsers'][:-1],
time_increments)
) / jornada_laboral
return out_mean
Editor is loading...