Exemplo n.º 1
0
def Simular(tiempo_laborable, numero_servidores):
    tiempo_transcurrido = 0
    clientes_declinaron = 0
    cajeros = numero_servidores * [Cajero()]
    personas_atendidas = []

    cajero_1, cajero_2, cajero_3, cajero_4 = [], [], [], []
    colas = [cajero_1, cajero_2, cajero_3, cajero_4]

    proxima_llegada = tiempo_llegada_cliente()

    for i in range(numero_servidores):
        cajeros[i] = Cajero()

    while tiempo_transcurrido < tiempo_laborable or len(colas[0]) > 0 or len(
            colas[1]) > 0 or len(colas[2]) > 0 or len(colas[3]) > 0:
        proxima_actividad = proximo_evento(proxima_llegada, cajeros)
        tiempo_transcurrido += proxima_actividad
        proxima_llegada -= proxima_actividad

        if proxima_llegada == 0:
            cajero_seleccionado = Cajero.seleccionar_cajero(colas, cajeros)
            #cajero esta desocupado
            if cajeros[cajero_seleccionado].cliente_atendido is None:
                cajeros[
                    cajero_seleccionado].tiempo_servicio = tiempo_servicio_cajero(
                    )
                cajeros[cajero_seleccionado].cliente_atendido = Cliente()
                cajeros[cajero_seleccionado].disponible = False
                cajeros[cajero_seleccionado].recien_asignado = True
            #se encola a la persona
            elif len(colas[cajero_seleccionado]) < 6:
                colas[cajero_seleccionado].append(Cliente())
            #la cola es mayor a 6 y se debe ver si el cliente declina
            else:
                clientes_declinaron = probabilidad_declinar(
                    colas[cajero_seleccionado], clientes_declinaron,
                    personas_atendidas)

            proxima_llegada = tiempo_llegada_cliente()

        for i in range(numero_servidores):
            if cajeros[i].tiempo_servicio > 0 and not cajeros[i].disponible:
                if cajeros[i].recien_asignado:
                    cajeros[i].recien_asignado = False
                else:
                    cajeros[i].tiempo_servicio -= proxima_actividad
                    cajeros[i].tiempo_servicio_total += proxima_actividad
                    cajeros[
                        i].cliente_atendido.tiempo_en_sistema += proxima_actividad
                    #se desocupa un cajero
                    if cajeros[i].tiempo_servicio == 0:
                        #se revisa si hay personas por atender en la cola de la caja
                        if len(colas[i]) > 0:
                            personas_atendidas.append(
                                cajeros[i].cliente_atendido)
                            cajeros[i].cliente_atendido = colas[i].pop()
                            cajeros[
                                i].tiempo_servicio = tiempo_servicio_cajero()
                            cajeros[i].disponible = False
                        else:
                            personas_atendidas.append(
                                cajeros[i].cliente_atendido)
                            cajeros[i].cliente_atendido = None
                            cajeros[i].disponible = True

        for cola in colas:
            for cliente in cola:
                cliente.tiempo_en_sistema += proxima_actividad

    porcentaje_clientes_declinaron = (clientes_declinaron *
                                      100) / len(personas_atendidas)
    tiempo_espera_cliente = Cliente.tiempo_promedio_espera(personas_atendidas)

    tiempo_total = [0] * 4
    for i in range(numero_servidores):
        tiempo_total[
            i] = tiempo_transcurrido - cajeros[i].tiempo_servicio_total
        tiempo_total[i] = tiempo_total[i] * 100 / tiempo_transcurrido

    return [
        porcentaje_clientes_declinaron, tiempo_espera_cliente, tiempo_total
    ]
