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