Problema con funzione Python e chiarimento deepcopy

Pubblicità

Kimura23!

Nuovo Utente
Messaggi
1
Reazioni
0
Punteggio
2
Salve a tutti ragazzi vi spiego quale è il mio problema.
Ho la seguente funzione in python che funziona:

Python:
def optimization(task_list, speed): 

    number_of_iterations = 500
    #print("Original distance: ", compute_travel_distance(task_list, speed))

    if len(task_list) < 2:
        return task_list

    for i in range(number_of_iterations):
        task_list_old = copy.deepcopy(task_list)
        
        total_distance = compute_travel_distance(task_list, speed)
 
        index1 = random.randint(0, len(task_list) - 1)
        index2 = random.randint(0, len(task_list) - 1)
        while index1 == index2:
            index1= random.randint(0, len(task_list) - 1)
            index2= random.randint(0, len(task_list) - 1)
        swap_and_prepare(task_list, index1, index2)

        task_list = calculate_solution(task_list, travel_time_matrix)#creo la soluzione

        result1 = verify_solution_time(task_list)
        
        result2 = verify_solution_pd(task_list)

        if result1 != None or result2 != None:
            task_list = task_list_old
        else:
            new_total_distance = compute_travel_distance(task_list, speed)#vedo la distanza della nuova soluzione
  
            if new_total_distance >= total_distance:
                task_list = task_list_old

    total_distance = compute_travel_distance(task_list, speed)
    #print("Optimized distance:", total_distance)
    return task_list


E' una funzione che fa delle prove random su una lista di task per ottimizzare la distanza tra un task e l'altro per trovare una soluzione migliore ovvero con distanza minore.
Il problema è che è molto lenta in quanto utilizza il deepcopy per creare una lista d'appoggio su cui confrontare.
Vorrei provare a fare un confronto diciamo sul posto e in caso non trovo una soluzione migliore allora riscambio i task e in teoria tornare a quella originale. Purtroppo ogni mio tentativo è stato vano in quanto il probgramma da risultati inconcludenti.
C'è un modo per fare la stessa cosa senza deepcopy?
 
La deepcopy crea di fatto un variabile copia dell'oggetto a differenza di un normale assegnamento che nel caso di dizionario é un riferimenti all oggetto. Perciò se modifichi oggetto copiato, quello originale non cambierà. Se invece non usi la deep copy e modifichi la variabile assegnata anche quella originale subisce la modifica. Secondo me é lenta ma perché lavori sempre sulla lista di task invece che passare due task singole. Ma sei sicuri che utilizzi task_list_old nelle varie funzioni?
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top