İş Planlama Algoritması 2
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
'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.
startveendasla 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.