Hei acolo! În calitate de furnizor de TSP (tripolyfosfat), am fost adesea întrebat despre cum să implementăm algoritmii TSP în Python. Este un subiect destul de fain și sunt încântat să vă împărtășesc cunoștințele cu voi.
Ce este TSP?
În primul rând, să acoperim rapid ceea ce este problema vânzătorului călător (TSP). Imaginează -ți că ești un vânzător care trebuie să viziteze o grămadă de orașe. Vrei să găsești cea mai scurtă rută posibilă care vizitează fiecare oraș exact o dată și apoi se întoarce în orașul de pornire. S -ar putea să pară simplu, dar pe măsură ce numărul de orașe crește, găsirea soluției optime devine un adevărat cap - zgârietor. Acolo intră algoritmii TSP.
De ce Python?
Python este un limbaj minunat pentru implementarea algoritmilor TSP. Este foarte ușor de învățat, are o mulțime de biblioteci disponibile și poate gestiona calcule complexe, fără prea multe probleme. Indiferent dacă sunteți un începător sau un codificator cu experiență, Python face relativ simplu să vă murdăriți mâinile cu algoritmi TSP.
Implementarea abordării naive
Cel mai simplu mod de a rezolva TSP este abordarea naivă. În această metodă, generăm toate permutările posibile ale orașelor și calculăm distanța totală pentru fiecare permutare. Apoi îl alegem doar pe cea mai scurtă distanță.
Iată un simplu fragment de cod Python pentru a ilustra abordarea naivă:
Import iTerTools Def Distanță (City1, City2): # Aici ați calcula distanța reală între două orașe # Pentru simplitate, să presupunem că avem o simplă întoarcere a distanței euclidiene ((City1 [0] - City2 [0]) ** 2+ (City1 [1] - City2 [1]) ** 2) ** 0.5 def tsp_naive (orașe): all_permutations = = LIST (iTErTools.Permutații (orașe)) min_distance = float ('inf') best_route = Niciuna pentru ruta în all_permutații: total_distance = 0 pentru i în intervalul (len (ruta) - 1): total_distance += distanță (ruta [i], ruta [I +1])) Dacă total_distance <min_distance: min_distance = total_distance best_route = ruta return min_distance, best_route # Exemplu de utilizare a orașelor = [(0, 0), (1, 5), (2, 3)] Min_dist, Best_Route = TSP_NAIVE și cel mai bun rul {best_route} ")
Problema cu abordarea naivă este că are o complexitate de timp a O (n!), Unde n este numărul de orașe. Aceasta înseamnă că pe măsură ce numărul de orașe crește, algoritmul devine extrem de lent.


Folosind cel mai apropiat algoritm vecin
Cel mai apropiat algoritm vecin este un algoritm lacom care oferă o soluție rapidă, dar nu întotdeauna optimă. Începe dintr -un oraș aleatoriu și apoi vizitează în mod repetat cel mai apropiat oraș nevisitat până când toate orașele au fost vizitate. În cele din urmă, se întoarce în orașul de pornire.
def tsp_nearest_neighbor (orașe): current_city = orașe [0] unvisited = set (orașe [1:]) rute = [curent_city] în timp ce este nevisitat: cel mai apropiat_city = min (nevisited, cheie = lambda oraș: distanță (curent_city, oraș)) rute.append (cel mai apropiat_citate) unvisite cel mai apropiat_city route.append (orașe [0]) # reveniți la orașul de pornire total_distance = 0 pentru i în intervalul (len (ruta) - 1): total_distance += distanță (ruta [i], ruta [i +1]) return total_distance, ruta # exemplu de utilizare a orașelor = [(0, 0), (1, 5), (2, 3)] Min_dist, cel mai bun TSP_NEAREST_NEIGHBOR (orașe) print (f "Distanța minimă este {min_dist}, iar cea mai bună rută este {best_route}")
Cel mai apropiat algoritm vecin are o complexitate de timp a O (n^2), care este mult mai bună decât abordarea naivă pentru un număr mai mare de orașe. Cu toate acestea, nu oferă întotdeauna soluția optimă.
Abordarea dinamică de programare
Programarea dinamică poate fi utilizată pentru a rezolva TSP mai eficient pentru dimensiuni mai mici ale problemei. Ideea de bază este de a împărți problema în probleme mai mici și de a stoca soluțiile la aceste sub -probleme pentru a evita calculele redundante.
de la FuncTools Import lru_cache @lru_cache (maxsize = none) def tsp_dp (mască, pos, dist_matrix): num_cities = len (dist_matrix) dacă mască == (1 << num_cities) - 1: return Dist_matrix [pos] [0] ans = plutit ('inf') pentru următorul (1 << next_city)) == 0: new_mask = mască | (1 << next_city) new_cost = dist_matrix [pos] [next_city]+tsp_dp (new_mask, next_city, dist_matrix) ans = min (ans, new_cost) return ans # exemplu de utilizare a orașelor = [(0, 0), (1, 5), (2, 3)] dist_matrix = [[distanță (distanță 1), (2, 3)] în oraș orașe] pentru oraș1 în orașe] min_dist = tsp_dp (1, 0, tuple (hartă (tuple, dist_matrix))) print (f "distanța minimă este {min_dist}")
Abordarea dinamică de programare are o complexitate de timp a O (n^2 * 2^n), care este mai bună decât abordarea naivă, dar încă nu este potrivită pentru un număr foarte mare de orașe.
Produsele noastre TSP
În calitate de furnizor de TSP, oferim o serie de produse de înaltă calitate. De exemplu, avemTripolifosfat de sodiu 95% STPP Grad alimente ca agent de retenție de apă. Acest produs este utilizat pe scară largă în industria alimentară ca agent de retenție a apei, contribuind la menținerea alimentelor proaspete și umede.
Avem și noiIngredient alimentar cu fosfat de monopotasiu MKP mono potasiu fosfat. Este un ingredient alimentar important care poate fi utilizat în diverse aplicații alimentare.
Și al nostruCea mai vândută Vânzare Fosfat de Disodium (DSP) Grad NA2HPO4 DSPeste un vânzător de top, cunoscut pentru calitatea și eficacitatea înaltă în procesarea alimentelor.
Înfășurarea
Implementarea algoritmilor TSP în Python poate fi o experiență distractivă și plină de satisfacții. Indiferent dacă utilizați abordarea naivă, cel mai apropiat algoritm vecin sau programare dinamică, fiecare metodă are propriile pro și contra. Pe măsură ce numărul de orașe crește, va trebui să alegeți algoritmul care se potrivește cel mai bine nevoilor dvs. în ceea ce privește complexitatea timpului, cât și optimitatea soluției.
Dacă sunteți interesat de produsele noastre TSP sau aveți întrebări cu privire la algoritmii TSP, nu ezitați să vă adresați. Suntem întotdeauna fericiți să vă ajutăm cu nevoile dvs. legate de TSP și să discutăm despre oportunitățile potențiale de afaceri.
Referințe
- Cormen, TH, Leison, CE, Rivest, RL, & Stein, C. (2009). Introducere în algoritmi. Cu presă.
- Skiena, SS (2020). Manualul de proiectare algoritm. Springer.
