基于蚁群算法的旅行商问题求解

1. 问题背景

旅行商问题(TSP)是一个经典的组合优化问题,其目标是找到一条经过所有城市且总路径最短的闭合回路。TSP问题在物流配送、路径规划等领域有广泛应用,但其计算复杂度较高(NP难问题)。蚁群算法(Ant Colony Optimization, ACO)是一种模拟蚂蚁觅食行为的启发式算法,通过模拟蚂蚁释放的信息素和路径选择机制,能够有效解决TSP问题。

2. 参数设置

  • 城市数量:100个城市,随机生成坐标。
  • 蚂蚁数量:50只。
  • 迭代次数:100次。
  • 信息素重要性因子(α):1.0。
  • 启发式因子重要性(β):5.0。
  • 信息素蒸发率(ρ):0.5。
  • 信息素沉积量(Q):100.0。

3. 源码实现

以下是基于蚁群算法的TSP问题求解代码:

import numpy as np
import matplotlib.pyplot as plt

# 生成100个城市的坐标
num_cities = 100
cities = np.random.rand(num_cities, 2)

# 输出每个城市的坐标,并标注起点和终点
for i, (x, y) in enumerate(cities):
    if i == 0:
        label = " (Start)"
    elif i == num_cities - 1:
        label = " (End)"
    else:
        label = ""
    print(f"City {i}: ({x:.4f}, {y:.4f}){label}")

# 计算城市间的距离矩阵
distances = np.sqrt((np.square(cities[:, np.newaxis] - cities).sum(axis=2)))

# 参数设置
num_ants = 50
num_iterations = 100
alpha = 1.0
beta = 5.0
evaporation_rate = 0.5
pheromone_deposit = 100.0

# 初始化信息素矩阵
pheromones = np.ones((num_cities, num_cities))

# 计算启发因子
heuristic = 1.0 / (distances + np.diag([np.inf] * num_cities))

# 运行蚁群算法
best_route = None
best_distance = np.inf

for iteration in range(num_iterations):
    all_routes = []
    all_distances = []

    for ant in range(num_ants):
        route = [np.random.randint(num_cities)]
        while len(route) < num_cities:
            current_city = route[-1]
            probabilities = (pheromones[current_city] ** alpha) * (heuristic[current_city] ** beta)
            probabilities[route] = 0
            probabilities /= probabilities.sum()
            next_city = np.random.choice(range(num_cities), p=probabilities)
            route.append(next_city)

        route_distance = sum(distances[route[i], route[i + 1]] for i in range(num_cities - 1))
        route_distance += distances[route[-1], route[0]]

        all_routes.append(route)
        all_distances.append(route_distance)

        if route_distance < best_distance:
            best_route = route
            best_distance = route_distance

    # 更新信息素矩阵
    pheromones *= (1 - evaporation_rate)
    for route, route_distance in zip(all_routes, all_distances):
        for i in range(num_cities - 1):
            pheromones[route[i], route[i + 1]] += pheromone_deposit / route_distance
        pheromones[route[-1], route[0]] += pheromone_deposit / route_distance

print(f"Best distance: {best_distance}")

# 绘制最优路径
best_route = np.array(best_route)
plt.plot(cities[best_route, 0], cities[best_route, 1], 'o-', label='Best Route')
plt.plot([cities[best_route[-1], 0], cities[best_route[0], 0]],
         [cities[best_route[-1], 1], cities[best_route[0], 1]], 'o-')
plt.scatter(cities[:, 0], cities[:, 1], c='blue', label='Cities')  # 改成蓝色

# 标注起点和终点
plt.scatter(cities[best_route[0], 0], cities[best_route[0], 1], c='blue', label='Start', s=100)
plt.scatter(cities[best_route[-1], 0], cities[best_route[-1], 1], c='green', label='End', s=100)

plt.title('Optimal Path Visualization')
plt.xlabel('City X Coordinate', fontsize=14)
plt.ylabel('City Y Coordinate', fontsize=14)
plt.legend(loc='upper right', fontsize=12)
plt.show()
 

下面是输出结果

City 0: (0.1122, 0.7981) (Start)

City 1: (0.2056, 0.8990)

City 2: (0.6975, 0.3247)

City 3: (0.3061, 0.1917)

City 4: (0.8529, 0.9116)

City 5: (0.4925, 0.9412)

City 6: (0.4614, 0.4231)

City 7: (0.1702, 0.7414)

City 8: (0.3610, 0.1873)

City 9: (0.4758, 0.5444)

City 10: (0.0004, 0.3330)

City 11: (0.3993, 0.7716)

City 12: (0.4492, 0.4159)

City 13: (0.7459, 0.2596)

City 14: (0.9269, 0.0593)

City 15: (0.0215, 0.9975)

City 16: (0.9236, 0.9516)

City 17: (0.1903, 0.8639)

City 18: (0.2034, 0.7617)

City 19: (0.1750, 0.5135)

City 20: (0.3468, 0.5498)

City 21: (0.7340, 0.1638)

City 22: (0.3352, 0.4008)

City 23: (0.8605, 0.9103)

