2014-11-14 36 views
0

我目前正在學習數據結構和算法。 我發現Interactive python在打印機模擬python程序中如何計算waittime?

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))計算waitime爲currentsecond。 對於那個特定的currentsecond,它不會爲零。 同樣根據模擬,每180秒有一個新的任務,但它在同一個當前的秒中被排隊和出隊。 因此,printqueue在任何特定的時間總是空的,還是它?

請幫助...

回答

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

+0

謝謝,這是一個明確的解釋...非常感謝! – 2014-11-15 13:11:54