Exemplo n.º 2
0
def iniciar_simulacion(maximo_de_tiempo, maximo_servidores):
    

    cola_por_atender = Cola()

    tiempo_actual = 0
    personas_que_declinaron = 0
    lista_cajeros = maximo_servidores * [Cajero()]
    personas_fuera_del_sistema = []


    for i in range(maximo_servidores):
        lista_cajeros[i] = Cajero()
        
    proxima_llegada = random_arrival_time()

    # SIMULACION
    while (tiempo_actual < maximo_de_tiempo or not Cajero.todos_servidores_disponibles(
            lista_cajeros) or cola_por_atender.tamano() > 0):
        servidor_recien_asignado = 10
    #     print "Tiempo Actual: %0.6f" % (tiempo_actual)
        # Verificamos cual es el evento mas proximo
        tiempo_para_evento = proximo_evento(
            proxima_llegada,
            lista_cajeros)
        if tiempo_para_evento == 0:
            print "Error tiempo para evento invalido"
            exit()
    #     print "El proximo evento ocurrira en %0.6f" % (tiempo_para_evento)
    #     print "En la cola inicial hay: %d" % (cola_por_llegar.tamano())
    #     print "En la cola de espera hay: %d" % (cola_por_atender.tamano())
        tiempo_actual += tiempo_para_evento
        # Manejamos las llegadas al sistema
        if proxima_llegada > 0:
            proxima_llegada -= tiempo_para_evento
            # Verificamos si un cliente ha llegado
            if proxima_llegada == 0:
                # Seleccionamos el cajero con menos cola
                cajero_seleccionado = cajero_con_menos_cola(lista_cajeros)
                # Si el cajero seleccionado esta vacio procedemos a atender
                if cajero_seleccionado.cola_por_atender.tamano() == 0:
                    cajero_seleccionado.tiempo_servicio = random_service_time()
                    cajero_seleccionado.persona_atendida = Persona()
                    cajero_seleccionado.disponible = False
                    servidor_recien_asignado = cajero_seleccionado
                # Si no esta vacia pero la cola es corta entonces lo encolamos en
                # el cajero
                elif cajero_seleccionado.cola_por_atender.tamano() < 6:
                    cajero_seleccionado.cola_por_atender.encolar(
                        Persona())
                #
                else:
                    personas_que_declinaron = random_decline(
                        cajero_seleccionado.cola_por_atender,
                        personas_que_declinaron,
                        personas_fuera_del_sistema)
                    
                proxima_llegada = random_arrival_time()
        # Manejo de servidores
        for i in range(maximo_servidores):
            if (lista_cajeros[i].tiempo_servicio > 0
                    and not lista_cajeros[i].disponible
                    and servidor_recien_asignado != lista_cajeros[i]):
                # Disminuimos el tiempo de servicio restante para el cliente
                # actual
                lista_cajeros[i].tiempo_servicio -= tiempo_para_evento
                # Le sumamos tiempo de servicio al cajero
                lista_cajeros[i].tiempo_servicio_total += tiempo_para_evento
                # Le sumamos tiempo de sistema a la persona siendo atendida por el
                # cajero
                lista_cajeros[i].persona_atendida.tiempo_sistema += tiempo_para_evento
                # Verificamos si el cajero termino te atender a alguien
                if lista_cajeros[i].tiempo_servicio == 0:
                    if lista_cajeros[i].cola_por_atender.tamano() > 0:
                        personas_fuera_del_sistema.append(
                            lista_cajeros[i].persona_atendida)
                        lista_cajeros[
                            i].persona_atendida = lista_cajeros[i].cola_por_atender.desencolar()
                        lista_cajeros[
                            i].tiempo_servicio = random_service_time()
                        lista_cajeros[i].disponible = False
                    else:
                        personas_fuera_del_sistema.append(
                            lista_cajeros[i].persona_atendida)
                        lista_cajeros[i].persona_atendida = None
                        lista_cajeros[i].disponible = True
        # Agregamos tiempo en el sistema a las personas en la cola
        for persona in cola_por_atender.items:
            persona.tiempo_sistema += tiempo_para_evento

    

    porcentaje_declinaron = (personas_que_declinaron * 100 / len(personas_fuera_del_sistema))
    tiempo_esperado_cliente = (Persona.tiempo_promedio_en_sistema(personas_fuera_del_sistema))
    porcentaje_tiempo_clista = []
    print "----------------------------------------------------------------"
    print "Analisis de resultados: "
    print "----------------------------------------------------------------"
    print "(a) El tiempo esperado que un cliente pasa en el sistema %0.2f minutos" % (tiempo_esperado_cliente)
    print "(b) Porcentaje de personas que declinaron  %0.2f" % (porcentaje_declinaron)
    print "(c) El porcentaje de tiempo desocupado de cada cajero"
    for i in range(maximo_servidores):
        tiempo_total = tiempo_actual - lista_cajeros[i].tiempo_servicio_total
        aux = (tiempo_total * 100 / tiempo_actual)
        porcentaje_tiempo_clista.append(aux)
        print "    Cajero %d: %0.6f" % (i, aux)
    print "---------------------------------------------------------------- "

    return [porcentaje_declinaron, tiempo_esperado_cliente, porcentaje_tiempo_clista[0],porcentaje_tiempo_clista[1],porcentaje_tiempo_clista[2],porcentaje_tiempo_clista[3]]