- A hangyák feromont hagynak maguk után az általuk használt útvonalakon. - A rövidebb utak több feromont gyűjtenek össze, mert gyakrabban használják őket.
- A hangyák nem determinisztikusan, hanem valószínűségi alapon választják meg az útvonalakat, előnyben részesítve a magasabb feromontartalmú utakat.
- Az idő múlásával a feromonok párolognak, elkerülve az állandó megrekedést egy helyi optimumon.
- A hangyák véletlenszerűen helyezkednek el az útvonalhálózat pontjain.
- Minden hangya egy-egy teljes megoldást épít (pl. egy teljes útvonalat az **Utazó Ügynök Problémában**).
- A feromonszintek frissítése a következő képlet szerint történik: ahol: * : A \(i\)-ből \(j\)-be vezető út feromonértéke. * : A párolgási arány (\(0 < \rho < 1\)). * : Az \(k\)-adik hangya által adott feromonmennyiség, amely arányos az útvonal minőségével.
- A hangyák új körben ismét építik a megoldásokat, az aktuális feromonszintek alapján.
- Az algoritmus addig fut, amíg el nem ér egy előre meghatározott iterációszámot vagy elégséges minőségű megoldást nem talál.
A cél: Minimális össztávolságot kell megtalálni, miközben minden várost pontosan egyszer látogatunk meg.
import numpy as np
import random
class AntColonyOptimizer:
def __init__(self, distances, n_ants, n_iterations, decay, alpha=1, beta=2):
self.distances = distances
self.pheromones = np.ones(self.distances.shape) / len(distances)
self.n_ants = n_ants
self.n_iterations = n_iterations
self.decay = decay
self.alpha = alpha
self.beta = beta
self.all_indices = range(len(distances))
def _select_next_city(self, current_city, visited):
probabilities =
for city in self.all_indices:
if city not in visited:
pheromone = self.pheromones ** self.alpha
heuristic = (1 / self.distances) ** self.beta
probabilities.append(pheromone * heuristic)
else:
probabilities.append(0)
probabilities = probabilities / np.sum(probabilities)
return np.random.choice(self.all_indices, p=probabilities)
def _update_pheromones(self, all_routes, all_distances):
self.pheromones *= (1 - self.decay)
for route, distance in zip(all_routes, all_distances):
for i in range(len(route) - 1):
self.pheromones]] += 1.0 / distance
def optimize(self):
best_distance = float("inf")
best_route = None
for _ in range(self.n_iterations):
all_routes =
all_distances =
for _ in range(self.n_ants):
route =
visited = set(route)
while len(route) < len(self.distances):
next_city = self._select_next_city(route, visited)
route.append(next_city)
visited.add(next_city)
route.append(route) # visszatérés a kezdő városba
all_routes.append(route)
distance = sum(self.distances]] for i in range(len(route) - 1))
all_distances.append(distance)
if distance < best_distance:
best_distance = distance
best_route = route
self._update_pheromones(all_routes, all_distances)
return best_route, best_distance
# Példa: TSP
distances = np.array([
,
,
,
])
optimizer = AntColonyOptimizer(distances, n_ants=5, n_iterations=100, decay=0.1)
best_route, best_distance = optimizer.optimize()
print("Legjobb útvonal:", best_route)
print("Legjobb távolság:", best_distance)
Adott távolságmátrix mellett:
Legjobb útvonal: Legjobb távolság: 11
- Jármű útvonaltervezési probléma (VRP).
- Adathálózatok optimalizálása.
- Kombinatorikus problémák optimalizálása.
A **Hangya Kolónia Optimalizáció** hatékony metaheurisztikus algoritmus, amely különösen jól alkalmazható hálózati és kombinatorikus problémák megoldására. Pythonban egyszerűen implementálható, és széles körben alkalmazható valós problémákra, például az utazó ügynök probléma vagy a jármű útvonaltervezés területén.