jármű útvonaltervezési probléma
A **jármű útvonaltervezési probléma (Vehicle Routing Problem, VRP)** egy kombinatorikai optimalizációs probléma, amely célja, hogy meghatározza egy vagy több jármű optimális útvonalát, miközben teljesíti a következő feltételeket:
Az ügyfelek kiszolgálása a legrövidebb összköltséggel, járműkapacitás-korlátokkal.
Minden jármű kapacitása korlátozott, és a szállítandó mennyiség nem haladhatja meg ezt.
Az ügyfelek csak bizonyos időablakokon belül fogadhatják a járművet.
Több indulási raktárból történik a kiszállítás.
A járműveknek nem kell visszatérniük az indulási pontra.
* : Csomópontok (ügyfelek és raktárak). * : Élek (távolságok a csomópontok között).
Minimalizáljuk az összköltséget: ahol , ha az útvonal -ből -be vezet, különben .
* Dinamikus programozás (pl. Bellman-Held-Karp algoritmus). * Integer Linear Programming (ILP).
* Greedy algoritmusok. * Clarke-Wright Savings algoritmus.
* Genetikus algoritmusok (GA). * Szimulált lehűlés (Simulated Annealing). * Hangya kolónia optimalizáció (Ant Colony Optimization, ACO).
Az alábbi kód a Clarke-Wright Savings algoritmus egyszerű implementációját mutatja be a VRP megoldására.
import math
from itertools import permutations
def distance(a, b):
"""Két pont közötti euklideszi távolság."""
return math.sqrt((a - b)**2 + (a - b)**2)
def savings_vrp(customers, depot, capacity, demands):
"""
Clarke-Wright Savings algoritmus a VRP megoldására.
Args:
customers: Az ügyfelek koordinátái .
depot: A raktár koordinátái (x, y).
capacity: A jármű kapacitása.
demands: Az ügyfelek igényei .
Returns:
routes: A járművek optimális útvonalai.
"""
n = len(customers)
# Távolságok számítása
distances = , customers) for j in range(n)] for i in range(n)]
depot_distances = ) for i in range(n)]
# Savings értékek számítása
savings =
for i in range(n):
for j in range(i + 1, n):
savings.append(((i, j), depot_distances + depot_distances - distances))
savings.sort(key=lambda x: x, reverse=True)
# Kezdeti útvonalak (egy ügyfél per jármű)
routes = for i in range(n)]
route_demands = for i in range(n)]
# Savings alkalmazása
for (i, j), _ in savings:
route_i = next((r for r in routes if i in r), None)
route_j = next((r for r in routes if j in r), None)
if route_i != route_j and route_demands + route_demands <= capacity:
# Összekötjük az útvonalakat
routes.remove(route_i)
routes.remove(route_j)
new_route = route_i + route_j
routes.append(new_route)
route_demands.append(route_demands.pop(routes.index(route_i)) + route_demands.pop(routes.index(route_j)))
return routes
# Példa bemenet
customers = # Ügyfél koordináták
depot = (0, 0) # Raktár koordinátái
capacity = 15 # Jármű kapacitása
demands = # Ügyféligények
routes = savings_vrp(customers, depot, capacity, demands)
print("Optimális útvonalak:", routes)
Optimális útvonalak: , ]
Ez azt jelenti, hogy a járművek két útvonalat követnek:
Csomagok szállítása a legrövidebb idő alatt.
Raktári szállítmányozás.
Taxi vagy ridesharing rendszerek útvonalainak optimalizálása.
A jármű útvonaltervezési probléma kulcsfontosságú az optimalizálási problémákban. Az olyan algoritmusok, mint a Clarke-Wright Savings, hatékony megközelítést nyújtanak a probléma heurisztikus megoldására. Nagyobb, komplexebb problémák esetén metaheurisztikus módszerek, például genetikus algoritmusok vagy szimulált lehűlés alkalmazhatók.