Python实现蚁群优化算法的代码示例

纸上星河
纸上星河
发布时间:2026-10-12| 3人浏览过
原创

本文介绍使用Python实现蚁群优化算法(ACO)的核心逻辑与完整代码。通过模拟蚂蚁觅食的信息素传递与挥发机制,构建智能体类进行多轮路径探索。结合城市坐标计算距离矩阵,调整启发因子与挥发系数,最终收敛至近似最短路线,适用于基础算法学习与路线规划参考。

Python实现蚁群优化算法的核心原理

蚁群算法通过模拟自然界蚂蚁的信息素交互机制求解组合优化问题。初始阶段各路径被选概率均等,随着蚂蚁遍历,路程越短则单位时间内往返次数越多,沉积的信息素浓度越高。后续蚂蚁倾向于选择高浓度路径,同时信息素会随时间挥发,促使种群不断偏离局部最优并更新路线,逐步逼近全局最短路径。

代码实现操作步骤

第1步:定义蚂蚁智能体类属性与初始化

目的:建立具备记忆与决策能力的单个蚂蚁对象。入口:实例化Ant类。动作:传入城市总数、邻接矩阵与信息素矩阵,随机确定起点并标记已访问城市。重要参数:nCity城市数量,graph距离矩阵,pheromone信息素矩阵。完成状态:实例化完成后,nowCity记录当前位置,path记录已走过的城市序列,cityEnabled对应位置置为False,dTotal初始化为0.0。

import numpy as np
from functools import reduce
class Ant(object):
    def __init__(self, nCity, graph, pheromone):
        self.nCity = nCity          # 城市数
        self.graph = graph          # 城市地图
        self.pheromone = pheromone  # 信息素地图
        self.cityEnabled = [True] * nCity  # 尚未到达的城市标记
        self.nMove = 0              # 移动步数
        self.dTotal = 0.0           # 已经走过的距离
        self.initData()             # 初始化出生点
    # 随机选择城市
    def randCity(self):
        return np.random.randint(0,self.nCity-1) 
    # 初始化
    def initData(self):
        self.nowCity = self.randCity()          # 随机选择一个城市
        self.path = [self.nowCity]              # 保存当前走过的城市
        self.cityEnabled[self.nowCity] = False  # 当前城市不再探索
        self.nMove = 1                          # 初始时的移动计数

第2步:编写信息素启发选择逻辑

目的:计算前往未访问城市的转移概率。入口:choiceNext方法。动作:获取当前所在城市与其他城市的距离和信息素值,代入启发公式计算概率分布,利用累积概率与随机数映射决定下一个目标城市。重要参数:ALPHA=1.0信息素启发因子,BETA=2.0期望启发因子。完成状态:方法返回整数索引,代表下一站城市编号。

蚂蚁前往某城市的概率受信息素浓度与两点距离共同影响:

蚁群算法城市转移概率计算公式
图中展示了信息素浓度与距离对路径选择权重的数学表达
# 计算到达第i个城市的概率
def getOneProb(self, i):
    ALPHA = 1.0
    BETA = 2.0
    dis = self.graph[self.nowCity][i]
    phe = self.pheromone[self.nowCity][i]
    # 计算移动到该城市的概率
    if not self.cityEnabled[i]: return 0  
    else: return pow(phe, ALPHA) * pow(1/dis, BETA)
def choiceNext(self):
    # 前往所有城市的概率
    pSlct = [self.getOneProb(i) for i in range(self.nCity)]
    pSum = np.cumsum(pSlct)
    # 生成一个随机数,这个随机数在pSum中落入的区间就是选择的城市
    pTemp = np.random.uniform(0.0, pSum[-1])
    return  np.searchsorted(pSum, pTemp)

第3步:执行城市移动与回路闭合

目的:推动蚂蚁沿选定路径行进并完成闭环。入口:调用moveTo与run方法。动作:根据上一步选中的城市更新当前位置、累计距离、移动步数,并在遍历完所有城市后,补加起点到终点的最短回程距离。重要参数:city目标城市索引。完成状态:dTotal累积总长度,path包含完整巡回序列。

# 移动到新的城市
def moveTo(self, city):
    self.path.append(city)          # 添加目标城市
    self.cityEnabled[city] = False  # 目标城市不可再探索
    # 总路程增加当前城市到目标城市的距离
    self.dTotal += self.graph[self.nowCity][city]  
    self.nowCity = city             # 更新当前城市
    self.nMove += 1                 # 移动次数
def run(self):
    self.initData()
    while self.nMove < self.nCity:
        next_city = self.choiceNext()
        self.moveTo(next_city)
    self.dTotal += self.graph[self.path[0]][self.path[-1]]
    return self.dTotal

蚁群迭代机制与全局优化

