<jupyter_start><jupyter_text>Máquina de pintado - Modelos de Simulación - Rivera <NAME> Una máquina de pintado de piezas puede procesar una pieza en intervalos aleatorios de 10'' a 20'', las piezas llegan de manera continua cada 17 segundos, si una pieza no es pntada antes de los 30'' es considerada descarte y ya no puede ser utilizada. ¿Cuál es la taza de descarte de este modelo de producción? Adicional: -Si llega una pieza y ya hay 10 piezas en cola, ésta última es automáticamente descartada. -Si se rompe la máquina cada hora y se demora un minuto en repararse.<jupyter_code>import datetime
import random<jupyter_output><empty_output><jupyter_text>Función transforma un datetime en un string con valor igual al tiempo(time)<jupyter_code>def transformarTiempo(tiempo):
    st = datetime.datetime.strptime(str(tiempo), "%Y-%m-%d %H:%M:%S")
    return st.time()<jupyter_output><empty_output><jupyter_text>Clase de cola<jupyter_code>class Cola:
    def __init__(self,q,TiempoLlegada,DeltaLlegada,TiempoAbandono,DeltaAbandono,ListaAbandono,Limite):
        self.q=q
        self.descarte = 0
        self.tiempoL=TiempoLlegada
        self.deltaL = DeltaLlegada
        self.deltaA = DeltaAbandono
        self.contador = 0
        self.listaAbandono = ListaAbandono
        self.proxAbandono = TiempoAbandono
        self.limite = Limite
        
    def Llegada(self,PS):
        tiempoA = self.tiempoL
        if PS.estado == 0:
            PS.estado = 1
            PS.tiempoFS = self.tiempoL + PS.deltaFS[PS.contador]
            PS.contador+=1
        else:
            if self.q<=10:
                self.q += 1
                self.listaAbandono.append(tiempoA + self.deltaA)
                self.proxAbandono = self.listaAbandono[0]
            else:
                self.descarte += 1

        self.tiempoL += self.deltaL[self.contador]
        self.contador +=1
        return tiempoA
    
    def ReinicioContador(self):
        if self.contador > len(self.deltaL)-1:
            self.contador = 0
            
    def AbandonoDeCola(self):
        tiempoA = self.proxAbandono
        self.q-=1
        del self.listaAbandono[0]
        self.descarte += 1
        if self.listaAbandono:
            self.proxAbandono = self.listaAbandono[0]
        else:
            self.proxAbandono = self.limite
        return tiempoA<jupyter_output><empty_output><jupyter_text>Clase de Puesto de Servicio<jupyter_code>class PuestoDeServicio:
    def __init__(self,Disposicion,Estado,TiempoFS,DeltaFS,TiempoInh,TiempoHab,DeltaDesc,DeltaInh,Limite):
        self.disposicion = Disposicion
        self.estado = Estado
        self.tiempoFS = TiempoFS
        self.deltaFS = DeltaFS
        self.contador = 0
        self.limite = Limite
        self.tiempoInh = TiempoInh
        self.tiempoHab = TiempoHab
        self.deltaDesc = DeltaDesc
        self.deltaInh = DeltaInh
        
    def FinDeServicio(self,Cola):
        tiempoA = self.tiempoFS
        
        if Cola.q > 0:
            Cola.q -= 1
            self.tiempoFS += self.deltaFS[self.contador]
            self.contador += 1
            del Cola.listaAbandono[0]
        else:
            self.estado = 0
            self.tiempoFS = self.limite
        if Cola.listaAbandono:
            Cola.proxAbandono = Cola.listaAbandono[0]
        else:
            Cola.proxAbandono = self.limite
            
        return tiempoA
        
    def ReinicioContador(self):
        if self.contador > len(self.deltaFS)-1:
            self.contador = 0
            random.shuffle(self.deltaFS)
            
    def Inhabilitar(self):
        tiempoA = self.tiempoInh
        self.tiempoFS += deltaDesc
        self.tiempoHab = tiempoA + deltaDesc
        self.disposicion = 0
        self.tiempoInh = self.limite
        return tiempoA       
        
    def Habilitar(self):
        tiempoA = self.tiempoHab
        self.tiempoInh = tiempoA + self.deltaInh
        self.tiempoHab = self.limite
        self.disposicion = 1
        return tiempoA<jupyter_output><empty_output><jupyter_text>Función para imprimir Tiempo, recibe variables en el siguiente orden: Hora Actual, LLegada del Cliente, Fin de Servicio, N° Cola (q) y Estado del Puesto de Servicio(PS)'<jupyter_code>def imprimirTiempo(Cola,PS,TiempoA):
    
    tiempoActual = transformarTiempo(TiempoA)
    tiempoLlegada = transformarTiempo(Cola.tiempoL)
    tiempoFinServicio = transformarTiempo(PS.tiempoFS)
    tiempoInhabilitar = transformarTiempo(PS.tiempoInh)
    tiempoHabilitar = transformarTiempo(PS.tiempoHab)
    tiempoAbandono = transformarTiempo(Cola.proxAbandono)
    if PS.estado==0:
        tiempoFinServicio = "        "
    if Cola.q == 0:
        tiempoAbandono = "        "
    if PS.disposicion==0:
        tiempoInhabilitar = "        "
    else:
        tiempoHabilitar = "        "

    print(tiempoActual," | ",tiempoLlegada," | ",tiempoFinServicio," | ",tiempoAbandono," | ",tiempoInhabilitar," | ",tiempoHabilitar," | ",Cola.q," | ",PS.estado," | ",PS.disposicion," | ",Cola.descarte)<jupyter_output><empty_output><jupyter_text>Función vector de deltas de tiempo por segundo'<jupyter_code>def delta(tiemposDelta):
    listaDelta = []
    for i in tiemposDelta:
        listaDelta.append(datetime.timedelta(seconds = i))
    return listaDelta<jupyter_output><empty_output><jupyter_text>Función asignación de tiempo'<jupyter_code>def tiempo(horas,minutos,segundos):
    tiempo = datetime.datetime.combine(datetime.datetime.today(),datetime.time(horas,minutos,segundos,0)) 
    return tiempo
