蚁群算法(ACO)

目录

ACO简介

基本原理

算法步骤

 流程图  

 参数意义 

 构建路径

 更新信息素

 实例演示(TSP问题)


ACO简介

        蚁群是自然界中常见的一种生物,人们对蚂蚁的关注大都是因为“蚁群搬家,天要下雨”之类的民谚。然而随着近代仿生学的发展,这种似乎微不足道的小东西越来越多地受到学者们地关注。1991年意大利学者M. Dorigo等人首先提出了蚁群算法,人们开始了对蚁群的研究:相对弱小,功能并不强大的个体是如何完成复杂的工作的(如寻找到食物的最佳路径并返回等)。在此基础上就诞生了蚁群算法(ant colony optimization, ACO),一种用来在图中寻找优化路径的机率型算法。该算法最初用来求解旅行商(Traveling Saleman Problem,TSP)问题。即求出某个商人从某一个点出发(原点),经过若干个给定的需求点,最终返回到原点所经过的最短路径。

基本原理

        蚂蚁在行走过的路上留下一种挥发性的激素(信息素),蚂蚁就是通过这种激素进行信息交流。蚂蚁趋向于走激素积累较多的路径。找到最短路径的蚂蚁总是最早返回巢穴,从而在路上留下了较多的激素。由于最短路径上积累了较多的激素,选择这条路径的蚂蚁就会越来越多,到最后所有的蚂蚁都会趋向于选择这条最短路径,但信息素会随着时间的推移而逐渐挥发。基于蚂蚁这种行为而提出的蚁群算法具有群体合作,正反馈选择,并行计算等三大特点。

算法步骤

       

  1. 初始化(各个参数): 在计算之初需要对相关的参数进行初始化,如蚂蚁数量m、信息素因子α、启发函数因子β、信息素挥发因子ρ、信息素常数Q、最大迭代次数t等等。
  2. 构建解空间: 将各个蚂蚁随机地放置于不同的出发点,对每个蚂蚁k(k=1,2,……,m),计算其下一个待访问的城市,直到所有蚂蚁访问完所有的城市。
  3. 更新信息素: 计算各个蚂蚁经过的路径长度L,记录当前迭代次数中的最优解(最短路径)。同时,对各个城市连接路径上的信息素浓度进行更新。
  4. 判断是否终止: 若迭代次数小于最大迭代次数则迭代次数加一,清空蚂蚁经过路径的记录表,并返回步骤二;否则终止计算,输出最优解。
     

 流程图  

 参数意义 

参数名称参数意义参数设置过大参数设置过小
蚂蚁数量m蚂蚁数量一般设置为目标数的1.5倍较为稳妥每条路径上信息素趋于平均,正反馈作用减弱,从而导致收敛速度减慢可能导致一些从未搜索过的路径信息素浓度减小为0,导致过早收敛,解的全局最优性降低
信息素常量Q信息素常量根据经验一般取值在[10,1000]会使蚁群的搜索范围减小容易过早的收敛,使种群陷入局部最优每条路径上信息含量差别较小,容易陷入混沌状态
信息素因子ɑ反映了蚂蚁运动过程中路径上积累的信息素的量在指导蚁群搜索中的相对重要程度。取值范围通常在[1, 4]之间。蚂蚁选择以前已经走过的路可能性较大,容易使随机搜索性减弱蚁群易陷入纯粹的随机搜索,使种群陷入局部最优
启发函数因子𝛽反映了启发式信息在指导蚁群搜索中的相对重要程度,蚁群寻优过程中先验性、确定性因素作用的强度取值范围在[0, 5]之间虽然收敛速度加快,但是易陷入局部最优蚁群易陷入纯粹的随机搜索,很难找到最优解
信息素挥发因子𝜌反映了信息素的消失水平,相反的1-𝜌反映了信息素的保持水平。取值范围通常在[0.2, 0.5]之间信息素挥发较快,容易导致较优路径被排除各路径上信息素含量差别较小,收敛速度降低
最大迭代次数t最大迭代次数一般取[100,500],建议取200运算时间过长可选路径较少,使种群陷入局部最优。

 构建路径

