Python数据结构与算法分析 模拟:打印任务

class Queue:
    """创建一个队列"""
    def __init__(self):
        self.items = []

    def isEmpty(self):  # 判断是否为空
        return self.items == []

    def enqueue(self, item):  # 压入队列(这里将列表位置0作为队列尾部)
        self.items.insert(0, item)

    def dequeue(self):  # 弹出(这里将列表末尾作为队列头部)
        return self.items.pop()

    def size(self):  # 返回队列中元素数目
        return len(self.items)

class Printer:
    """定义一个打印机类"""
    def __init__(self, ppm):
        self.pagerate = ppm   #打印速度
        self.currentTask = None #是否有打印任务
        self.timeRemaining = 0   #任务倒计时

    def tick(self):
        #打印一秒钟(判断这一秒)
        if self.currentTask != None:
            self.timeRemaining = self.timeRemaining - 1   #让打印总时间减少1秒(因为在这一秒钟内,需要判断是否会出现新的任务)
            if self.timeRemaining <= 0:
                self.currentTask = None

    def busy(self):
        #判断是否在进行任务
        if self.currentTask != None:
            return True
        else:
            return False

    def startNext(self,newtask):
        #开始打印一个新的任务
        self.currentTask = newtask
        self.timeRemaining = newtask.getPages() * 60 / self.pagerate

import random
class Task:
    """定义一个随机生成打印任务的类"""
    def __init__(self, time):
        self.timestamp = time  #生成当前随机生成任务的时间戳
        self.pages = random.randrange(1, 21)  #随机生成该任务的打印页数

    def getStamp(self):
        #生成时间戳
        return self.timestamp

    def getPages(self):
        return self.pages

    def waitTime(self, currenttime):
        #打印任务等待时间
        return currenttime - self.timestamp

def newPrintTask():
    num = random.randrange(1, 181)
    if num == 52:
        return True
    else:
        return False



def simulation(numSeconds, pagesPerMinute): #本次模拟:模拟的总时长(秒数);每分钟打印多少页
    """开始一次打印机的模拟"""

    labprinter = Printer(pagesPerMinute)
    printQueue = Queue()
    waitingtimes = []

    #机器打印的过程
    for currentSecond in range(numSeconds): #在给定时间的范围内
        if newPrintTask():
            task = Task(currentSecond) #这里括号中的意思为:给这个随机任务传入的时间
            printQueue.enqueue(task) #在printQueue这个列表中增添了一个任务

        if not labprinter.busy() and not printQueue.isEmpty():
            #在打印机不忙同时打印列表不为空的情况下,进行打印任务的过程
            nexttask = printQueue.dequeue()
            waitingtimes.append(nexttask.waitTime(currentSecond))
            labprinter.startNext(nexttask)

        labprinter.tick()

    averageWait = sum(waitingtimes) / len(waitingtimes)
    print(f"Average wait {averageWait} secs {printQueue.size()} tasks remaining. ")

#进行10次模拟
for i in range(10):
    simulation(3600, 5)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值