Last active
November 10, 2016 01:03
-
-
Save ricardosiri68/c9d87d71fece6060ebd9c0a30c54a6be to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Nodo: | |
'''nodo base para las estructuras enlazadas''' | |
def __init__(self, obj): | |
self.obj = obj # objecto anfitrion del nodo | |
self.sig = None # nodo contiguo | |
class PilaColaBase: | |
'''clase comun entre una cola y una pila''' | |
def __init__(self): | |
self.raiz = None | |
def insertar(self, obj): | |
'''inserta un nuevo nodo al final de la la secuencia encadenada (pila | |
o cola)''' | |
actual = self.raiz | |
if not actual: | |
self.raiz = Nodo(obj) | |
else: | |
while actual.sig: | |
actual = actual.sig | |
actual.sig = Nodo(obj) | |
def __len__ (self): | |
'''implementacion del descriptor para obtener la longitud de la | |
secuncia encadanada''' | |
num = 0 | |
actual = self.raiz | |
while actual: | |
num += 1 | |
actual = actual.sig | |
return num | |
def vacio(self): | |
'''describe si la secuencia encadenada se encuentra vacia''' | |
return len(self) == 0 | |
class Cola(PilaColaBase): | |
'''una cola remueve el elemento raiz de la cadena (el primero)''' | |
def sacar(self): | |
'''devuelve el objeto de la raiz (el primero en entrar) y el siguiente | |
pasa a ser la nueva raiz''' | |
primero, self.raiz = self.raiz, self.raiz.sig | |
return primero.obj | |
def mirar(self): | |
'''mira el objeto que se encuentra en el nodo raiz''' | |
return self.raiz.obj | |
class Pila(PilaColaBase): | |
'''una pila remueve el ultimo elemento de la cadena (la hoja)''' | |
def sacar(self): | |
'''quita el ultimo elmento en entrar en la cadenaa''' | |
actual = self.raiz | |
while actual.sig: | |
anterior, actual = actual, actual.sig | |
anterior.sig = None | |
if actual is self.raiz: | |
self.raiz = None | |
return actual.obj | |
def mirar(self): | |
'''recupera el objeto anfitrion del ultimo nodo en entrar''' | |
actual = self.raiz | |
while actual.sig: | |
actual = actual.sig | |
return actual.obj |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import cola | |
import time | |
import random | |
class Cliente: | |
'''modelo de datos del cliente, donde cada cliente se representa como una | |
momento y un numero de items que esta llevando''' | |
def __init__(self, numoeroDeItems, horaActual, minutoActual): | |
self.numeroDeItems = numoeroDeItems | |
self.horaActual = horaActual | |
self.minutoActual = minutoActual | |
self.horaAtencion = None | |
self.minAtencion = None | |
def atender(self, hora, minuto): | |
'''marca la hora y min en que el cliente fue atendido''' | |
self.horaAtencion = hora | |
self.minAtencion = minuto | |
@property | |
def tiempoEspera(self): | |
'''propiedad que determina el tiempo de espera ocurrido del cliente''' | |
if self.horaAtencion: | |
minutosAtencion = (60 * self.horaAtencion) + self.minAtencion | |
minutosIngreso = (60 * self.horaActual) + self.minutoActual | |
return minutosAtencion - minutosIngreso | |
else: | |
raise Exception('El cliente aun no fue atendido') | |
class Caja(cola.Cola): | |
'''implementacion de una Cola como caja checkout del supermercado''' | |
def __init__ (self): | |
super().__init__() | |
self.clientesAtendidos = 0 | |
self.minutosDeAtencion = 0 | |
self.minutosDeOcupacion = 0 | |
def crearClientes(cajas, horaActual, minutoActual): | |
'''añade in cliente a la caja (cajas) mas vacia segun una hora y un | |
minuto''' | |
if (random.random() > 0.35): | |
cajaMasVacia = min(cajas, key=len) | |
# Cargar un cliente nuevo a la caja mas vacia | |
cantidadDeItems = random.randint(20, 100) | |
cajaMasVacia.insertar(Cliente(cantidadDeItems, horaActual, minutoActual)) | |
def atenderClientes(cajaActual, hora, minuto): | |
'''quita el cliente que esta primero en la caja y define los minutos de | |
ocupacion de dicha caja segun la cantidad de items que carga el cliente''' | |
if len(cajaActual) and not cajaActual.minutosDeOcupacion: | |
cliente = cajaActual.sacar() | |
cajaActual.minutosDeOcupacion = int(cliente.numeroDeItems / 10) | |
cliente.atender(hora, minuto) | |
return cliente | |
elif cajaActual.minutosDeOcupacion > 0: | |
cajaActual.minutosDeOcupacion -= 1 | |
def guardarDatosDeAtencion(datos, caja, cliente): | |
'''un diccionario con conteos como: minutos totales en atencion, cantidad | |
de clientes atendidos y cantidad de items vendidos''' | |
datos['minutos_total_espera'] += cliente.tiempoEspera | |
datos['minutos_total_atencion'] += caja.minutosDeOcupacion | |
datos['cantidad_total_clientes'] += 1 | |
datos['cantidad_items_vendidos'] += cliente.numeroDeItems | |
def obtenerEstadisticas( | |
minutos_total_espera, | |
minutos_total_atencion, | |
cantidad_total_clientes, | |
cantidad_items_vendidos): | |
print('un cliente espera un promedio de %.2f min en la fila' % ( | |
minutos_total_espera / float(cantidad_total_clientes) | |
)) | |
print('se demora un promedio de %.2f min en atender un cliente' % ( | |
minutos_total_atencion / float(cantidad_total_clientes) | |
)) | |
print('se atendieron a %i clientes' % cantidad_total_clientes) | |
print('se vendieron %i items' % cantidad_items_vendidos) | |
def main(): | |
'''ejecucion principal''' | |
# datos estadisticos de atencion | |
datos = { | |
'minutos_total_espera': 0, | |
'minutos_total_atencion': 0, | |
'cantidad_total_clientes': 0, | |
'cantidad_items_vendidos': 0 | |
} | |
# Crear las cajas del supermercado | |
cantidadCajas = 4 | |
cajas = tuple(Caja() for i in range(cantidadCajas)) | |
# Horario de funcionamiento | |
horaActual = 9 | |
horaCierre = 21 | |
minutoActual = 0 | |
# Ciclo principal, funciona mientras estén las puertas abiertas | |
# y hayan todavía clientes en alguna de las colas | |
while horaActual < horaCierre or any(len(c) for c in cajas): | |
# cargar clientes a la cola mas corta | |
if horaActual < horaCierre: | |
crearClientes(cajas, horaActual, minutoActual) | |
# atender clientes | |
for caja in cajas: | |
cliente = atenderClientes(caja, horaActual, minutoActual) | |
if cliente: | |
guardarDatosDeAtencion(datos, caja, cliente) | |
# incremento de la hora | |
minutoActual += 1 | |
if minutoActual == 60: | |
horaActual += 1 | |
minutoActual = 0 | |
# Impresion de la hora y de la cantidad de clientes por caja | |
print("%i:%i\t%s" % ( | |
horaActual, | |
minutoActual, | |
'\t'.join(str(i) for i in map(len, cajas)) | |
)) | |
#time.sleep(0.1) | |
# fin de la simulación forzoso | |
if (horaActual == 24): | |
break | |
# Resultado de la simulacion | |
obtenerEstadisticas(**datos) | |
if all(len(c) == 0 for c in cajas): | |
print("Su supermercado es muy eficiente y la gente está feliz") | |
else: | |
print("Su supermercado no sirve, ya que todavía queda gente sin atender") | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment