应用实例---泊松到达过程模拟应用在客户到达

仅供参考。不做任何保证。

目录

程序一:

程序二:

程序三:



程序一:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
import random
import math
import time
from datetime import datetime
import PyQt5
from tkinter import *
import tkinter as tk
from tkinter import ttk

#用户输入相关数据,此例只是举例,可编写成动态输入
inventory=float(1000)#初始库存
lifetime=float(100)#保质期
minvalue=float(1)#单次购买最小量
maxvalue=float(10)#单次购买最大量
interval=int(1)#时间间隔

def generateArrival(inventory,lifetime,minvalue,maxvalue,interval=1):
    mean_value=(minvalue+maxvalue)/2
    begintime=1581264000
    arrivaltime=[]
    arrivaltime.append(begintime)
    i=0
    othertimelist=[]
    lifetimelist=np.arange(0,lifetime,interval)
    
    for each in lifetimelist:
        print('each:',each)
        if othertimelist != []:
            print('2-1')
            print('othertimelist:',othertimelist)
            print('each+begintime:',each+begintime)
            while othertimelist != [] and  min(othertimelist)<(each+begintime+interval):
                print('2-2')
                arrivaltime.append(min(othertimelist))
                second=datetime.fromtimestamp(min(othertimelist))
                amount=round((random.uniform(minvalue,maxvalue)),2)
                othertimelist.remove(min(othertimelist))
                if amount > inventory:
                    print('In ',second,' ,the remaining is not enough, so the customer only bought ',inventory)
                    inventory=inventory-amount
                    break
                if amount <= inventory:
                    print('In ',second,'No',i+1,'customer bought ',amount)
                    inventory=float(format((inventory-amount),'0.2f'))
                    lam=inventory/(mean_value*lifetime)
                if  arrivaltime[-1] > (each+interval+begintime):
                    othertimelist.append(arrivaltime[-1])
                    print('5-1')
                    print('In ',second,' ,there are still remaining. The number of them is ',inventory)
                    break
                if inventory>0 and each>=max(lifetimelist):
                    print('They are overdue. The number is ',inventory)
                i=i+1
            if othertimelist != [] and min(othertimelist)>(each+begintime+interval):
                print('仍需要下个时间段')
            if inventory>0 and each>=max(lifetimelist):
                print('They are overdue. The number is ',inventory)
            print('1-1')   
            
        print('主程序')
        
        
        lam=inventory/(mean_value*lifetime)
        nextarrivalinterval=np.random.exponential(lam)
        if (arrivaltime[-1]+nextarrivalinterval)>(each+interval+begintime):
            print('未用时间')
            othertimelist.append(arrivaltime[-1]+nextarrivalinterval)
        else:
            arrivaltime.append(arrivaltime[-1]+nextarrivalinterval)
            lifetime=lifetime-nextarrivalinterval
            second=datetime.fromtimestamp(arrivaltime[-1])
            amount=round((random.uniform(minvalue,maxvalue)),2)
            if amount > inventory:
                print('In ',second,' ,the remaining is not enough, so the customer only bought ',inventory)
                inventory=inventory-amount
                break
            if amount <= inventory:
                print('5-2')
                print('In ',second,'No',i+1,'customer bought ',amount)
                inventory=float(format((inventory-amount),'0.2f'))
                lam=inventory/(mean_value*lifetime)
                if  arrivaltime[-1] > (each+interval+begintime):
                    othertimelist.append(arrivaltime[-1])
                    print('5-1')
                    break
                print('In ',second,' ,there are still remaining. The number of them is ',inventory)
                i=i+1
            if inventory>0 and each>=max(lifetimelist):
                print('They are overdue. The number is ',inventory)

generateArrival(inventory,lifetime,minvalue,maxvalue,interval)

程序二:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
import random
import math
import time
from datetime import datetime
import PyQt5
import tkinter

#给定初始库存inventory
def getInventory():
    inventory=input('Please input the valuse of inventory: ', )
    return float(inventory)

