Algoritmo de programação de trabalho 2

Nov 03 2020

Estou procurando feedback para melhorar a legibilidade do código e melhorar a eficiência do algoritmo. Eu já postei uma pergunta na revisão de código sobre isso. O feedback foi útil e repensei as estruturas de dados.

Link para a pergunta anterior: Algoritmo de programação de trabalho

Informações sobre as aulas:

Item é o item em que as máquinas trabalham. Máquina é uma única máquina que pode ser usada desde o horário de início até o horário de término. Uma única tarefa é um único item em uma máquina. O trabalho é um trabalho completo e pode ter mais de uma tarefa.

O algoritmo agenda as tarefas, reordena-as para a máquina específica e adiciona ao lucro total se o trabalho for concluído dentro do cronograma.



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

Respostas

1 ZacharyVance Nov 04 2020 at 02:03
  • 'algoritmo' não está correto e falhará em tempo de execução. certifique-se de que seu código funciona antes de publicá-lo. starte endnunca são lidos. timenunca é definido. 'linha' nunca é definida - é digitado como 'job_row' pela segunda vez. use 'for job in robs', não 'for job_row in range(len(jobs))junto com' jobs [job_row] '. Em geral, eu recomendaria um linter, que detecta todos esses erros.

  • Adicione uma docstring ao "algoritmo", descrevendo quais são suas entradas e o que ele retorna. Certifique-se de descrever o que retorna em termos de SIGNIFICADO, e não o que o algoritmo faz. ("retorna a melhor maneira de agendar ..." e não "loops through ...") Altere o nome de 'algoritmo' para refletir o que ele faz (por exemplo, 'agendamento').

  • Pessoalmente, acho que não há problema em colocar o conteúdo de 'principal' diretamente no if __name__ == "__main__"bloco, mas vi das duas maneiras.

  • Para os métodos output_, considere retornar uma string e imprimi-la em duas etapas. " ".join()pode ajudar.