İş Planlama Algoritması 2

Nov 03 2020

Kod okunabilirliğini iyileştirmek ve algoritmanın verimliliğini artırmak için geri bildirim arıyorum. Bununla ilgili kod incelemesi üzerine zaten bir soru yayınladım. Geri bildirim yardımcı oldu ve veri yapılarını yeniden düşündüm.

Önceki soruya bağlantı: İş Planlama Algoritması

Sınıflar hakkında bilgi:

Öğe, makinelerin üzerinde çalıştığı öğedir. Makine, başlangıç ​​zamanından bitiş zamanına kadar kullanılabilen tek bir makinedir. Tek bir görev, bir makinedeki tek bir öğedir. İş tam bir iştir ve birden fazla görevi olabilir.

Algoritma, görevleri planlar, belirli makine için yeniden sıralar ve işin program dahilinde tamamlanmasıyla toplam kâra ekler.



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

Yanıtlar

1 ZacharyVance Nov 04 2020 at 02:03
  • 'algoritma' hiç doğru değil ve çalışma zamanında başarısız olacak. lütfen göndermeden önce kodunuzun çalıştığından emin olun. startve endasla okunmaz. timeasla tanımlanmaz. 'satır' asla tanımlanmaz - ikinci kez 'job_row' olarak yazım hatası olur. "soygunculardaki iş için" kullanın, "iş ilanları range(len(jobs))[job_row]" ile birlikte job_row için değil Genelde tüm bu hataları yakalaması gereken bir linter öneririm.

  • "Algoritma" ya girdilerinin ne olduğunu ve neyi döndürdüğünü açıklayan bir docstring ekleyin. Algoritmanın ne yaptığını değil, ANLAMI açısından neyi döndürdüğünü açıkladığınızdan emin olun. ("programlamanın en iyi yolunu döndürür ..." ve "döngüler ..." değil) "Algoritma" nın adını, ne yaptığını yansıtacak şekilde değiştirin (ör. "program").

  • Kişisel olarak 'main' içeriğini doğrudan if __name__ == "__main__"bloğa koymanın iyi olduğunu düşünüyorum , ancak her iki şekilde de gördüm.

  • Çıktı_ yöntemleri için, bir dizge döndürmeyi ve dizeyi iki adımda yazdırmayı düşünün. " ".join()yardımcı olabilir.