Problema con funzione Python e chiarimento deepcopy

Kimura23!

Nuovo Utente
1
0
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?
 

BigIssue

Utente Attivo
221
18
CPU
intel dual core n3050
Scheda Madre
asus x540s
RAM
4gb
GPU
intel HD
OS
Windows 10
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:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!