Az utazó ügynök problémája (TSP) egy klasszikus kombinatorikai optimalizálási probléma. Egy adott számú városból és a közöttük lévő távolságokból álló gráf esetén az a cél, hogy megtaláljuk az ügynök számára a legrövidebb utat, amely minden várost pontosan egyszer érint, majd visszatér a kiindulási városba.
* Az összes lehetséges útvonal generálása ( permutáció). * Időbonyolultság: .
* Csökkenti a redundáns számításokat.
* Időbonyolultság: .
* Például Nearest Neighbor, Simulated Annealing, Genetic Algorithm. * Nem garantálják az optimális megoldást, de gyorsak.
* Fa alapú keresés, amely kizárja a rossz útvonalakat.
* Általában jobb, mint brute force, de még mindig nem hatékony nagy -re.
A Held-Karp algoritmus a dinamikus programozás segítségével hatékonyabban oldja meg a problémát. Egy állapotfüggvényt definiálunk:
import itertools
def held_karp(graph):
"""
Held-Karp dinamikus programozás algoritmus az Utazó Ügynök Problémára.
Args:
graph: Két dimenziós lista, ahol graph a i és j város közötti távolság.
Returns:
cost: Az optimális út költsége.
path: Az optimális út városainak sorrendje.
"""
n = len(graph)
# Tároló a dinamikus programozás értékeinek
dp = {}
# Alapállapot: csak egy városból indulunk
for i in range(1, n):
dp = (graph, 0) # (költség, előző város)
# Dinamikus programozás
for subset_size in range(2, n):
for subset in itertools.combinations(range(1, n), subset_size):
bits = 0
for bit in subset:
bits |= 1 << bit
for j in subset:
prev_bits = bits & ~(1 << j)
res =
for k in subset:
if k == j:
continue
res.append((dp + graph, k))
dp = min(res)
# Befejezés: visszatérés a kiinduló városba
bits = (2**n - 1) - 1
res =
for k in range(1, n):
res.append((dp + graph, k))
opt, parent = min(res)
# Út rekonstruálása
path =
bits = (2**n - 1) - 1
for _ in range(n - 1):
path.append(parent)
new_bits = bits & ~(1 << parent)
_, parent = dp
bits = new_bits
path.append(0)
path.reverse()
return opt, path
# Példa gráf (távolságok mátrix formában)
graph = [
,
,
,
]
# Megoldás
cost, path = held_karp(graph)
print("Minimális költség:", cost)
print("Optimális út:", path)
Gráf:
A, B, C, D
A-B: 10, A-C: 15, A-D: 20 B-C: 35, B-D: 25 C-D: 30
Kimenet:
Minimális költség: 80 Optimális út:
Ha az optimális megoldás túl költséges (például nagyobb gráfok esetén), a Nearest Neighbor egy gyors heurisztikus alternatíva:
def nearest_neighbor(graph):
n = len(graph)
visited = * n
path =
visited = True
total_cost = 0
current = 0
for _ in range(n - 1):
next_city = None
min_cost = float('inf')
for j in range(n):
if not visited and graph < min_cost:
next_city = j
min_cost = graph
path.append(next_city)
visited = True
total_cost += min_cost
current = next_city
# Visszatérés a kiinduló városba
total_cost += graph
path.append(0)
return total_cost, path
# Példa használata
cost, path = nearest_neighbor(graph)
print("Heurisztikus költség:", cost)
print("Út:", path)