zoukankan      html  css  js  c++  java
  • MM1排队系统

    #coding=utf-8
    import time
    import random as rd
    #import math
    import pylab as pl
    def simulate(nameda,u):
        arriveInternal=0
        serviceTime=0
        serverCondition=0  #0表示服务台空闲,1表示忙碌
        waitTime=0
        stayTime=[]
        tempArriveEventTime=[10000000]  
        tempLeaveEventTime=[10000000]
        #tempArriveEventTime.append(10000000)  
        simulateTotalTime=1000000 #仿真时长
        simulateClock=0
        EntityNumber=0    
        queneLength=0  
        averageStayTime=0    
        currentArriveTime=0
        currentLeaveTime=0
        formerArriveTime=0
        formerLeaveTime=0
        lossMessage=0
        #生成仿真表,包括实体的到达时间和离开时间
        while simulateClock<=simulateTotalTime: 
                #保存上一个实体的到达、离开时间       
                formerArriveTime=currentArriveTime
                formerLeaveTime=currentLeaveTime
                #tempFormerLeaveTime=currentLeaveTime
                ####################随机数生成
                arriveInternal=rd.expovariate(nameda)
                serviceTime=rd.expovariate(u) 
                #######到达时间
                if EntityNumber==0:
                    currentArriveTime=arriveInternal       
                else:
                    currentArriveTime=formerArriveTime+arriveInternal   
                #仿真结束与否判断   
                if currentArriveTime>=simulateTotalTime:
                    break  
                #等待时间        
                if EntityNumber>0 and currentArriveTime<formerLeaveTime:
                    waitTime=formerLeaveTime-currentArriveTime              
                else:
                    waitTime=0      
                ##离开时间                
                currentLeaveTime=currentArriveTime+waitTime+serviceTime
                #仿真结束与否判断
                if currentLeaveTime>simulateTotalTime:
                    break  
                ###仿真时钟
                if EntityNumber==0:
                    simulateClock=currentLeaveTime#表示实体接受服务,并离开。
                    stayTime.append(currentLeaveTime)
                            
                elif queneLength>=10:
                    #print("message missed")
                    currentLeaveTime=formerLeaveTime
                    lossMessage+=1
                ###排队的实体    
                                      
                if currentArriveTime>=simulateClock and EntityNumber!=0:#开始处理队列的实体                                   
                    if len(tempArriveEventTime)>1:  
                        minValue=min(tempArriveEventTime) 
                        minIndex=tempArriveEventTime.index(minValue)       
                        while minValue<=simulateClock:                    
                            simulateClock=tempLeaveEventTime[minIndex]#实体接受了服务的情况下才会重置仿真时钟
                            tempArriveEventTime.pop(minIndex)
                            tempLeaveEventTime.pop(minIndex)
                            if queneLength>0:
                                queneLength-=1
                            minValue=min(tempArriveEventTime) 
                            minIndex=tempArriveEventTime.index(minValue)
                            #print("one processed") 
                    else:
                        simulateClock=currentLeaveTime  
                        stayTime.append(currentLeaveTime-currentLeaveTime)
                        #print("one processed")
                if currentArriveTime<simulateClock and EntityNumber!=0 :
                    tempArriveEventTime.append(currentArriveTime)
                    tempLeaveEventTime.append(currentLeaveTime)
                    queneLength+=1  
                    stayTime.append(currentLeaveTime-currentArriveTime)  
                    
                                                        
                ###############        
                EntityNumber+=1        
                if EntityNumber%1000000==0:
                    print("arriveTime:"+str(currentArriveTime)+",leaveTime:"+str(currentLeaveTime))
        lossRate=lossMessage/EntityNumber
        averageStayTime=sum(stayTime)/len(stayTime)
        print("loss rate:"+str(lossMessage/EntityNumber)) 
        print("lossMessage:"+str(lossMessage))
        print("entity:"+str(EntityNumber))
        return lossRate,averageStayTime
    pl.figure(1) #创建图表1,并选择图表1
    ax1=pl.subplot(211) #在图表1中创建子图1
    ax2=pl.subplot(212) #在图表1中创建子图2
    start=time.clock()
    for i in range(100):
        a,b=simulate(8, 10)
        print(str(i+1)+" simulate")
        pl.sca(ax1)
        #pl.plot(i,a,'o')
        pl.ylabel("loss rate") 
        pl.scatter(i,a)
        #pl.ylim(0,1)   
        pl.sca(ax2)
        #pl.plot(i,b,'o')
        pl.scatter(i,b)
        pl.ylabel("stay time")
    minutes=(time.clock()-start)/60
    print("cost minutes:"+str(minutes))
    pl.show()       
                
    理论部分参考:http://mi.gxu.edu.cn/jpkc/yunchouxue/resource_1info.php?id=29
  • 相关阅读:
    operamasks—omMessageBox的使用
    operamasks-omGrid的使用
    SQL Server转sqlite数据库
    operamasks—omMessageTip的使用
    operamasks—omBorderLayout布局
    选择器(E:hover/E:active/E:focus的使用)
    CSS3(各UI元素状态伪类选择器受浏览器的支持情况)
    选择器的使用(nth-of-type和nth-last-of-type选择器)
    选择器的使用(nth-child和nth-last-child选择器)
    选择器的使用(first-child和last-child选择器)
  • 原文地址:https://www.cnblogs.com/lz3018/p/4599921.html
Copyright © 2011-2022 走看看