Algoritmo de programación de trabajos 2

Nov 03 2020

Estoy buscando comentarios para mejorar la legibilidad del código y mejorar la eficiencia del algoritmo. Ya publiqué una pregunta sobre la revisión del código sobre esto. Los comentarios fueron útiles y reconsideré las estructuras de datos.

Enlace a la pregunta anterior: Algoritmo de programación de trabajos

Información sobre clases:

El artículo es el artículo en el que funcionan las máquinas. La máquina es una sola máquina que se puede utilizar desde el inicio hasta el final. Una sola tarea es un solo elemento en una máquina. El trabajo es un trabajo completo y puede tener más de una tarea.

El algoritmo programa las tareas, las reordena para la máquina específica y se suma al beneficio total si un trabajo se termina dentro del programa.



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

Respuestas

1 ZacharyVance Nov 04 2020 at 02:03
  • 'algoritmo' no es correcto en absoluto y fallará en tiempo de ejecución. asegúrese de que su código funcione antes de publicarlo. starty endnunca se leen. timenunca se define. 'row' nunca se define; es un error tipográfico como 'job_row' la segunda vez. use 'for job in robs', no 'for job_row in range(len(jobs))junto con' jobs [job_row] '. En general, recomendaría un linter, que debería detectar todos estos errores.

  • Agrega una cadena de documentación a "algoritmo", describiendo cuáles son sus entradas y qué devuelve. Asegúrese de describir lo que devuelve en términos de SIGNIFICADO y no lo que hace el algoritmo. ("devuelve la mejor manera de programar ..." y no "recorre ...") Cambie el nombre de 'algoritmo' para reflejar lo que hace (por ejemplo, 'programación').

  • Personalmente, creo que está bien poner el contenido de 'principal' directamente en el if __name__ == "__main__"bloque, pero lo he visto en ambos sentidos.

  • Para los métodos output_, considere devolver una cadena e imprimir la cadena en dos pasos. " ".join()puede ayudar.