072. 编写一个函数,实现简单的蚁群算法
072. 编写一个函数,实现简单的蚁群算法
蚁群算法(Ant Colony Optimization, ACO)是一种模拟蚂蚁觅食行为的优化算法,常用于解决组合优化问题,如旅行商问题(TSP)。
示例
假设我们有一个旅行商问题(TSP),需要找到访问多个城市并返回起点的最短路径。
蚁群算法的基本步骤
- 初始化:初始化信息素浓度。
- 蚂蚁移动:每只蚂蚁根据信息素浓度选择路径。
- 更新信息素:根据蚂蚁走过的路径更新信息素浓度。
- 迭代:重复上述步骤,直到满足终止条件(如达到最大迭代次数)。
代码
import numpy as np
import random
# 计算城市之间的距离矩阵
def calculate_distance_matrix(cities):
num_cities = len(cities)
distance_matrix = np.zeros((num_cities, num_cities))
for i in range(num_cities):
for j in range(i + 1, num_cities):
distance = np.linalg.norm(cities[i] - cities[j])
distance_matrix[i][j] = distance
distance_matrix[j][i] = distance
return distance_matrix
# 蚁群算法
def ant_colony_optimization(cities, num_ants, num_iterations, decay, alpha=1, beta=2):
"""
蚁群算法解决 TSP 问题
:param cities: 城市坐标列表
:param num_ants: 蚂蚁数量
:param num_iterations: 迭代次数
:param decay: 信息素衰减率
:param alpha: 信息素重要性参数
:param beta: 启发式信息重要性参数
:return: 最短路径和路径长度
"""
num_cities = len(cities)
distance_matrix = calculate_distance_matrix(cities)
pheromone_matrix = np.ones((num_cities, num_cities))
best_path = None
best_path_length = float('inf')
for iteration in range(num_iterations):
all_paths = []
all_path_lengths = []
for ant in range(num_ants):
path = [random.randint(0, num_cities - 1)] # 随机选择起始城市
visited = set(path)
while len(visited) < num_cities:
current_city = path[-1]
probabilities = np.zeros(num_cities)
for next_city in range(num_cities):
if next_city not in visited:
probabilities[next_city] = (pheromone_matrix[current_city][next_city] ** alpha) * \
((1.0 / distance_matrix[current_city][next_city]) ** beta)
probabilities /= np.sum(probabilities)
next_city = np.random.choice(range(num_cities), p=probabilities)
path.append(next_city)
visited.add(next_city)
path_length = sum(distance_matrix[path[i]][path[i + 1