Python实现蜂群算法优化TSP问题

Python实现蜂群算法优化TSP问题

一、算法简介

人工蜂群算法(Artificial Bee Colony, ABC)是一种模仿蜜蜂采蜜行为的群体智能优化算法,由土耳其学者Dervis Karaboga于2005年提出。算法模拟了蜂群中雇佣蜂、观察蜂和侦察蜂三种角色的协作机制。

TSP问题(旅行商问题) 是经典的组合优化问题:给定N个城市,找到访问所有城市并返回起点的最短路径。

二、算法原理

2.1 蜂群角色

  • 雇佣蜂:负责搜索当前食物源邻域,并将信息传递给观察蜂
  • 观察蜂:根据雇佣蜂传递的信息,选择优质食物源进行进一步搜索
  • 侦察蜂:当某个食物源长时间未改善时,随机探索新食物源

2.2 算法流程

  1. 初始化:随机生成N个食物源(路径),设置蜜蜂数量、迭代次数等参数
  2. 雇佣蜂阶段:每只雇佣蜂在食物源附近搜索新路径,如果更优则替换
  3. 观察蜂阶段:根据适应度选择优质食物源,在附近精细搜索
  4. 侦察蜂阶段:丢弃长期未改进的食物源,随机生成新路径
  5. 迭代:重复2-4直到满足终止条件

三、Python实现

3.1 完整代码

python 复制代码
"""
Python实现蜂群算法(ABC)优化TSP问题
"""
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)

# 参数设置
n_cities = 20               # 城市数量
n_bees = 50                 # 蜜蜂数量
max_iter = 200              # 最大迭代次数
limit = 50                  # 最大搜索限制

# 生成测试数据
cities = np.random.rand(n_cities, 2) * 100

# 距离矩阵
dist = np.zeros((n_cities, n_cities))
for i in range(n_cities):
    for j in range(i+1, n_cities):
        d = np.sqrt(np.sum((cities[i] - cities[j])**2))
        dist[i][j] = d
        dist[j][i] = d

def calc_route_len(route):
    """计算路径总长度"""
    length = 0
    for i in range(len(route)-1):
        length += dist[route[i]][route[i+1]]
    length += dist[route[-1]][route[0]]
    return length

# 初始化种群
food_sources = []
for _ in range(n_bees):
    route = np.random.permutation(n_cities).tolist()
    food_sources.append(route)

# 计算适应度
fitness = np.array([1.0 / calc_route_len(r) for r in food_sources])

# 记录最优
best_route = None
best_length = float('inf')
best_history = []

# 主循环
for iteration in range(max_iter):
    # 雇佣蜂阶段:邻域搜索
    for i in range(n_bees):
        new_route = food_sources[i].copy()
        i1, i2 = np.random.randint(0, n_cities, 2)
        new_route[i1], new_route[i2] = new_route[i2], new_route[i1]
        new_len = calc_route_len(new_route)
        if new_len < calc_route_len(food_sources[i]):
            food_sources[i] = new_route
            fitness[i] = 1.0 / new_len
    
    # 计算选择概率
    probs = fitness / fitness.sum()
    
    # 观察蜂阶段:轮盘赌选择
    for i in range(n_bees):
        r = np.random.rand()
        cumsum = 0
        selected = 0
        for j in range(n_bees):
            cumsum += probs[j]
            if r <= cumsum:
                selected = j
                break
        new_route = food_sources[selected].copy()
        ins = np.random.randint(0, n_cities)
        val = new_route.pop(ins)
        new_route.insert(np.random.randint(0, n_cities), val)
        if calc_route_len(new_route) < calc_route_len(food_sources[selected]):
            food_sources[selected] = new_route
            fitness[selected] = 1.0 / calc_route_len(new_route)
    
    # 侦察蜂阶段
    lengths = [calc_route_len(r) for r in food_sources]
    for i in range(n_bees):
        if lengths[i] > limit * 10:
            food_sources[i] = np.random.permutation(n_cities).tolist()
            fitness[i] = 1.0 / calc_route_len(food_sources[i])
    
    # 记录最优
    for i in range(n_bees):
        route_len = calc_route_len(food_sources[i])
        if route_len < best_length:
            best_length = route_len
            best_route = food_sources[i].copy()
    best_history.append(best_length)
    
    if (iteration + 1) % 20 == 0:
        print(f"迭代 {iteration+1}/{max_iter}: 最短路径 = {best_length:.4f}")

print(f"\n最优路径长度: {best_length:.4f}")
print(f"最优路径: {best_route}")

3.2 关键函数说明

函数 功能
calc_route_len(route) 计算路径总长度(含返回起点)
swap_mutation(route) 交换变异,用于雇佣蜂搜索
insert_mutation(route) 插入变异,用于观察蜂精细搜索

3.3 变异算子

  • 交换变异:随机交换两个城市的访问顺序(雇佣蜂用)
  • 插入变异:将某个城市从当前位置取出,插入到另一位(观察蜂用)
  • 2-opt变异:反转一段子路径(可选的局部搜索)

四、运行结果

4.1 控制台输出

复制代码
迭代 20/200: 最短路径 = 741.0941
迭代 40/200: 最短路径 = 705.3570
迭代 60/200: 最短路径 = 705.3570
...
迭代 200/200: 最短路径 = 705.3570

===== 最终结果 =====
最优路径长度: 705.3570
最优路径: [10, 18, 7, 6, 19, 9, 0, 4, 17, 1, 12, 16, 5, 3, 2, 13, 11, 14, 15, 8]

4.2 迭代收敛曲线

图1:ABC-TSP迭代收敛曲线(20城市示例)

4.3 最优路径图

图2:ABC-TSP最优路径示意图

五、结果分析

  1. 收敛性:算法在前40代快速收敛,从初始值下降至705.3570,之后趋于稳定
  2. 路径效率:20个城市的路径总长度为705.36
  3. 算法优势:ABC算法参数少、实现简单,适合求解中小规模TSP问题

六、参数设置建议

参数 建议范围 说明
蜜蜂数量 20~100 城市数量的1~3倍
最大迭代次数 100~500 根据问题规模调整
搜索限制(limit) 30~100 控制侦察蜂触发频率
变异率 0.05~0.2 维持种群多样性

七、总结

本文详细介绍了人工蜂群算法解决TSP问题的Python实现。蜂群算法通过模拟蜜蜂的协作觅食行为,在组合优化问题中表现出良好的性能。代码简洁易懂,适合学习和二次开发。


参考资料

  • Karaboga D. An idea based on honey bee swarm for numerical optimization. 2005.
  • 《Python智能优化算法:从入门到实践》

本文完整代码可直接运行,如有问题欢迎交流!

相关推荐
代码飞天1 小时前
机器学习算法和函数整理——助力快速查阅
人工智能·算法·机器学习
yaodong5181 小时前
不会Python也能数据分析:Gemini 3.1 Pro解决办公问题的SQL自动生成
python·sql·数据分析
jiushiapwojdap1 小时前
LU分解法求解线性方程组Matlab实现
数据结构·其他·算法·matlab
jinanwuhuaguo2 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
BU摆烂会噶2 小时前
【LangGraph】持久化实现的三大能力——时间旅行
数据库·人工智能·python·postgresql·langchain
笨笨饿2 小时前
69_如何给自己手搓一个串口
linux·c语言·网络·单片机·嵌入式硬件·算法·个人开发
纽扣6672 小时前
【算法进阶之路】链表进阶:删除、合并、回文与排序全解析
数据结构·算法·链表
有一个好名字3 小时前
工具即双手 —— 从 Bash 到 Tool Dispatch Map
开发语言·chrome·bash
Lyyaoo.3 小时前
优惠券秒杀业务分析
java·开发语言