示例#1
0
 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)
示例#2
0
    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)
示例#3
0
 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)
示例#4
0
 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})
示例#5
0
 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
示例#6
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
示例#7
0
    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
示例#8
0
    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))
示例#9
0
 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']
示例#10
0
 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
示例#11
0
 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)
示例#12
0
 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()
示例#13
0
 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
示例#14
0
 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
示例#15
0
    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))
示例#16
0
    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})
示例#17
0
 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})
示例#18
0
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)
示例#20
0
    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
            })
示例#21
0
    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)
示例#22
0
        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")
示例#23
0
 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)
示例#25
0
 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()
示例#27
0
 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)
示例#28
0
 def dias_transcurridos(self):
     from Simulacion import Simulacion
     simulacion = Simulacion()
     return (self.dia - simulacion.tiempo_inicio).days + 1
示例#29
0
 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)
示例#30
0
 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})