def timedelta(i):
    return datetime.timedelta(seconds = i)<jupyter_output><empty_output><jupyter_text>Declaración de los tiempos iniciales y los deltas<jupyter_code>#Instancia del limite(HORA DE SERVICIO)'
limite = tiempo(12,0,0)

#Instancia de los tiempos iniciales
tiempoActual = tiempo(8,0,0)
tiempoL = tiempo(8,0,17)
tiempoFS = tiempo(8,0,10)
tiempoInh = tiempoActual + timedelta(360)
tiempoHab = limite




#Tiempos delta particulares del práctico
tiempoDL = [17]
tiempoDFS = [10,11,12,13,14,15,16,17,18,19,20]
listaAb = [tiempo(8,3,30),tiempo(8,4,0),tiempo(8,4,30)]
tiempoAb = listaAb[0]

deltaL = delta(tiempoDL)
deltaFS = delta(tiempoDFS)
deltaAb = timedelta(30)
deltaDesc = timedelta(60)
deltaInh = timedelta(60*60*1)


random.shuffle(deltaFS)

#Instancia de la Cola y del Puesto de Servicio
cola = Cola(3,tiempoL,deltaL,tiempoAb,deltaAb,listaAb,limite+timedelta(30))
PS = PuestoDeServicio(1,1,tiempoFS,deltaFS,tiempoInh,tiempoHab,deltaDesc,deltaInh,limite+timedelta(30))<jupyter_output><empty_output><jupyter_text>Programa principal, un while que imprime toda la matriz.<jupyter_code>print("  Actual  |  LLegada   | Fin de S.  | Abandono   |  Descanso  |  Vuelta T. |  q  |  PS |  S | Descarte")
print("------------------------------------------------------------------------------------------------------")

#Se imprime primero el estado inicial
imprimirTiempo(cola,PS,tiempoActual)


