Python版本代码
import numpy
import random
num_cities = 5
num_ants = 10
num_iterations = 100
alpha = 1.0
beta = 5.0
evaporation_rate = 0.5
Q = 100
numpy.random.seed(42)
distance_matrix = numpy.random.randint(1, 100, size=(num_cities, num_cities))
distance_matrix = (distance_matrix + distance_matrix.T) / 2
numpy.fill_diagonal(distance_matrix, 0)
pheromone_matrix = numpy.ones((num_cities, num_cities))
heuristic_matrix = 1 / (distance_matrix + numpy.diag([numpy.inf] * num_cities))
class Ant:
def __init__(self, num_cities : int):
self.num_cities = num_cities
self.visited = []
self.total_distance = 0.0
self.current_city = random.randint(0, self.num_cities - 1)
self.visited.append(self.current_city)
def visit_city(self, city : int, distance : float) -> None:
self.total_distance += distance
self.current_city = city
self.visited.append(city)
def tour_length(self, distance_matrix : numpy.ndarray) -> float:
return sum(distance_matrix[self.visited[i], self.visited[i + 1]] for i in range(len(self.visited) - 1)) + distance_matrix[self.visited[-1], self.visited[0]]
def aco_tsp(
distance_matrix : numpy.ndarray,
num_ants : int,
num_iterations : int,
alpha : float,
beta : float,
evaporation_rate : float,
Q : float
) -> tuple:
num_cities = distance_matrix.shape[0]
pheromone_matrix = numpy.ones((num_cities, num_cities))
best_tour = None
best_tour_length = float('inf')
for _ in range(num_iterations):
ants = [Ant(num_cities) for _ in range(num_ants)]
for ant in ants:
for _ in range(num_cities - 1):
current_city = ant.current_city
probabilities = []
for next_city in range(num_cities):
if next_city not in ant.visited:
pheromone = pheromone_matrix[current_city, next_city] ** alpha
heuristic = heuristic_matrix[current_city, next_city] ** beta
probabilities.append(pheromone * heuristic)
else:
probabilities.append(0.0)
probabilities = numpy.array(probabilities)
if probabilities.sum() > 0:
probabilities /= probabilities.sum()
next_city = numpy.random.choice(range(num_cities), p=probabilities)
else:
next_city = random.choice([city for city in range(num_cities) if city not in ant.visited])
ant.visit_city(next_city, distance_matrix[current_city, next_city])
ant.visit_city(ant.visited[0], distance_matrix[ant.current_city, ant.visited[0]])
tour_length = ant.tour_length(distance_matrix)
if tour_length < best_tour_length:
best_tour_length = tour_length
best_tour = ant.visited.copy()
pheromone_matrix *= (1 - evaporation_rate)
for ant in ants:
for i in range(num_cities - 1):
pheromone_matrix[ant.visited[i], ant.visited[i + 1]] += Q / ant.tour_length(distance_matrix)
pheromone_matrix[ant.visited[-1], ant.visited[0]] += Q / ant.tour_length(distance_matrix)
return best_tour, best_tour_length
best_tour, best_tour_length = aco_tsp(distance_matrix, num_ants, num_iterations, alpha, beta, evaporation_rate, Q)
print("城市距离", distance_matrix)
print(f"Best tour: {best_tour}")
print(f"Best tour length: {best_tour_length}")
"""
城市距离
[[ 0. 57. 51.5 37. 62.5]
[57. 0. 55.5 81.5 67.5]
[51.5 55.5 0. 26. 37. ]
[37. 81.5 26. 0. 17.5]
[62.5 67.5 37. 17.5 0. ]]
Best tour: [1, 2, 4, 3, 0, 1]
Best tour length: 204.0
"""