如何在打印机模拟python程序中计算等待时间?

时间:2014-11-14 20:50:37

标签: python algorithm data-structures

我目前正在学习数据结构和算法。 我在Interactive python

上找到了此代码
from pythonds.basic.queue import Queue

import random

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
            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

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 simulation(numSeconds, pagesPerMinute):

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

    for currentSecond in range(numSeconds):

      if newPrintTask():
         task = Task(currentSecond)
         printQueue.enqueue(task)

      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("Average Wait %6.2f secs %3d tasks remaining."%(averageWait,printQueue.size()))

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

for i in range(10):
    simulation(3600,5)

请有人解释waitingtimes.append(nexttask.waitTime(currentSecond))如何计算当前秒的等待时间。 对于那个特定的当前秒,它不会是零。 同样根据模拟,每180秒有一个新任务,但它在相同的当前秒中排队并出列。 所以printqueue在任何特定时间总是空的,或者是吗?

请帮助......

1 个答案:

答案 0 :(得分:1)

每一秒,任务都会随机添加到队列。只有当打印机可用时not labprinter.busy()为真)才会从队列中取出要发送给打印机的任务。

一旦将任务添加到打印机,它将使该打印机获得一定数量的刻度('秒')来处理分配给每个任务的随机页数。然后就不会向它发送任何新任务!调用每个循环迭代labprinter.tick(),递减self.timeRemaining(根据任务大小和打印机页面速率计算)。只有当该数字达到0时,任务才会被清除,并且打印机不再忙碌(准备接受另一项任务)。

因此,当打印机忙时,队列可能会填满。在队列中花费几轮循环的任务将累积等待时间。

你可以写下蜱虫;假设它每分钟可处理20页,因此每页需要3秒钟:

  • 0。没有任何事情发生

  • 1。创建大小为10的任务。打印机是免费的,所以它将完成任务。 10页需要30秒。

  • 2 - 5.未创建新任务,打印机打印1页。

  • 6 - 9.在刻度线8创建一个新任务,添加到队列中。打印机打印第2页。

  • 9 - 30.可以创建更多任务,打印机打印其余页面。

  • 31。打印机是免费的,现在可以处理在刻度线8创建的任务。那个任务等了31 - 8 == 23秒。