我们知道蚂蚁是根据信息素的浓度来判断所走的路线的,但是事实上,不是说哪条路的信息素浓度高蚂蚁就一定走哪条路,而是走信息素浓度高的路线的概率比较高。那么首先我们就需要知道蚂蚁选择走每个城市的概率,然后通过轮盘赌法(相当于转盘)确定蚂蚁所选择的城市。

概率公式 :

 更新信息素

根据不同的规则我们可以将蚁群算法分为三种模型——蚁周模型(Ant-Cycle)、蚁量模型(Ant-Quantity)和蚁密模型(Ant-Density)。蚁周模型是完成一次路径循环后,蚂蚁才释放信息素,其利用的是全局信息。蚁量模型和蚁密模型蚂蚁完成一步后就更新路径上的信息素,其利用的是局部信息。本文章使用的是最常见的蚁周模型。

 实例演示(TSP问题)

 旅行商问题(TSP问题)。假设有一个旅行商人要拜访全国31个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择要求是:所选路径的路程为所有路径之中的最小值。全国31个省会城市的坐标为[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;4196 1044;4312 790;4386 570;3007 1970;2562 1756;2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;2370 2975]。

import numpy as np
import math
import matplotlib.pyplot as plt


class TSP():
    def __init__(self):
        # 初始化参数
        self.antcount = 50  # 蚂蚁数量
        self.alpha = 1  # 信息素重要程度因子
        self.beta = 5  # 启发函数重要程度因子
        self.rho = 0.1  # 信息素挥发因子
        self.Q = 100  # 信息素常量
        self.max_iter = 200  # 最大迭代次数
        self.iter = 1  # 迭代计数器
        self.city_location = np.array([[1304, 2312], [3639, 1315], [4177, 2244], [3712, 1399], [3488, 1535],
                                       [3326, 1556], [3238, 1229], [4196, 1044], [4312, 790], [4386, 570],
                                       [3007, 1970], [2562, 1756], [2788, 1491], [2381, 1676], [1332, 695],
                                       [3715, 1678], [3918, 2179], [4061, 2370], [3780, 2212], [3676, 2578],
                                       [4029, 2838], [4263, 2931], [3429, 1908], [3507, 2376], [3394, 2643],
                                       [3439, 3201], [2935, 3240], [3140, 3550], [2545, 2357], [2778, 2826],
                                       [2370, 2975]])
        self.city_num = len(self.city_location)  # 城市数量
        self.distance = np.zeros((self.city_num, self.city_num))  # 城市距离矩阵
        self.eta = np.zeros((self.city_num, self.city_num))  # 启发因子(距离的倒数)
        self.information = np.ones((self.city_num, self.city_num))  # 信息素矩阵
        self.path = np.zeros((self.antcount, self.city_num)).astype(int)  # 路径矩阵
        self.r_best = np.zeros((self.max_iter, self.city_num)).astype(int)  # 每次迭代的最优路径
        self.d_best = np.zeros(self.max_iter)  # 每次迭代的最短距离

    def get_dictance(self):
        for i in range(self.city_num):
            for j in range(self.city_num):
                if i != j:
                    self.distance[i][j] = math.sqrt(np.power((self.city_location[i][0] - self.city_location[j][0]), 2) + \
                                                    np.power((self.city_location[i][1] - self.city_location[j][1]), 2))
                else:
                    self.distance[i][j] = 100000
        self.eta = 1.0 / self.distance  # 启发因子(距离的倒数)

    def get_firstplace(self):  # 将antcount只蚂蚁放到city_num个城市上
        if self.antcount <= self.city_num:
            self.path[:, 0] = np.random.permutation(range(self.city_num))[:self.antcount]
        else:
            leave = self.antcount - self.city_num  # 剩下几个蚂蚁
            n = 1
            self.path[:self.city_num, 0] = np.random.permutation(range(self.city_num))
            while leave > self.city_num:
                self.path[self.city_num * n:self.city_num * (n + 1), 0] = np.random.permutation(range(self.city_num))
                leave = leave - self.city_num
                n += 1
            self.path[self.city_num * n:self.antcount, 0] = np.random.permutation(range(self.city_num))[:leave]

    def get_nextplace(self):  # 选择下一步走哪个城市
        self.length = np.zeros(self.antcount)  # 每次迭代每只蚂蚁走过的总路程
        for i in range(self.antcount):
            unvisit = list(range(self.city_num))  # 创建每只蚂蚁未走过的城市列表
            visit = self.path[i, 0]  # 每只蚂蚁走过的城市
            unvisit.remove(visit)  # 删除走过的城市
            for j in range(1, self.city_num):
                probability = np.zeros(len(unvisit))
                for k in range(len(unvisit)):  # 下一个城市的概率
                    probability[k] = np.power(self.information[visit][unvisit[k]], self.alpha) * \
                                     np.power(self.eta[visit][unvisit[k]], self.beta)
                # 累积概率 轮盘赌选择
                cousumprobability = (probability / sum(probability)).cumsum()
                cousumprobability -= np.random.rand()
                # 下一步该走的城市
                next = unvisit[list(cousumprobability > 0).index(True)]
                self.path[i, j] = next
                unvisit.remove(next)
                self.length[i] += self.distance[visit][next]  # 第i只蚂蚁走过的路程
                visit = next
            self.length[i] += self.distance[visit][self.path[i, 0]]  # 回到开始的城市

    def get_best(self):  # 得到最优路径和最短距离
        if self.iter == 1:
            self.r_best[self.iter - 1] = self.path[self.length.argmin()].copy()
            self.d_best[self.iter - 1] = self.length.min()
        else:
            if self.length.min() > self.d_best[self.iter- 2]:
                self.r_best[self.iter - 1] = self.r_best[self.iter - 2]
                self.d_best[self.iter - 1] = self.d_best[self.iter - 2]
            else:
                self.r_best[self.iter - 1] = self.path[self.length.argmin()].copy()
                self.d_best[self.iter - 1] = self.length.min()

    def update_infor(self):  # 更新信息素
        j=0
        information_increase = np.zeros((self.city_num, self.city_num))  # 信息素增加矩阵
        for i in range(self.antcount):
            for j in range(self.city_num - 1):
                information_increase[self.path[i, j]][self.path[i][j + 1]] += self.Q / self.length[i]
            information_increase[self.path[i][j+1]][self.path[i,0]]+= self.Q / self.length[i]
        # 信息素矩阵更新
        self.information = (1 - self.rho) * self.information + information_increase
        self.iter += 1

    def paint(self):
        # 绘图
        x = []
        y = []
        road = []
        for i in range(len(self.r_best[-1])):
            x.append(self.city_location[self.r_best[-1][i]][0])
            y.append(self.city_location[self.r_best[-1][i]][1])
            road.append(self.r_best[-1][i])
        x.append(x[0])  #回到开始城市
        y.append(y[0])
        road.append(road[0])
        plt.figure(figsize=(30, 30))
        plt.rcParams['font.family'] = ['Fangsong'] #设置字体
        for i in range(len(x)):
            #注释
            plt.annotate(str(road[i]) + ':' + '(' + str(x[i]) + ',' + str(x[i]) + ')',
                         xy=(x[i], y[i]), xytext=(x[i] + 0.5, y[i] + 0.5), color='r')
        plt.plot(x, y, 'g-o')
        plt.title('最短距离:' + str(self.d_best[-1]), fontsize=40)
        plt.xlabel('x', fontsize=40)
        plt.ylabel('y', fontsize=40, rotation='horizontal')
        plt.show()

        plt.figure()
        plt.title("迭代距离变化")  # 距离迭代图
        plt.plot([i for i in range(1, len(self.d_best) + 1)], self.d_best)
        plt.xlabel("迭代次数")  # 迭代次数
        plt.ylabel("距离")  # 距离值
        plt.show()

    def run(self):
        self.get_dictance()
        while self.iter<=self.max_iter:
            self.get_firstplace()
            self.get_nextplace()
            self.get_best()
            self.update_infor()
        print('蚁群最优路径', self.r_best[-1])
        print('最优解', self.d_best[-1])
        self.paint()

