Hé! TSP -ként (tripolyfoszfát) szállítóként gyakran kérdezem, hogyan lehet a Pythonban a TSP algoritmusokat megvalósítani. Ez egy nagyon jó téma, és arra törekszem, hogy megosszam veled a tudásomat.
Mi a teáskanál?
Először is, gyorsan fedezzük fel az utazó eladói problémát (TSP). Képzelje el, hogy eladó vagy, akinek meg kell látogatnia egy csomó várost. Meg akarja találni a lehető legrövidebb utat, amely pontosan egyszer meglátogatja az egyes várost, majd visszatér a kezdő városba. Lehet, hogy egyszerűnek hangzik, de a városok számának növekedésével az optimális megoldás megtalálása valódi fejré válik. Itt jönnek be a TSP algoritmusok.
Miért Python?
A Python egy fantasztikus nyelv a tesp algoritmusok megvalósításához. Szuper könnyű megtanulni, rengeteg könyvtár van elérhető, és túl sok gond nélkül képes kezelni az összetett számításokat. Függetlenül attól, hogy kezdő vagy tapasztalt kódoló, a Python viszonylag egyértelművé teszi, hogy a kezed piszkos legyen a TSP algoritmusokkal.
A naiv megközelítés végrehajtása
A TSP megoldásának legegyszerűbb módja a naiv megközelítés. Ebben a módszerben a városok minden lehetséges permutációját generáljuk, és kiszámoljuk az egyes permutáció teljes távolságát. Akkor csak a legrövidebb távolsággal választjuk ki azt.
Íme egy egyszerű Python -kódrészlet, amely szemlélteti a naiv megközelítést:
Import Itertools def távolság (City1, City2): # Itt kiszámítja a két város közötti tényleges távolságot # Az egyszerűség kedvéért feltételezzük, hogy egyszerű euklideai távolság -visszatérésünk van ((City1 [0] - City2 [0]) ** 2+ (City1 [1] - City2 [1]) ** 2) ** 0.5 Def TSP_NAVE (Cities): All_perMutations = All_perMutations = Lista (Itertools.permutations (városok)) Min_distance = float ('inf') best_route = nincs úthoz az all_permutations -ban: total_distance = 0 az i tartományban (len (útvonal) - 1): total_distance += távolság (út [i +1]) Total_distance += távolság (út [-1], út [0]) <Min_distance: min_distance = total_distance best_route = útvonal visszatérés Min_distance, best_route # példahasználati városok =
A naiv megközelítés problémája az, hogy az O (N!) Időbonyolultsága, ahol n a városok száma. Ez azt jelenti, hogy a városok számának növekedésével az algoritmus rendkívül lassúvá válik.


A legközelebbi szomszéd algoritmus használata
A legközelebbi szomszéd algoritmus egy kapzsi algoritmus, amely gyors, de nem mindig optimális megoldást kínál. Egy véletlenszerű városban kezdődik, majd többször meglátogatja a legközelebbi, nem látható várost, amíg minden város meglátogatásra kerül. Végül visszatér a kezdő városba.
DEF TSP_Nearest_Neighbor (városok): current_city = városok [0] Unvisited = Set (városok [1:]) útvonal = [current_city], míg nem látható: legközelebbi_city = min (nem látható, key = lambda város: távolság (current_city, city) útvonal) rute.append (nosed_city) Unvisited.remove.Remove (legközelebbi_city) route.Append (városok [0]) # Visszatérés a kiindulási városba Total_distance = 0 az i tartományban (len (útvonal) - 1): total_distance += távolság (út [i], út [i +1]) return total_distance, útvonal # példa használati városok = nyomtatás (f "A minimális távolság {min_dist}, és a legjobb út a {best_route}")
A legközelebbi szomszéd algoritmusnak az O (N^2) időbeli összetettsége van, amely sokkal jobb, mint a nagyobb számú város naiv megközelítése. Ez azonban nem mindig adja meg az optimális megoldást.
A dinamikus programozási megközelítés
A dinamikus programozás felhasználható a TSP hatékonyabb megoldására a kisebb problémaméreteknél. Az alapvető ötlet az, hogy a problémát kisebb részekre bontjuk, és tárolják az ezekre az alproblémákra vonatkozó megoldásokat, hogy elkerüljék a redundáns számításokat.
A Functools -ból importálva lru_cache @lru_cache (maxsize = nincs) def tsp_dp (maszk, pos, dist_matrix): num_cities = len (dist_matrix), ha maszk == (1 << num_cities) - 1: return dist_matrix [pos] [0] ans = float ('inf') a következő tartományban (num_citive) (num_citás): (1 <<<<<<<<<<<<<<<city) (num_citivitások): (1 <<<<<<<<<<<<<<city) (num_citás): next_city)) == 0: new_mask = maszk | (1 << Next_City) new_cost = dist_matrix [pos] [next_city]+tsp_dp (new_mask, next_city, dist_matrix) ans = min = min (Ans, new_cost) return ans # példa felhasználási városok = City1 a városokban] min_dist = tsp_dp (1, 0, tuple (térkép (tuple, dist_matrix))) print (f "A minimális távolság {min_dist}")
A dinamikus programozási megközelítésnek az O (n^2 * 2^n) idő bonyolultsága, amely jobb, mint a naiv megközelítés, de még mindig nem alkalmas nagyon sok város számára.
TSP termékeink
TSP beszállítóként számos magas színvonalú terméket kínálunk. Például vanNátrium -tripolyfoszfát 95% STPP élelmiszer -minőségű víztartási szerként- Ezt a terméket széles körben használják az élelmiszeriparban vízmegtartóként, segítve az ételek friss és nedves tartását.
Nekünk is vanMonopotasszium -foszfát élelmiszer -összetevő MKP mono kálium -foszfát- Ez egy fontos élelmiszer -összetevő, amelyet különféle élelmiszer -alkalmazásokban lehet felhasználni.
És a miA legkeresettebb dinátrium -foszfát (DSP) élelmiszer -minőségű Na2HPO4 DSPegy felső - eladó, amely ismert az élelmiszer -feldolgozás kiváló minőségéről és hatékonyságáról.
Csomagolás
A Python -ban a Tesp algoritmusok megvalósítása szórakoztató és kifizetődő élmény lehet. Függetlenül attól, hogy a naiv megközelítést, a legközelebbi szomszéd algoritmust vagy a dinamikus programozást használja, minden módszernek megvan a maga előnyei és hátrányai. Ahogy a városok száma növekszik, ki kell választania azt az algoritmust, amely a legjobban megfelel az Ön igényeinek, mind az idő bonyolultsága, mind a megoldás optimalitása szempontjából.
Ha érdekli a TSP termékeink, vagy bármilyen kérdése van a TSP algoritmusokkal kapcsolatban, nyugodtan lépjen fel. Mindig örülünk, hogy segítünk a textimális igényeiben - és megvitatjuk a lehetséges üzleti lehetőségeket.
Referenciák
- Cormen, TH, Leison, CE, Rivest, RL és Stein, C. (2009). Bevezetés az algoritmusokba. Sajtóval.
- Skiena, SS (2020). Az algoritmus tervezési kézikönyve. Springer.
