Algorithme de planification des travaux 2

Nov 03 2020

Je recherche des commentaires pour améliorer la lisibilité du code et améliorer l'efficacité de l'algorithme. J'ai déjà posté une question sur l'examen du code à ce sujet. Les commentaires ont été utiles et j'ai repensé les structures de données.

Lien vers la question précédente: Algorithme de planification des tâches

Informations sur les cours:

L'élément est l'élément sur lequel les machines travaillent. La machine est une machine unique qui peut être utilisée de l'heure de début à l'heure de fin. Une seule tâche est un élément unique sur une machine. Le travail est un travail complet et peut avoir plusieurs tâches.

L'algorithme planifie les tâches, les réorganise pour la machine spécifique et ajoute au profit total lorsqu'un travail est terminé dans le calendrier.



class ItemModel:
    def __init__(self, name:str, starts:int, ends:int)->None:
        self.name = name
        self.start = start 
        self.ends = ends 
        
class JobModel:
    def __init__(self, tasks_needed:int, tasks_done:int, profit:int)->None:
        self.tasks_needed = tasks_needed
        self.tasks_done = tasks_done 
        self.profit = profit 
        
class MachineModel:
    def __init__(self, starts:int, ends:int)->None:
        self.starts = starts 
        self.ends = ends 

class View:
    def output_profit(profit:int)->None:
        print("profit: " + str(profit), end = "\n")
        
    def output_sublist(sublist:[int])->None:
        for item in sublist:
            print(str(item), end = " ")
        print('\n')
        

def algorithm(items:[ItemModel], jobs:[JobModel], machines:[MachineModel])->(int, [ItemModel]):
    total_profit = 0 
    for start in range(len(items)):
        for end in range(len(items)):
            for job_row in range(len(jobs)):
                if (time >= jobs[job_row].start_time) and (time <= jobs[job_row].end_time):
                    jobs[job_row].task_done += 1 
                    
            profit = 0 
            for job_row in range(len(jobs)):
                if jobs[row].tasks_needed == jobs[row].tasks_done:
                    profit += jobs[row].profit
                    
            yield (profit, sublist)
        
def main():
    items = [ItemModel("a", 0, 2), ItemModel("b", 3, 4)]
    jobs = [JobModel(0, 0, 12), JobModel(0, 0, 10)]
    machines = [MachineModel(0, 1), MachineModel(0, 7)]
    View view = View() 
    for pair in algorithm(items, jobs, machines):
        view.output_profit(pair[0])
        view.output_sublist(pair[1])


if __name__ == "__main__":
    main() 
 ```

Réponses

1 ZacharyVance Nov 04 2020 at 02:03
  • «algorithme» n'est pas du tout correct et échouera à l'exécution. veuillez vous assurer que votre code fonctionne avant de le publier. startet endne sont jamais lus. timen'est jamais défini. 'row' n'est jamais défini - il est typo-d comme 'job_row' la deuxième fois. utilisez «pour le travail dans robs», et non pour «pour job_row dans range(len(jobs))» avec «jobs [job_row]». Je recommanderais généralement un linter, qui devrait attraper toutes ces erreurs.

  • Ajoutez une docstring à "algorithme", décrivant ce que sont ses entrées et ce qu'il renvoie. Assurez-vous de décrire ce qu'il renvoie en termes de SIGNIFICATION et non ce que fait l'algorithme. ("renvoie la meilleure façon de planifier ..." et non "boucle à travers ...") Modifiez le nom de 'algorithme' pour refléter ce qu'il fait (ex. 'planification').

  • Personnellement, je pense que c'est bien de mettre le contenu de «main» directement dans le if __name__ == "__main__"bloc, mais je l'ai vu dans les deux sens.

  • Pour les méthodes output_, envisagez de renvoyer une chaîne et d'imprimer la chaîne en deux étapes. " ".join()peut aider.