python中的空队列

时间:2019-06-01 15:48:28

标签: python class methods priority-queue

我正在尝试添加带有一些信息的优先级队列,并且我使用多种方法达到主要目标,并且当我尝试在同一类的另一个方法上调用类方法时,这将使我具有优先权队列为空。您可以提供一些解决方案吗? 这是我到目前为止的代码。

队列与此相同:

{A:2,A:13,...}

import random

#classe responsável por gerir a queue de prioridade (adquirida na net)
class PriorityQueue(object):
    def __init__(self):
        self.queue = []

    def __str__(self):
        return "\n".join(["\n".join(["{0}: {1}".format(key, pair[key]) for key in pair]) for pair in self.queue])

    # for checking if the queue is empty
    def isEmpty(self):
        return len(self.queue) == 0

    # for inserting an element in the queue
    def insert(self, data):
        if (type(data) == dict) and (len(data) == 1):
            new_key = list(data.keys())[0]
            if (type(new_key) == str) and (type(data[new_key]) == int):
                self.queue.append(data)


    # for popping an element based on Priority
    def checkMinimo(self, state):
        if self.isEmpty():
            return [None, None]
        max_index = None
        max_int = None
        max_key = None
        for i in range(len(self.queue)):
            pair_key = list(self.queue[i].keys())[0]
            pair_int = self.queue[i][pair_key]
            if (max_index == None) or (pair_int < max_int):
                max_index = i
                max_int = pair_int
                max_key = pair_key

        if state is 0:      #quando queremos eliminar o valor do evento
            del self.queue[max_index]
            return [max_key, max_int]
        else:      #quando queremos retornar o tipo de evento
            return max_key, max_int


class BarberShop(object):

    def __init__(self):
        self.nBlock = 0
        self.nClientsAtt = 0
        self.nChairsOccupied = 0
        self.nWasbasinsOccupied = 0 #considera-se que o máximo será 1, há 1 lavatório na barbearia
        self.barberOccupied = 0 #considera-se que o máximo será 2, há 2 barbeiros na barbearia
        self.tempEvent = 0 #tempo de chegada de eventos
        self.tempAtual = 0
        self.tempAux = 0

        self.queueEvent = PriorityQueue()

    #preencher a queue
    def throwArrivals(self, test_list):

        for x in range(10-1):
            self.queueEvent.insert({"A" : test_list[x]})

        print('Queue de eventos de chegada (A) e partida (D) está preenchida da seguinte forma \n\n',self.queueEvent)

        self.throwEvent()

    def throwEvent(self):

        eventType, timeEvent = self.queueEvent.checkMinimo(0)
        print('\nSurgiu um:', eventType, ':', timeEvent)

        # lançar o evento de chegada
        if eventType is 'A':        #incrementa sempre tempo
            print('***************************************************************************************************')

            # verificamos se já está no horário de fecho e se há cadeiras disponiveis
            if self.tempAtual > 100 and self.nChairsOccupied == 0:
                print('\nHorario de fecho! São', self.tempAtual, 'min e a barbearia fecha aos 600min')
                print('Foram atendidos', self.nClientsAtt, 'clientes, \n   foram bloqueados', self.nBlock, 'clientes')
                #break

            else:
                #como chegou um novo cliente devemos verificar as cadeiras disponiveis
                self.checkChair()


        #se for um evento do tipo partida ou departure
        else:
            self.barberOccupied -= 1
            self.queueEvent.insert({"D": self.tempAtual})
            print('\nO cliente', self.nClientsAtt, 'já lavou e cortou o cabelo. Ele está de saída.')
            print('Queue de eventos de chegada (A) e partida (D) está preenchida da seguinte forma \n        ',self.queueEvent)
            self.throwEvent()

if __name__ == '__main__':
    obj = BarberShop()

    tempEvent = 0
    test_list = []
    i=0

    for i in range(10):
        t = int(random.expovariate(1 / 5))
        tempEvent += t
        test_list.append(tempEvent)

    #print(test_list)

    #inicalmente é lançado de imediato um evento do tipo chegada, arrival
    obj.throwArrivals(test_list)

我首先尝试的解决方案是将obj = BarberShop()放入我要使用的所有方法中。在此解决方案之前,我想要的信息不会在方法之间传递。

错误:

Traceback (most recent call last):
  File "C:/Users/Trabalhar.py", line 192, in <module>
    obj.throwArrivals(test_list)
  File "C:/Users/Trabalhar.py", line 67, in throwArrivals
    self.throwEvent()
  File "C:/Users/Trabalhar.py", line 86, in throwEvent
    self.checkChair()

0 个答案:

没有答案