Skip to content

Instantly share code, notes, and snippets.

@ricardosiri68
Last active November 10, 2016 01:03
Show Gist options
  • Save ricardosiri68/c9d87d71fece6060ebd9c0a30c54a6be to your computer and use it in GitHub Desktop.
Save ricardosiri68/c9d87d71fece6060ebd9c0a30c54a6be to your computer and use it in GitHub Desktop.
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
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