Python小问题01怎样排队是最快的?

这是一个广为所知的问题

超市里咋样排队才是最快的呢?

语言表述以后再加,现在先上代码

import time
import random
import matplotlib.pyplot as plt

#state--0/1/2/3/4/5/6
class customer:
    def __init__(self,name,state=None,pay=False):
        self.name = name
        self.state = state
        self.pay = pay

class cashier_desk:
    def __init__(self,number,wait=0,allwait=0):
        self.number = number
        self.wait = wait
        self.allwait = allwait

def line_as_random(customers,cashier_desks):
    
    for i in customers:
        #找位置
        #付钱
        c = random.choice(cashier_desks)
        i.state = c
        c.wait += 1

    for i in cashier_desks:
        for ii in range(i.wait):
            i.allwait += random.randint(10,60)

    return max([i.allwait for i in cashier_desks])


def line_as_indicator(customers,cashier_desks):


    for i in range(1000):
        for ii in cashier_desks:
            if ii.allwait == 0:
                try:
                    d = customers.pop()
                    d.state = ii
                    ii.allwait += random.randint(10,60)
                except:
                    pass
                
        for ii in cashier_desks:
            ii.allwait -= 1
                
        if len(customers) == 0:
            start = i 
            break

    return start

customers = [customer(i,0) for i in ["Bob","harry","jame","potter","lili","ron","hemine","weislei","tom","jerry","lijia","mei","sun","tang"
                                     ,"chandler","li","qiu","sitel","heige","denboliduo","maige","xinpusen","batter","sumei","kivi"]]
cashier_desks = [cashier_desk(str(i)) for i in range(1,4)]

time = []
sum = 0
for i in range(40000):
    s = line_as_random(customers,cashier_desks)
    time.append(s)
    sum += s
    customers = [customer(i,0) for i in ["Bob","harry","jame","potter","lili","ron","hemine","weislei","tom","jerry","lijia","mei","sun","tang"
                                         ,"chandler","li","qiu","sitel","heige","denboliduo","maige","xinpusen","batter","sumei","kivi"]]
    cashier_desks = [cashier_desk(str(i)) for i in range(1,4)]

time1 = []
sum1 = 0
for i in range(40000):
    s = line_as_indicator(customers,cashier_desks)
    time1.append(s)
    sum1 += s
    customers = [customer(i,0) for i in ["Bob","harry","jame","potter","lili","ron","hemine","weislei","tom","jerry","lijia","mei","sun","tang"
                                         ,"chandler","li","qiu","sitel","heige","denboliduo","maige","xinpusen","batter","sumei","kivi"]]
    cashier_desks = [cashier_desk(str(i)) for i in range(1,4)]



plt.plot(range(1,1+len(time)),time,c="red")
plt.plot(range(1,1+len(time1)),time1,c="green")
plt.title("total random average "+str(sum/len(time))+"line as lead average"+str(sum1/len(time1)))
plt.savefig("compare.jpg")




效果图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

River Chandler

谢谢,我会更努力学习工作的!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值