while tiempoActual < limite:
        #Si el tiempo de llegada de cliente es menor al fin de servicio'
        if cola.tiempoL <= PS.tiempoFS  and cola.tiempoL <= cola.proxAbandono and cola.tiempoL < limite and cola.tiempoL <= PS.tiempoInh:
            
            tiempoActual = cola.Llegada(PS)  
            imprimirTiempo(cola,PS,tiempoActual)
            
        #Si el tiempo de fin de servicio es menor que el de llegada'
        elif PS.tiempoFS <= cola.tiempoL and PS.tiempoFS <= cola.proxAbandono and PS.tiempoFS < PS.tiempoInh and PS.tiempoFS < limite and PS.estado == 1:
            tiempoActual = PS.FinDeServicio(cola)
        
            imprimirTiempo(cola,PS,tiempoActual)
         
        elif cola.proxAbandono <= cola.tiempoL and cola.proxAbandono <= PS.tiempoFS and cola.proxAbandono <= PS.tiempoInh and cola.proxAbandono < limite:
            tiempoActual = cola.AbandonoDeCola()
            imprimirTiempo(cola,PS,tiempoActual)
        
        elif PS.tiempoInh <= cola.proxAbandono and PS.tiempoInh <= PS.tiempoFS and PS.tiempoInh <= cola.tiempoL:
            tiempoActual = PS.Inhabilitar()
            imprimirTiempo(cola,PS,tiempoActual)
            
            while cola.tiempoL <= PS.tiempoHab:
                tiempoActual = cola.Llegada(PS)
                imprimirTiempo(cola,PS,tiempoActual)
                cola.ReinicioContador()
                PS.ReinicioContador()
            tiempoActual = PS.Habilitar()
            imprimirTiempo(cola,PS,tiempoActual)
            
        #Cierre
        else:
            if PS.estado == 1:
                print("El último cliente en el PS saldrá a las horas:",transformarTiempo(PS.tiempoFS))
            break
        
        #Reinicio de contadores
        cola.ReinicioContador()
        PS.ReinicioContador()

print("Clientes sin atención:",cola.q)
print("Descartado: %d" % (cola.descarte))<jupyter_output>Actual  |  LLegada   | Fin de S.  | Abandono   |  Descanso  |  Vuelta T. |  q  |  PS |  S | Descarte
------------------------------------------------------------------------------------------------------
08:00:00  |  08:00:17  |  08:00:10  |  08:03:30  |  08:06:00  |            |  3  |  1  |  1  |  0
08:00:10  |  08:00:17  |  08:00:23  |  08:04:00  |  08:06:00  |            |  2  |  1  |  1  |  0
08:00:17  |  08:00:34  |  08:00:23  |  08:04:00  |  08:06:00  |            |  3  |  1  |  1  |  0
08:00:23  |  08:00:34  |  08:00:38  |  08:04:30  |  08:06:00  |            |  2  |  1  |  1  |  0
08:00:34  |  08:00:51  |  08:00:38  |  08:04:30  |  08:06:00  |            |  3  |  1  |  1  |  0
08:00:38  |  08:00:51  |  08:00:48  |  08:00:47  |  08:06:00  |            |  2  |  1  |  1  |  0
08:00:47  |  08:00:51  |  08:00:48  |  08:01:04  |  08:06:00  |            |  1  |  1  |  1  |  1
08:00:48  |  08:00:51  |  08:00:59  |            |  08:06:00  |            |  0  |  1  |  1  |  1
08:00:51  [...]
{'fraction_non_alphanumeric': 0.12196114332214424, 'fraction_numerical': 0.039263554063676126, 'mean_word_length': 2.34194425560843, 'pattern_counts': {'":': 0, '<': 55, '<?xml version=': 0, '>': 40, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '588329', 'license': 'Apache-2.0', 'n_tokens_mistral': 3825, 'n_tokens_neox': 3700, 'n_words': 682, 'path': 'practicos/maquina_de_pintado.ipynb', 'repo_name': 'matias-rivera/simulacion', 'size': '9836'}