def deliver_to_shelf(self, command, order_in_progress): #print("COMANDO DELIVER_SHELF:", command) transactor = command[2] #coordinate del transactor num_wares = int( command[3]) #numero di merci da prelevare dal transactor shelves = command[4] # cerco i trasportatori liberi unused_transporters = self.check_unused_transporter() # se la quantità da prendere è maggiore della somma totale della capacità dei trasortatori disponibili, li mando tutti if compare_total_capacity(unused_transporters, num_wares): chosen_transporters = pathCalculatorSameGoal( self.sectors, unused_transporters, transactor) print( "capacità massima inferiore a quella richiesta: invio tutti i trasportatori" ) order_in_progess = True #comunica tramite il flag che l'ordine non è ncora stato completato else: # sennò capisco qual è la combinazione migliore di trasportatori (minima capacità complessiva e minor tempo di arrivo al transactor) best_transporters = best_capacity_calculator( unused_transporters, num_wares) if len(best_transporters ) != 1: #se non è stata trovata solo una combinazione chosen_transporters = pathComparator( self.sectors, best_transporters, transactor ) #si controlla quale combinazione è nel complesso più vicina al transactor else: #si sceglie la combinazione trovata senza ulteriori controlli chosen_transporters = pathCalculatorSameGoal( self.sectors, best_transporters[0], transactor) order_in_progess = False #comunica tramite il flag che l'ordine sta venendo completato # invio i transporter return True
def send_to_transactor(self): # fintanto che ci sono ancora merci da prendere nel transactor while self.retrieve_transanctor: #svuoto la lista dei transporter unused unused_transporters = [] # cerco i trasportatori liberi unused_transporters = self.handler.check_unused_transporter() if len(unused_transporters ) != 0: #se è stato trovato almeno un transporter unused print("UNUSED TRANSPORTERS:") for n in range(len(unused_transporters)): print(unused_transporters[n].mac_address) # se la quantità da prendere è maggiore della somma totale della capacità dei trasortatori disponibili, li mando tutti print("self.num_wares prima =", self.num_wares) if compare_total_capacity(unused_transporters, self.num_wares): # vengono selezionati tutti i transporter chosen_transporters = unused_transporters print( "capacità massima inferiore a quella richiesta: invio tutti i trasportatori" ) else: print("self.num_wares dopo =", self.num_wares) # sennò capisco qual è la combinazione migliore di trasportatori (minima capacità complessiva e minor tempo di arrivo al transactor) best_transporters = best_capacity_calculator( unused_transporters, self.num_wares) print("BEST TRANSPORTERS:") for n in range(len(best_transporters)): print("LISTA #", n + 1) for m in range(len(best_transporters[n])): print(best_transporters[n][m].mac_address) if len( best_transporters ) != 1: # se non è stata trovata solo una combinazione chosen_transporters = pathComparator( self.handler.sectors, best_transporters, self.transactor ) # si controlla quale combinazione è nel complesso più vicina al transactor else: # si sceglie la combinazione trovata senza ulteriori controlli chosen_transporters = best_transporters[ 0] #TODO vedi qua self.retrieve_transanctor = False # comunica tramite il flag che sono stati inviati abbastanza transporter da prelevare tutte le merci dal transactor #setto i trasportatori scelti su working self.handler.setTransportersStatus(chosen_transporters) print("CHOSEN TRANSPORTERS:") for n in range(len(chosen_transporters)): print(chosen_transporters[n].mac_address) self.handler.print_transporters() #assegno ad ogni transporter le shelf da consegnare assigned_transporters = self.assignShelves( chosen_transporters, self.tmp_remaining_shelves) print("TMP SHELVES") for n in range(len(self.tmp_remaining_shelves)): print("SHELF:", self.tmp_remaining_shelves[n].coord) print("LEVELS:", self.tmp_remaining_shelves[n].levels) print("TOTAL SHELVES") for n in range(len(self.total_remaining_shelves)): print("SHELF:", self.total_remaining_shelves[n].coord) print("LEVELS:", self.total_remaining_shelves[n].levels) print("ASSIGNED TRANSPORTERS:") for n in range(len(assigned_transporters)): print(assigned_transporters[n][0].mac_address) #invio i transporter for n in range(len(assigned_transporters) ): #cicla tra i transporter scelti tmp_assigned = assigned_transporters[n][ 0] #transporter assegnato tmp_diz_shelf = assigned_transporters[n][ 1] #dizionario delle shelf del transporter #si calcola quante wares totali dovrà trasportare il trasportatore tot_delivered = 0 for m in range( len(tmp_diz_shelf) ): #cicla tra tutte le shelf assegnate al trasportatore tot_delivered += len( tmp_diz_shelf[list(tmp_diz_shelf)[m]]) tmp_diz_transactor = {} tmp_diz_transactor[self.transactor] = [ tot_delivered, ] #si invia il transporter tmp_deliver_shelf_controller = transporterControllerDeliverShelf( tmp_assigned, tmp_diz_shelf, tmp_diz_transactor, self.handler.sectors, "DELIVER_SHELF", self.handler.crosses_queue, self.handler.sectors_queue, self) tmp_deliver_shelf_controller.start()