In [ ]:
import numpy as np
import matplotlib.pyplot as plt
import math
from matplotlib.pylab import hist, show
from scipy.integrate import quad

funacu=[]
x=[]
px=[]
def factorial(x,n):
    if (n>0):
        x=factorial(x,n-1)
        x=x*n
    else:
        x=1
    return x

def congruencial(a,b,m,x0,n):
    xn=0.0
    un=0.0
    list = []
    for i in range(0,n):
        xn=(a*x0 + b)%m
        un=xn/float(m)
        #print un
        list.insert(i,un)
        x0=xn
    return list

def generaTablas(n):
    metodo=congruencial(893434454.0,5634543.0,2147483647.0,245654.0,n)
    tiempoAcumSer=0.0
    numClientesLlegaron=[]
    numClientesAtendidos=[]
    numClientesCola=[]
    numClientesenServ=[]
    tiempoEspera=[]
    tiempoLlegada=[]
    tll=[]
    tsal=[]
    tiempoServicio=[]
    totalClientes=0
    temp=0.0
    acumLleg=0.0
    acumAtend=0.0
    promedio=0.0
    funacu.append(0)
    lamda=input('Ingrese el valor para el parametro lamda')
    miu=input('Ingrese el valor para el parametro miu')
    sigma=input('Ingrese el valor para el parametro sigma')
    poisson(lamda)
    print 'No. Clientes llegando/hora: '
    for i in range(len(metodo)):
        print 'No. Clientes en ',(i+1),' horas: '
        for j in range(len(funacu)-1):
            if(metodo[i]>funacu[j] and metodo[i]<=funacu[j+1]):
                print x[j],' Clientes'
                numClientesLlegaron.append(x[j])
                totalClientes=totalClientes+x[j]
    print 'Tiempos de servicio'
    arreNormal=normal(miu,sigma,totalClientes,n)
    inicio=0
    fin=0
    for i in range(len(numClientesLlegaron)):
        fin=inicio+numClientesLlegaron[i]
        print 'Tiempo promedio de servicio en ',(i+1),' horas: '
        for j in range(inicio,fin):
            promedio=promedio+arreNormal[j]
        inicio=fin
        tiempoServicio.append(promedio/numClientesLlegaron[i])
        print tiempoServicio[i],' minutos'
        promedio=0.0
    for i in range(len(arreNormal)): 
        tiempoAcumSer=tiempoAcumSer+arreNormal[i]
    tiempoAcumSer=0.0
    cantClientesAten=-1;
    horas=1;
    for i in range(len(arreNormal)): 
        print 'tiempo acumulado servicio por hora: ',tiempoAcumSer
        if(tiempoAcumSer<60.0):
            cantClientesAten=cantClientesAten+1
            tiempoAcumSer=tiempoAcumSer+arreNormal[i]
        else:
            dif=tiempoAcumSer-60.0
            tiempoAcumSer=dif
            print 'Clientes atendidos en ',horas,' horas: ',cantClientesAten
            numClientesAtendidos.append(cantClientesAten)
            cantClientesAten=0
            horas=horas+1
    print 'Clientes atendidos en ',(horas),' horas'
    print cantClientesAten 
    numClientesAtendidos.append(cantClientesAten)
    for i in range(len(numClientesLlegaron)):
        print 'Tiempo promedio de llegadas en ',(i+1),' horas: ',((1.0/numClientesLlegaron[i])*60.0),' minutos'
        tiempoLlegada.append((1.0/numClientesLlegaron[i])*60.0)
        acumLleg=acumLleg+numClientesLlegaron[i]
        acumAtend=acumAtend+numClientesAtendidos[i]
        if(acumLleg>acumAtend):
            numClientesenServ.append(1.0)
        else:
            numClientesenServ.append(0.0)
        print 'Clientes en cola en ',(i+1),' horas: ',(acumLleg-(acumAtend+numClientesenServ[i]))
        print 'Clientes en servicio en ',(i+1),' horas: ',(numClientesenServ[i])
    llegadaAcum=0.0
    for i in range (len(numClientesLlegaron)):
        llegadaAcum=llegadaAcum+tiempoLlegada[i]
        tll.append(llegadaAcum)
    
def poisson(lamda):
    acumulado=0.0
    for i in range(70):
        valor=(math.exp((-1)*(lamda))*(lamda**i))/(factorial(1,i)+0.0)
        x.append(i)
        px.append(valor)
        acumulado+=valor
        funacu.append(acumulado)
def funcErrorInv(x):
    sig=-1.0;
    w=math.log(1-(x**2));
    term1=18.75537-(2.47197*w)+0.25*(w**2)
    if(x>0.0):
        sig=1
        if(x<0.0):
            sig=-1
            if(x==0.0):
                sig=0          
    total=sig*(((term1)**0.5) - 4.33074 - 0.5*w)**0.5
    return total

def normal(miu,sigma,n,clientes):
    normal=[]

    for i in range(n):
        total=miu+(sigma*(2**0.5))*funcErrorInv((2.0*(congruencial(2354343.0,35434343.0,214748.0,33434343.0,n)[i]))-1.0)
        normal.append(total)
        print 'Tiempo de servicio para cliente ',i,': ',total,' minutos'        
    return normal
generaTablas(10)

In [ ]:


In [ ]: