详细信息
详情
详情
详情
详情
详情
初始化信息素: 为所有可能路径设置初始信息素浓度
构造解: 每只蚂蚁根据概率选择路径构造完整解
更新信息素: 根据构造的解调整信息素浓度
迭代: 重复构造解和更新信息素的过程
终止条件: 达到最大迭代次数或找到满意的解
开始
初始化信息素
构造解
所有蚂蚁都构造完解了吗?
更新信息素
达到终止条件了吗?
结束

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
"""