#给定保质期lifetime
def getLifetime():
    unit=input('The unit of lifetime is day or hour: ', )
    lifetimeunit=input('Please input the value of lifetime: ',)
    #lifetime=lifetime*24*60*60
    lifetimeunit=float(lifetimeunit)
    if unit=='day':
        lifetime=lifetimeunit*24*60*60
        #print(lifetime)
        return float(lifetimeunit*24*60*60)
    elif unit=='hour':
        lifetime=lifetimeunit*60*60
        #print(lifetime)
        return lifetimeunit*60*60

#给定min
def getMin():
    min=input('Please input the valuse of min: ', )
    return float(min)

#给定max
def getMax():
    max=input('Please input the valuse of max: ', )
    return float(max)

#给定interval
def getInterval():
    interval=input('Please input the valuse of interval,and its unit is second: ', )
    return float(interval)

#在每位顾客到达后,更新lam 
def generateArrival(inventory,lifetime,minvalue,maxvalue,interval):
    Mean=(minvalue+maxvalue)/2
    arrivaltime=[]
    arrivaltime.append(1581264000) #It's the beging time
    lifetime_copy=int(lifetime)#The begining time
    lifetime_end=arrivaltime[0]+lifetime#The ending time
    arrivaltimecustomer=[]
    lifetimelist=np.arange(1,lifetime+1,interval)
    otherarrival=[]
    i=0
    
    #Situation 1-specail
    if inventory>0 and lifetime<0:#The lifetime is none.
        print("Sorry, they are overdue. The number is ",inventory) 
    
    #Situation 2-specail
    if inventory <=0 and lifetime>0:
        print("The inventory is zero.")
       
    #Situation 3-specail
    if inventory <=0 and lifetime <=0:
        print("We have already sold all out.")
        
    #Situation 4-normal situation
    for each in lifetimelist:
        if lifetime==interval:# The last second
            print("Now it's the last time. Now there's remaining. They'are ",inventory)
            break
            
        if lifetime >=interval:# Not the last second           
            if inventory<=0:
                break
            print("For now the remaining is ",inventory)
            lam=inventory/(Mean*lifetime)
            nextarrivalinterval=np.random.exponential(lam)
            if nextarrivalinterval<=each and inventory>=0:
                #arrivaltime.append(arrivaltime[-1]+nextarrivalinterval)
                while (arrivaltime[-1]+nextarrivalinterval)<=(each+arrivaltime[0]) or inventory <=0 or lifetime<=0:                 
                    print("Circle")            
                    #if (arrivaltime[-1])<=lifetime_end:
                        #lifetime=lifetime-nextarrivalinterval
                        #arrivaltime.append(arrivaltime[-1]+nextarrivalinterval)
                    arrivaltime.append(arrivaltime[-1]+nextarrivalinterval)
                    second=datetime.fromtimestamp(arrivaltime[-1])
                    amount=round((random.uniform(minvalue,maxvalue)),2)
                    if amount>inventory and lifetime>=0:
                        print("In ",second,", the inventory is not enought to sell, so the customer just can buy ",amount)
                        lifetime=lifetime-nextarrivalinterval
                        inventory=float(format((inventory-amount),'0.2f'))
                        i=i+1
                        break
                    if amount<=inventory and lifetime>=0:
                        print('In ',second,'No',i+1,'customer bought ',amount)
                        lifetime=lifetime-nextarrivalinterval
                        inventory=float(format((inventory-amount),'0.2f'))
                        i=i+1
                    if lifetime<0:
                        print("Now it's the important and last time.")
                        break
                    lam=inventory/(Mean*lifetime) 
                    nextarrivalinterval=np.random.exponential(lam)
                    if (arrivaltime[-1]+nextarrivalinterval)>(each+arrivaltime[0]):
                        otherarrival.append(arrivaltime[-1]+nextarrivalinterval)
                        break
            else:
                otherarrival.append(arrivaltime[-1]+nextarrivalinterval)        
    print(otherarrival)

#用户输入相关数据
inventory=getInventory()#初始库存
lifetime=getLifetime()#保质期
minvalue=getMin()#单次购买最小量
maxvalue=getMax()#单次购买最大量
interval=getInterval()#时间间隔

