Job Scheduling Algorithmus 2

Nov 03 2020

Ich suche Feedback, um die Lesbarkeit des Codes zu verbessern und die Effizienz des Algorithmus zu verbessern. Ich habe bereits eine Frage zur Codeüberprüfung zu diesem Thema gestellt. Das Feedback war hilfreich und ich habe die Datenstrukturen überarbeitet.

Link zur vorherigen Frage: Job Scheduling Algorithm

Infos zu Klassen:

Gegenstand ist der Gegenstand, an dem die Maschinen arbeiten. Maschine ist eine einzelne Maschine, die von der Startzeit bis zur Endzeit verwendet werden kann. Eine einzelne Aufgabe ist ein einzelnes Element auf einer Maschine. Job ist ein vollständiger Job und kann mehr als eine Aufgabe haben.

Der Algorithmus plant die Aufgaben, ordnet sie für die jeweilige Maschine neu an und erhöht den Gesamtgewinn, wenn ein Auftrag innerhalb des Zeitplans abgeschlossen wird.



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() 
 ```

Antworten

1 ZacharyVance Nov 04 2020 at 02:03
  • 'Algorithmus' ist überhaupt nicht korrekt und schlägt zur Laufzeit fehl. Bitte stellen Sie sicher, dass Ihr Code funktioniert, bevor Sie ihn veröffentlichen. startund endwerden nie gelesen. timewird nie definiert. 'row' wird nie definiert - es wird beim zweiten Mal als 'job_row' getippt. Verwenden Sie 'for job in robs', nicht 'for job_row in range(len(jobs))zusammen mit' jobs [job_row] '. Ich würde generell einen Linter empfehlen, der all diese Fehler auffangen sollte.

  • Fügen Sie dem "Algorithmus" einen Dokumentstring hinzu, der beschreibt, was seine Eingaben sind und was er zurückgibt. Stellen Sie sicher, dass Sie beschreiben, was in Bezug auf BEDEUTUNG zurückgegeben wird, und nicht, was der Algorithmus tut. ("Gibt den besten Weg zum Planen zurück ..." und nicht "Schleifen durch ...") Ändern Sie den Namen des 'Algorithmus', um dessen Funktionsweise widerzuspiegeln (z. B. 'Zeitplan').

  • Ich persönlich denke, es ist in Ordnung, den Inhalt von 'main' direkt in den if __name__ == "__main__"Block zu setzen, aber ich habe es in beide Richtungen gesehen.

  • Bei den output_-Methoden sollten Sie eine Zeichenfolge zurückgeben und die Zeichenfolge in zwei Schritten drucken. " ".join()kann helfen.