第4步:构建城市距离矩阵与信息素更新

目的:计算全局路网权重并执行信息素动态平衡。入口:准备二维坐标序列。动作:基于坐标差计算欧氏距离矩阵,初始化全量信息素矩阵。在主循环中,遍历每只蚂蚁的路径,在相邻城市间反比于总距离释放信息素,随后叠加挥发系数进行全局衰减。重要参数:RHO=0.5信息素挥发系数,Q信息素常量。完成状态:graph存储城市间距,pheromone按迭代进度实时更新。

城市间的距离矩阵由坐标序列直接推导:

城市节点距离矩阵计算公式
展示基于XY坐标计算两两节点间直线距离的过程
# 更新信息素
RHO = 0.5       # 信息素挥发系数
def updatePheromone(nCity, pheromone, ants):
    # 初始化蚂蚁在两两城市间的信息素, 50行50列
    temp = np.zeros([nCity, nCity])
    # 遍历每只蚂蚁对象
    for ant in ants:
        for i in range(1, nCity):  # 遍历该蚂蚁经过的每个城市
            st, ed = ant.path[i-1], ant.path[i]
            # 在两个城市间留下信息素,浓度与总距离成反比
            temp[st, ed] += Q / ant.dTotal
            temp[ed, st] = temp[st, ed]  # 信息素矩阵轴对称
    return pheromone * RHO + temp

第5步:运行主程序并保存最优路径

目的:调度蚁群并行搜索并持续追踪全局最优解。入口:aco函数。动作:创建指定数量的蚂蚁实例分配至统一信息素场,启动外层迭代循环。每轮内蚂蚁独立遍历求距,优胜者深拷贝覆盖当前最优记录。循环结束前打印当代最优距离并更新信息素。重要参数:nAnts蚂蚁数量,nIter最大迭代次数。完成状态:返回历史最优路径列表bestAnts,最后一项即为收敛后的最佳方案。

import copy
# xs, ys为城市的x和y坐标
# nAnts为蚂蚁个数, nIter为迭代次数
def aco(xs, ys, nAnts, nIter):
    nCity = len(xs)
    xMat, yMat = xs-xs.reshape(-1,1), ys-ys.reshape(-1,1)
    graph = np.sqrt(xMat**2 + yMat**2)
    pheromone = np.ones([nCity, nCity]) # 信息素矩阵
    ants = [Ant(nCity, graph, pheromone) for _ in range(nAnts)]
    best = Ant(nCity, graph, pheromone)  # 初始化最优解
    best.dTotal = np.inf
    bestAnts = []           # 输出并保存
    for i in range(nIter):
        for ant in ants:
            ant.pheromone = pheromone
            ant.run()
            # 与当前最优蚂蚁比较步行的总距离
            if ant.dTotal < best.dTotal:
                # 更新最优解
                best = copy.deepcopy(ant)
        print(f"{i},{best.dTotal}")
        # 更新信息素
        pheromone = updatePheromone(nCity, pheromone, ants)
        bestAnts.append(best)
    return bestAnts

执行验证与可视化结果

目的:提供测试数据并直观展示算法收敛效果。入口:设置空间坐标数组。动作:构造包含50个节点的XY坐标矩阵,代入ACO函数执行50只蚂蚁300次迭代。提取最后一次迭代的最佳路径索引,闭合回环后调用绘图库渲染节点连线。重要参数:marker='*'路径节点标识。完成状态:控制台打印迭代进程,终端弹出包含优化后巡回轨迹的图表。

# 每个城市的x和y坐标
xs = np.array([
    178,272,176,171,650,499,267,703,408,437,491,74,532,
    416,626,42,271,359,163,508,229,576,147,560,35,714,
    757,517,64,314,675,690,391,628,87,240,705,699,258,
    428,614,36,360,482,666,597,209,201,492,294])
ys = np.array([
    170,395,198,151,242,556,57,401,305,421,267,105,525,
    381,244,330,395,169,141,380,153,442,528,329,232,48,
    498,265,343,120,165,50,433,63,491,275,348,222,288,
    490,213,524,244,114,104,552,70,425,227,331])
xMat, yMat = xs-xs.reshape(-1,1), ys-ys.reshape(-1,1)
distance_graph = np.sqrt(xMat**2 + yMat**2)
if __name__ == '__main__':
    bAnts = aco(xs, ys, 50, 300)
    index = bAnts[-1].path
    index = index + [index[0]]
    plt.plot(xs[index], ys[index], marker='*')
    plt.tight_layout()
    plt.show()
蚁群算法50个城市坐标优化后的最短路径轨迹图

以上就是Python实现蚁群优化算法的详细内容,更多关于蚁群算法代码实现与路径规划优化的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。