generateArrival(inventory,lifetime,minvalue,maxvalue,interval)

程序三:

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
import random
import math
import time
from datetime import datetime
import PyQt5
import tkinter

#给定初始库存inventory
def getInventory():
    inventory=input('Please input the valuse of inventory: ', )
    return float(inventory)

#给定保质期lifetime
def getLifetime():
    unit=input('The unit of lifetime is day or hour: ', )
    lifetimeunit=input('Please input the value of lifetime: ',)
    #lifetime=lifetime*24*60*60
    lifetimeunit=float(lifetimeunit)
    if unit=='day':
        lifetime=lifetimeunit*24*60*60
        #print(lifetime)
        return float(lifetimeunit*24*60*60)
    elif unit=='hour':
        lifetime=lifetimeunit*60*60
        #print(lifetime)
        return lifetimeunit*60*60

#给定min
def getMin():
    min=input('Please input the valuse of min: ', )
    return float(min)

#给定max
def getMax():
    max=input('Please input the valuse of max: ', )
    return float(max)

#给定interval
def getInterval():
    interval=input('Please input the valuse of interval,and its unit is second: ', )
    return float(interval)

#在每位顾客到达后,更新lam 
def generateArrival(inventory,lifetime,minvalue,maxvalue,interval):
    Mean=(minvalue+maxvalue)/2
    arrivaltime=[]
    arrivaltime.append(1581264000) #It's the beging time
    lifetime_copy=int(arrivaltime[0])#The begining time
    lifetime_end=arrivaltime[0]+lifetime#The ending time
    arrivaltimecustomer=[]
    lifetimelist=np.arange(1,lifetime+1,interval)
    otherarrival=[]
    i=0
    
    #Situation 1-specail
    if inventory>0 and lifetime<0:#The lifetime is none.
        print("Sorry, they are overdue. The number is ",inventory) 
    
    #Situation 2-specail
    if inventory <=0 and lifetime>0:
        print("The inventory is zero.")
       
    #Situation 3-specail
    if inventory <=0 and lifetime <=0:
        print("We have already sold all out.")
        
    #Situation 4-normal situation
    for each in lifetimelist:
        if lifetime==interval:# The last second
            print("Now it's the last time. Now there's remaining. They'are ",inventory)
            break
            
        if lifetime >=interval:# Not the last second           
            if inventory<=0:
                break
            print("For now the remaining is ",inventory)
            lam=inventory/(Mean*each)
            nextarrivalinterval=np.random.exponential(lam)
            arrivaltime.append(arrivaltime[-1]+nextarrivalinterval)
            while min(arrivaltime)<=(each+arrivaltime[0]) or inventory <=0 or lifetime<=0:                 
                print("Circle")            
                second=datetime.fromtimestamp(min(arrivaltime[1:]))
                amount=round((random.uniform(minvalue,maxvalue)),2)
                if amount>inventory and lifetime>=0:
                    print("In ",second,", the inventory is not enought to sell, so the customer just can buy ",amount)
                    lifetime=lifetime-nextarrivalinterval
                    inventory=float(format((inventory-amount),'0.2f'))
                    i=i+1
                    break
                if amount<=inventory and lifetime>=0:
                    print('In ',second,'No',i+1,'customer bought ',amount)
                    lifetime=lifetime-nextarrivalinterval
                    inventory=float(format((inventory-amount),'0.2f'))
                    arrivaltime.remove(min(arrivaltime[1:]))
                    i=i+1
                if lifetime<0:
                    print("Now it's the important and last time.")
                    break
                lam=inventory/(Mean*lifetime) 
                nextarrivalinterval=np.random.exponential(lam)
                arrivaltime.append(arrivaltime[-1]+nextarrivalinterval)
            else:
                otherarrival.append(arrivaltime[-1]+nextarrivalinterval)        
    print(otherarrival)

#用户输入相关数据
inventory=getInventory()#初始库存
lifetime=getLifetime()#保质期
minvalue=getMin()#单次购买最小量
maxvalue=getMax()#单次购买最大量
interval=getInterval()#时间间隔

generateArrival(inventory,lifetime,minvalue,maxvalue,interval)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值