City 24: (0.5427, 0.6665)

City 25: (0.0278, 0.2861)

City 26: (0.9519, 0.1721)

City 27: (0.8447, 0.7933)

City 28: (0.8607, 0.3093)

City 29: (0.6562, 0.7841)

City 30: (0.9211, 0.2186)

City 31: (0.0732, 0.2370)

City 32: (0.4225, 0.3810)

City 33: (0.1694, 0.1891)

City 34: (0.7370, 0.6765)

City 35: (0.3257, 0.6755)

City 36: (0.2129, 0.1942)

City 37: (0.5761, 0.1546)

City 38: (0.9134, 0.7144)

City 39: (0.5962, 0.7474)

City 40: (0.3299, 0.2749)

City 41: (0.9982, 0.1223)

City 42: (0.9876, 0.1642)

City 43: (0.2666, 0.3764)

City 44: (0.8405, 0.8895)

City 45: (0.6240, 0.4120)

City 46: (0.3933, 0.3548)

City 47: (0.7933, 0.6259)

City 48: (0.2444, 0.7014)

City 49: (0.0460, 0.8852)

City 50: (0.3037, 0.8128)

City 51: (0.7841, 0.2619)

City 52: (0.3885, 0.1813)

City 53: (0.7546, 0.1838)

City 54: (0.0463, 0.7548)

City 55: (0.0635, 0.1818)

City 56: (0.1898, 0.0517)

City 57: (0.3824, 0.3352)

City 58: (0.9644, 0.9722)

City 59: (0.9771, 0.8944)

City 60: (0.1632, 0.4261)

City 61: (0.6376, 0.3804)

City 62: (0.0648, 0.9967)

City 63: (0.6072, 0.1792)

City 64: (0.6779, 0.8542)

City 65: (0.0728, 0.7682)

City 66: (0.4505, 0.1476)

City 67: (0.8522, 0.0561)

City 68: (0.2375, 0.5662)

City 69: (0.6444, 0.4567)

City 70: (0.6460, 0.6212)

City 71: (0.0059, 0.6246)

City 72: (0.2407, 0.9616)

City 73: (0.2858, 0.9822)

City 74: (0.6711, 0.8642)

City 75: (0.8425, 0.9093)

City 76: (0.7950, 0.3890)

City 77: (0.9269, 0.0846)

City 78: (0.2970, 0.2386)

City 79: (0.2620, 0.8536)

City 80: (0.3576, 0.4229)

City 81: (0.8877, 0.0912)

City 82: (0.5225, 0.8196)

City 83: (0.6690, 0.5138)

City 84: (0.9204, 0.0835)

City 85: (0.6687, 0.5881)

City 86: (0.0495, 0.3208)

City 87: (0.6959, 0.1450)

City 88: (0.3282, 0.8915)

City 89: (0.7032, 0.3819)

City 90: (0.3340, 0.6846)

City 91: (0.2727, 0.2689)

City 92: (0.9610, 0.3587)

City 93: (0.4678, 0.3104)

City 94: (0.7558, 0.0874)

City 95: (0.2538, 0.8581)

City 96: (0.1405, 0.2405)

City 97: (0.9705, 0.2933)

City 98: (0.6890, 0.1896)

City 99: (0.1141, 0.3459) (End)

Best distance: 8.317821654093898

 

输出图解释: 每个点代表一个城市,其中深蓝色外边的点是起始点,绿色外边的点是终点,点和点每条边表示最短路径经过的路径,其中橙色的边表示最后从终点走回起点的路径

4. 改进策略

为了提高蚁群算法的效率和效果,设计了以下改进策略:

  1. 局部更新策略(Local Update)
    • 在蚂蚁选择路径时,动态调整信息素矩阵,避免过早收敛到局部最优解。
    • 在每次蚂蚁选择路径时,根据当前路径的质量动态更新信息素。
  2. 路径选择多样性
    • 通过增加随机因子,使蚂蚁在路径选择时有一定的随机性,避免群体行为过于趋同。
    • 为每只蚂蚁分配一个不同的随机因子,增强探索能力。
  3. 启发式因子调整
    • 根据实验调整启发式因子β的值,使其在探索和利用之间取得平衡。
    • 较大的β值会增加蚂蚁对距离的敏感性,较小的β值则更依赖信息素。

5. 实验结果与分析

  • 实验结果

        最优路径长度:约 8.8(具体值取决于随机生成的城市坐标)。

        收敛速度:在100次迭代内找到较优解。

  • 改进效果分析

        局部更新策略:通过动态调整信息素,算法能够更快地找到优质路径。

        路径选择多样性:随机因子的引入显著提高了算法的全局搜索能力,避免了局部最优。

       启发式因子调整:通过实验发现,β值设置为5.0时,在探索和利用之间取得了较好的平衡。

6. 总结

通过改进的蚁群算法,成功解决了100个城市的TSP问题。改进策略显著提高了算法的收敛速度和解的质量,验证了蚁群算法在解决复杂组合优化问题中的有效性。未来可以进一步优化参数设置,探索其他改进策略(如自适应参数调整、多群体协作等),以进一步提升算法性能。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值