작업 예약 알고리즘 2

Nov 03 2020

코드 가독성을 높이고 알고리즘의 효율성을 높이기위한 피드백을 찾고 있습니다. 나는 이것에 대한 코드 리뷰에 대한 질문을 이미 게시했습니다. 피드백이 도움이되었고 데이터 구조를 다시 생각했습니다.

이전 질문 링크 : 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() 
 ```

답변

1 ZacharyVance Nov 04 2020 at 02:03
  • '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()도움이 될 수 있습니다.