작업 예약 알고리즘 2
코드 가독성을 높이고 알고리즘의 효율성을 높이기위한 피드백을 찾고 있습니다. 나는 이것에 대한 코드 리뷰에 대한 질문을 이미 게시했습니다. 피드백이 도움이되었고 데이터 구조를 다시 생각했습니다.
이전 질문 링크 : Job Scheduling Algorithm
수업 정보 :
항목은 기계가 작업하는 항목입니다. 머신은 시작 시간부터 종료 시간까지 사용할 수있는 단일 머신입니다. 단일 작업은 컴퓨터의 단일 항목입니다. 작업은 완전한 작업이며 둘 이상의 작업을 가질 수 있습니다.
알고리즘은 작업을 예약하고, 특정 기계에 대해 작업을 다시 정렬하고, 작업이 일정 내에서 완료되면 총 수익에 추가됩니다.
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()
```
답변
'algorithm'은 전혀 올바르지 않으며 런타임에 실패합니다. 코드를 게시하기 전에 코드가 작동하는지 확인하십시오.
start그리고end읽어 본 적이있다.time정의되지 않았습니다. 'row'는 정의되지 않습니다. 두 번째로 'job_row'로 오타입니다.range(len(jobs))'jobs [job_row]'와 함께 ' job_row in'이 아니라 'for job in robs'를 사용합니다. 나는 일반적으로 이러한 모든 오류를 잡을 수있는 linter를 권장합니다.입력 내용과 반환 내용을 설명하는 "알고리즘"에 독 스트링을 추가합니다. 알고리즘이 수행하는 작업이 아니라 의미 측면에서 반환되는 내용을 설명해야합니다. ( "루프 스루 ..."가 아니라 "일정에 가장 좋은 방법을 반환합니다 ...") '알고리즘'의 이름을 변경하여 수행하는 작업을 반영합니다 (예 : '스케줄').
개인적으로는 '메인'의 내용을
if __name__ == "__main__"블록에 직접 넣어도 괜찮다고 생각하는데 , 두 가지 방법을 모두 봤습니다.output_ 메서드의 경우 두 단계로 문자열을 반환하고 문자열을 인쇄하는 것을 고려하십시오.
" ".join()도움이 될 수 있습니다.