download: pte_ej2.py
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
""" Ejercicio 2:

En un proceso de fabricación las piezas llegan al taller,
son procesadas por una máquina y luego son inspeccionadas.
El 80% de las piezas inspeccionadas van al depósito de
mercaderías terminadas. Del resto el 40% va al deposito de
piezas fallidas y el resto se reprocesa. Se desea conocer cuanto
tiempo tomará aceptar 500 piezas terminadas, y que longitud máxima
de cola hubo en la máquina durante el proceso. Se conoce la
distribución de los tiempos de llegada, de procesamiento y de inspección.

Eventos principales:

    * Llegada de una pieza
    * Fin de procesamiento
    * Fin de inspección
"""
from random import random, normalvariate as normal, uniform as uniforme, expovariate as exponencial
import pte


OCUPADO = 1
LIBRE = 0

cola_p = 0
cola_i = 0
max_cola_p = 0
piezas_aceptadas = 0
piezas_rechazadas = 0
maq_proc = LIBRE
inspector = LIBRE

def principal():
    pte.PPE(llegada,0)
    while(piezas_aceptadas < 500):
        pte.SPE()
    print "500 piezas fueron aceptadas en %.2f unidades de tiempo.\n" % pte.t
    print "Máximo tamaño de la cola para procesamiento %i.\n" % max_cola_p
	

def llegada():
    global maq_proc, cola_p, OCUPADO, max_cola_p
    prox = normal(1,0.1)
    pte.PPE(llegada, prox)
    if maq_proc == OCUPADO:
    	cola_p += 1
	max_cola_p = max(max_cola_p, cola_p)
    else:
	maq_proc = OCUPADO
	t_proc = uniforme(0.005, 0.02)
	pte.PPE(fin_procesamiento, t_proc)

    	
def fin_procesamiento():
    global cola_p, maq_proc, LIBRE, inspector, OCUPADO, cola_i
    if cola_p == 0:
        maq_proc = LIBRE
    else:
        cola_p -= 1
        t_proc = uniforme(0.005, 0.02)
        pte.PPE(fin_procesamiento, t_proc)
    if inspector == OCUPADO:
        cola_i +=1
    else:
        inspector = OCUPADO
        t_ins = exponencial(0.5)
        pte.PPE(fin_inspeccion, t_ins)
		

def fin_inspeccion():
        global cola_i, inspector, LIBRE, piezas_aceptadas, piezas_rechazadas
        if cola_i == 0:
            inspector = LIBRE
        else:
            cola_i -=1
            t_ins = exponencial(0.5)
            pte.PPE(fin_inspeccion, t_ins)
        if random() <= 0.8:
            piezas_aceptadas += 1
        elif random() <= 0.4:
            piezas_rechazadas += 1
        else:
            pte.PPE(llegada,pte.t)

if __name__ == "__main__":
    principal()
    

Copyleft 2006 Juanjo Conti