if __name__ == '__main__':
    tsp=TSP()
    tsp.run()


 

标题——作者——出处 基于蚁群优化算法递归神经网络的短期负荷预测 蚁群算法的小改进 基于蚁群算法的无人机任务规划 多态蚁群算法 MCM基板互连测试的单探针路径优化研究 改进的增强型蚁群算法 基于云模型理论的蚁群算法改进研究 基于禁忌搜索与蚁群最优结合算法的配电网规划 自适应蚁群算法在序列比对中的应用 基于蚁群算法的QoS多播路由优化算法 多目标优化问题的蚁群算法研究 多线程蚁群算法及其在最短路问题上的应用研究 改进的蚁群算法在2D HP模型中的应用 制造系统通用作业计划与蚁群算法优化 基于混合行为蚁群算法的研究 火力优化分配问题的小生境遗传蚂蚁算法 基于蚁群算法的对等网模拟器的设计与实现 基于粗粒度模型的蚁群优化并行算法 动态跃迁转移蚁群算法 基于人工免疫算法和蚁群算法求解旅行商问题 基于信息素异步更新的蚁群算法 用于连续函数优化的蚁群算法 求解复杂多阶段决策问题的动态窗口蚁群优化算法 蚁群算法在铸造生产配料优化中的应用 多阶段输电网络最优规划的并行蚁群算法 求解旅行商问题的混合粒子群优化算法 微粒群优化算法研究现状及其进展 随机摄动蚁群算法的收敛性及其数值特性分析 广义蚁群与粒子群结合算法在电力系统经济负荷分配中的应用 改进的蚁群算法及其在TSP中的应用研究 蚁群算法的全局收敛性研究及改进 房地产开发项目投资组合优化的改进蚁群算法 一种改进的蚁群算法用于灰色约束非线性规划问题求解 一种自适应蚁群算法及其仿真研究 一种动态自适应蚁群算法 蚂蚁群落优化算法在蛋白质折叠二维亲-疏水格点模型中的应用 用改进蚁群算法求解函数优化问题 连续优化问题的蚁群算法研究进展 蚁群算法概述 Ant colony system algorithm for the optimization of beer fermentation control 蚁群算法在K—TSP问题中的应用 Parallel ant colony algorithm and its application in the capacitated lot sizing problem for an agile supply chain 基于遗传蚁群算法的机器人全局路径规划研究 改进的蚁群算法在矿山物流配送路径优化中的研究 基于蚁群算法的配电网络综合优化方法 基于蚁群算法的分类规则挖掘算法 蚁群算法在连续性空间优化问题中的应用 蚁群算法在矿井通风系统优化设计中的应用 基于蚁群算法的液压土锚钻机动力头优化设计 改进蚁群算法设计拉式膜片弹簧 计算机科学技术 基本蚁群算法及其改进 TSP改进算法及在PCB数控加工刀具轨迹中的应用 可靠性优化的蚁群算法 对一类带聚类特征TSP问题的蚁群算法求解 蚁群算法理论及应用研究的进展 基于二进制编码的蚁群优化算法及其收敛性分析 蚁群算法的理论及其应用 基于蚁群行为仿真的影像纹理分类 启发式蚁群算法及其在高填石路堤稳定性分析中的应用 蚁群算法的研究现状 一种快速全局优化的改进蚁群算法及仿真 聚类问题的蚁群算法 蚁群最优化——模型、算法及应用综述 基于信息熵的改进蚁群算法及其应用 机载公共设备综合管理系统任务分配算法研究 基于改进蚁群算法的飞机低空突防航路规划 利用信息量留存的蚁群遗传算法 An Improved Heuristic Ant-Clustering Algorithm 改进型蚁群算法在内燃机径向滑动轴承优化设计中的应用 基于蚁群算法的PID参数优化 基于蚁群算法的复杂系统多故障状态的决策 蚁群算法在数据挖掘中的应用研究 基于蚁群算法的基因联接学习遗传算法 基于细粒度模型的并行蚁群优化算法 Binary-Coding-Based Ant Colony Optimization and Its Convergence 运载火箭控制系统漏电故障诊断研究 混沌扰动启发式蚁群算法及其在边坡非圆弧临界滑动面搜索中的应用 蚁群算法原理的仿真研究 Hopfield neural network based on ant system 蚁群算法及其实现方法研究 分层实体制造激光头切割路径的建模与优化 配送网络规划蚁群算法 基于蚁群算法的城域交通控制实时滚动优化 基于蚁群算法的复合形法及其在边坡稳定分析中的应用 Ant Colony Algorithm for Solving QoS Routing Problem 多产品间歇过程调度问题的建模与优化 基于蚁群算法的两地之间的最佳路径选择 蚁群算法求解问题时易产生的误区及对策 用双向收敛蚁群算法解作业车间调度问题 物流配送路径安排问题的混合蚁群算法 求解TSP问题的模式学习并行蚁群算法 基于蚁群算法的三维空间机器人路径规划 蚁群优化算法及其应用 蚁群算法不确定性分析 一种求解TSP问题的相遇蚁群算法 基于蚁群优化算法的彩色图像颜色聚类的研究 钣金件数控激光切割割嘴路径的优化 基于蚁群算法的图像分割方法 一种基于蚁群算法的聚类组合方法 圆排列问题的蚁群模拟退火算法 智能混合优化策略及其在流水作业调度中的应用 蚁群算法在QoS网络路由中的应用 一种改进的自适应路由算法 基于蚁群算法的煤炭运输优化方法 基于蚁群智能和支持向量机的人脸性别分类方法 蚁群算法在啤酒发酵控制优化中的应用 一种基于时延信息的多QoS快速自适应路由算法 蚁群算法中参数α、β、ρ设置的研究——以TSP问题为例 基于人工蚁群优化的矢量量化码书设计算法 具有自适应杂交特征的蚁群算法 蚁群算法在原料矿粉混匀优化中的应用 基于多Agent的蚁群算法在车间动态调度中的应用研究 用蚁群优化算法求解中国旅行商问题 蚁群算法在婴儿营养米粉配方中的应用 蚁群算法在机械优化设计中的应用 蚁群优化算法的研究现状及研究展望 蚁群优化算法及其应用研究进展 蚁群算法的理论与应用 简单蚁群算法的仿真分析 一种改进的蚁群算法求解最短路径问题 基于模式求解旅行商问题的蚁群算法 一种求解TSP的混合型蚁群算法 基于MATLAB的改进型基本蚁群算法 动态蚁群算法求解TSP问题 用蚁群算法求解类TSP问题的研究 蚁群算法求解连续空间优化问题的一种方法 用混合型蚂蚁群算法求解TSP问题 求解复杂TSP问题的随机扰动蚁群算法 基于蚁群算法的中国旅行商问题满意解 蚁群算法的研究现状和应用及蚂蚁智能体的硬件实现 蚁群算法概述 蚁群算法的研究现状及其展望 基于蚁群算法的配电网网架优化规划方法 用于一般函数优化的蚁群算法 协同模型与遗传算法的集成 基于蚁群最优的输电网络扩展规划 自适应蚁群算法 凸整数规划问题的混合蚁群算法 一种新的进化算法—蛟群算法 基于协同工作方式的一种蚁群布线系统
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星辰境末

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值