def asignar_pedido_a_camioneta(self, camioneta, evento): from Simulacion import Simulacion simulacion = Simulacion() pedido = Pedido(evento.cliente, evento.hora, camioneta, evento.tipo_pizza) simulacion.add_pedido(pedido) camioneta.asignar_pedido(pedido)
def test_debe_tratar_de_convencer_al_cliente_si_no_hay_camioneta_con_tipo( self): class TestableUtils(Utils): @staticmethod def convencer_al_cliente(): return True simulacion = self.get_simulacion() simulacion.camionetas = [ Camioneta(), Camioneta(), Camioneta(), Camioneta() ] simulacion.utils = TestableUtils() simulacion.camionetas[2].pizzas.append( Pizza(TipoPizza.MOZZARELLA, simulacion.time)) simulacion.camionetas[2].pizzas.append( Pizza(TipoPizza.ANANA, simulacion.time)) simulacion.camionetas[3].pizzas.append( Pizza(TipoPizza.ANANA, simulacion.time)) tipos_disponibles_en_camionetas = simulacion.get_tipos_disponibles_en_camionetas( ) cliente = self.generar_cliente_en_rango() evento = self.generar_evento(cliente, TipoPizza.NAPOLITANA) evento.notify() simulacion = Simulacion() camioneta = simulacion.get_camioneta_by_cliente(cliente) pedido = camioneta.get_pedido_by_cliente(cliente) self.assertEqual(2, len(tipos_disponibles_en_camionetas)) self.assertEqual(pedido.tipo_pizza, tipos_disponibles_en_camionetas[0]) self.assertEqual(pedido.hora_toma, evento.hora)
def _entregar_pedido(self, pedido): from Simulacion import Simulacion simulacion = Simulacion() simulacion.remover_evento_vencimiento_pizza(pedido.pizza) pedido.entregado = True pedido.hora_entrega = simulacion.time pedido.pizza = self._tomar_pizza(pedido.tipo_pizza) if pedido in self.pedidos: self.pedidos.remove(pedido)
def enviar_pedido(self, pedido: Pedido): self.distancia_recorrida += self.obtener_distancia(self.ubicacion, pedido.cliente.ubicacion) self.ubicacion = pedido.cliente.ubicacion if not self._tengo_pizzas_para_entregar(pedido): self.generar_evento_volver_a_restaurante(pedido) else: pedido.ubicacion_origen = self.ubicacion from Simulacion import Simulacion simulacion = Simulacion() simulacion.dispatch(EventType.ENTREGAR_PEDIDO, {'hora': simulacion.time + timedelta(minutes=simulacion.utils.tiempo_entrega()), 'pedido': pedido})
def carga_por_defecto(self): from Simulacion import Simulacion simulacion = Simulacion() pizzas_por_tipo = divmod(self.cantidad_de_pizzas_a_cargar, len(simulacion.tipos_de_pizza_disponibles)) for tipo_de_pizza in simulacion.tipos_de_pizza_disponibles: self.pizzas += [simulacion.generar_pizza(tipo_de_pizza) for i in range(pizzas_por_tipo[0])] k = 0 for i in range(pizzas_por_tipo[1]): self.pizzas.append(simulacion.generar_pizza(simulacion.tipos_de_pizza_disponibles[k])) k += 1 if i > len(simulacion.tipos_de_pizza_disponibles): k = 0
def get_simulacion(self): simulacion = Simulacion() simulacion.configurate(Configuracion.get_default_configuration()) simulacion.pedidos = [] simulacion.clientes_rechazados = [] simulacion.dias_a_simular = 1 simulacion.experimentos = 1 simulacion.camionetas = [] return simulacion
def cargar_pizzas(self): from Simulacion import Simulacion simulacion = Simulacion() if simulacion.pedidos_en_espera: self.cargar_pedidos_en_espera() else: self.carga_por_defecto() if self.tiempo_ultima_recarga is not None: self.tiempo_entre_recargas.append(simulacion.get_diferencia_hora_actual(self.tiempo_ultima_recarga)) self.tiempo_ultima_recarga = simulacion.time self.disponible = True
def test_cliente_esta_en_rango(self): from Simulacion import Simulacion cliente = Cliente() cliente.ubicacion[0] = 1415 cliente.ubicacion[1] = 1415 self.evento.cliente = cliente self.simulacion = Simulacion() self.assertFalse(self.simulacion.cliente_esta_en_rango(cliente)) cliente.ubicacion[0] = 1414 cliente.ubicacion[1] = 1414 self.evento.cliente = cliente self.assertTrue(self.simulacion.cliente_esta_en_rango(cliente))
def generar_pizza(): from Simulacion import Simulacion simulacion = Simulacion() opcion = random.random() for tipo_disponible in simulacion._tipos_de_pizza_disponibles: if opcion < tipo_disponible['probabilidad']: return tipo_disponible['tipo']
def generar_evento(cliente, tipo_pizza): evento = LlamoClienteEvent(0, cliente, Simulacion()) if tipo_pizza is not None: evento.tipo_pizza = tipo_pizza evento.attach(RechazarCliente()) evento.attach(EncolarCliente()) return evento
def asignar_pedido_a_camioneta(self, tipo_de_pizza, camioneta): simulacion = Simulacion() simulacion.camionetas[camioneta].pizzas.append( Pizza(tipo_de_pizza, simulacion.time)) cliente0 = self.generar_cliente_en_rango() pedido0 = Pedido(cliente0, 10, simulacion.camionetas[camioneta], tipo_de_pizza) simulacion.camionetas[camioneta].asignar_pedido(pedido0)
def rechazar_pedido(self, pedido): from Simulacion import Simulacion simulacion = Simulacion() pedido.entregado = False pedido.hora_entrega = simulacion.time if pedido in self.pedidos: self.pedidos.remove(pedido) self._enviar_siguiente_pedido()
def get_horas_de_pedidos(horas): eventos_en_hora = [] from Simulacion import Simulacion simulacion = Simulacion() for hora in range(horas): for pedido in range(np.random.poisson( simulacion.pedidos_por_hora)): tiempo_exacto = math.trunc(random.uniform(0, 60)) + 60 * hora timestamp = simulacion.time + timedelta(minutes=tiempo_exacto) eventos_en_hora.append(timestamp) return eventos_en_hora
def terminar_el_dia(self): from Simulacion import Simulacion simulacion = Simulacion() dia = datetime(year=self.dia.year, month=self.dia.month, day=self.dia.day, hour=simulacion.tiempo_inicio.hour, minute=simulacion.tiempo_inicio.minute, second=0) self.avanzar_time(dia + timedelta(days=1)) self.termino_dia = True
def test_debe_rechazar_pedido_cuando_cliente_no_esta_en_rango(self): simulacion = Simulacion() pedidos_rechazados = len(simulacion.clientes_rechazados) self.assertEqual(0, pedidos_rechazados) cliente = self.generar_cliente_fuera_de_rango() evento = self.generar_evento(cliente, None) evento.notify() self.assertEqual(pedidos_rechazados + 1, len(simulacion.clientes_rechazados))
def _ejecutar(self, evento: PizzaVenceEvent): evento.pizza.vencida = True from Simulacion import Simulacion simulacion = Simulacion() simulacion.add_desperdicio(evento.pizza, evento.hora) camioneta = simulacion.get_camioneta_by_pizza(evento.pizza) if camioneta is not None and not camioneta.tengo_pizzas(): simulacion.dispatch(EventType.CAMIONETA_REGRESA_VACIA, {'camioneta': camioneta})
def generar_evento_volver_a_restaurante(self, pedido=None): from Simulacion import Simulacion simulacion = Simulacion() self.disponible = False if pedido is not None: simulacion.dispatch(EventType.CAMIONETA_REGRESA_A_BUSCAR_PEDIDO, {'pedido': pedido, 'camioneta': self}) else: simulacion.dispatch(EventType.CAMIONETA_REGRESA_VACIA, {'camioneta': self})
class LlamoClienteEventTest(unittest.TestCase): def setUp(self): from Simulacion import Simulacion self.simulacion = Simulacion() self.evento = LlamoClienteEvent(10, Cliente(), self.simulacion.generar_tipo_de_pizza()) self.camionetas = [Camioneta() for i in range(4)] def test_cliente_esta_en_rango(self): from Simulacion import Simulacion cliente = Cliente() cliente.ubicacion[0] = 1415 cliente.ubicacion[1] = 1415 self.evento.cliente = cliente self.simulacion = Simulacion() self.assertFalse(self.simulacion.cliente_esta_en_rango(cliente)) cliente.ubicacion[0] = 1414 cliente.ubicacion[1] = 1414 self.evento.cliente = cliente self.assertTrue(self.simulacion.cliente_esta_en_rango(cliente))
def test_simulacion(self): from Simulacion import Simulacion from Configuracion import Configuracion simulacion = Simulacion() simulacion.configurate(Configuracion.get_default_configuration()) simulacion.run() self.assertEqual(True, True)
def regresar_a_restaurante(self, evento): from Simulacion import Simulacion simulacion = Simulacion() camioneta = simulacion.obtener_camioneta_a_volver_al_restaurante() pedido = Pedido(evento.cliente, evento.hora, camioneta, evento.tipo_pizza) if camioneta is None: simulacion.pedidos_en_espera.append(pedido) else: simulacion.add_pedido(pedido) camioneta.disponible = False camioneta.pedidos.append(pedido) simulacion.dispatch(EventType.CAMIONETA_REGRESA_A_BUSCAR_PEDIDO, { 'pedido': pedido, 'camioneta': camioneta })
def _ejecutar(self, evento: LlamoClienteEvent): from Simulacion import Simulacion simulacion = Simulacion() # Rechazar cliente if not simulacion.cliente_esta_en_rango(evento.cliente) or \ not evento.tipo_pizza in simulacion.tipos_de_pizza_disponibles: simulacion.clientes_rechazados.append(evento) return # asignar pedido a camioneta camioneta = simulacion.seleccionar_camioneta(evento.cliente, evento.tipo_pizza) if camioneta is not None: self.asignar_pedido_a_camioneta(camioneta, evento) return # convencer al cliente if simulacion.utils.convencer_al_cliente(): # no hay camionetas disponibles if len(simulacion.camionetas_disponibles) == 0: simulacion.pedidos_en_espera.append( Pedido(evento.cliente, evento.hora, None, evento.tipo_pizza)) return # hay tipo en camioneta tipos_disponibles = simulacion.get_tipos_disponibles_en_camionetas( ) evento.tipo_pizza = tipos_disponibles[0] camioneta = simulacion.seleccionar_camioneta( evento.cliente, evento.tipo_pizza) self.regresar_a_restaurante( evento ) if camioneta is None else self.asignar_pedido_a_camioneta( camioneta, evento) return self.regresar_a_restaurante(evento)
linea = persona.strip().split(",") if linea[1] == "Alumno": alumnos.append(Alumno(linea[0], linea[2], 0.1, 0.7, 0.15, 0.05, 2, 12, 0.2)) elif linea[1] == "Profesor": profesores.append(Profesor(linea[0],linea[2])) elif linea[1] == "Tareas": tareos.append(Tareos(linea[0])) elif linea[1] == "Docencia": docencia.append(Docencia(linea[0])) else: coordinador = Coordinador(linea[0], 0.1) if linea[2] not in sec and linea[2].isdigit(): sec.append(linea[2]) secciones += 1 sim = Simulacion(contenidos, alumnos, profesores, docencia, tareos, coordinador, secciones) sim.run() nuevo = [] aux = 0 for i in sim.notasc: for b in range(aux, i[1]): nuevo.append(i[0]) aux = i[1] while len(nuevo) < 12: nuevo.append(nuevo[-1]) lista = [i for i in range(12)] plt.plot(lista, sim.notas_act, label="Actividades") plt.plot(lista, sim.notast, label="Tareas")
def _volver_a_restaurante_a_buscar_pedido(self, pedido): from Simulacion import Simulacion simulacion = Simulacion() simulacion.dispatch(EventType.CAMIONETA_REGRESA_A_BUSCAR_PEDIDO, {'pedido': pedido, 'camioneta': self})
def _ejecutar(self, evento: LlamoClienteEvent): from Simulacion import Simulacion simulacion = Simulacion() if not simulacion.cliente_esta_en_rango(evento.cliente): simulacion.rechazar_cliente(evento)
def setUp(self): from Simulacion import Simulacion self.simulacion = Simulacion() self.evento = LlamoClienteEvent(10, Cliente(), self.simulacion.generar_tipo_de_pizza()) self.camionetas = [Camioneta() for i in range(4)]
def __init__(self): from Simulacion import Simulacion simulacion = Simulacion() self.demora = simulacion.utils.tiempo_entrega()
def test_pedidos_se_generan_correctamente(self): simulacion = Simulacion() simulacion.configurate(Configuracion.get_default_configuration()) self.assertTrue(len(simulacion.fel) == 0) simulacion.iniciar_dia() self.assertTrue(len(simulacion.fel) > 0)
def dias_transcurridos(self): from Simulacion import Simulacion simulacion = Simulacion() return (self.dia - simulacion.tiempo_inicio).days + 1
def generar_evento(cliente, tipo_pizza): simulacion = Simulacion() hora = simulacion.tiempo_inicio + timedelta(minutes=5) kwargs = {'hora': hora, 'cliente': cliente, 'tipo_pizza': tipo_pizza} simulacion.dispatch(EventType.LLAMO_CLIENTE, kwargs)
def _enviar_pedido(self, pedido: Pedido): pedido.ubicacion_origen = self.ubicacion from Simulacion import Simulacion simulacion = Simulacion() simulacion.dispatch(EventType.ENTREGAR_PEDIDO, {'hora': simulacion.time + timedelta(minutes=simulacion.utils.tiempo_entrega()), 'pedido': pedido})