智能优化算法学习笔记(4)–蚁群优化算法(ACO)

一、蚁群算法概述

        蚁群优化算法是由Dorigo等人于1991年在第一届欧洲人工生命会议上提出,是模拟自然界真实蚂蚁觅食过程的一种随机搜索算法。

        在觅食过程中,蚂蚁在它所经过的路径上留下浓度与食物源质量成比例的信息素,并能够感知信息素的存在及其浓度,以此指导自己的运动方向,倾向于朝着信息素浓度高的方向移动。

        因此,蚁群的集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大,因此质量好、距离近的食物源会吸引越来越多的蚂蚁,信息素浓度的增长速度会更快,这种正反馈机制使得越来越多的蚂蚁在巢穴与食物之间的最短路径上行进。由于其他路径上的信息素会随着时间蒸发,最终所有的蚂蚁都在最优路径上行进。

蚁群觅食现象和蚁群优化算法的基本定义对照表

蚁群觅食现象蚁群优化算法
蚁群搜索空间的一组有效解(表现为种群规模 m)
觅食空间问题的搜索空间(表现为问题的规模、解的维数n)
信息素信息素浓度变量
蚁巢到食物的一条路径一个有效解
找到的最短路径问题的最优解

二、蚁群优化算法的基本流程

        以蚁群算法求解TSP问题的基本流程为例来描述蚁群优化算法的工作机制。

2.1 基本流程

        AS算法对TSP的求解流程主要有两大步骤:路径构建和信息素更新。

        已知 n 个城市的集合C_{n} =\left \{ c_{1}, c_{2},...,c_{n} \right \},任意两个城市间均有路径连接,d_{ij}\left ( i,j = 1, 2, ...,n\right )表示城市 i 与 j 之间的距离,它是已知的(或者城市的坐标集合为已知,d_{ij}即为城市 i 与 j之间的欧几里德距离)。TSP的目的是找到从某个城市c_{i}出发,访问所有城市且只访问一次,最后回到c_{i}的最短封闭路线。

        1.路径构建

        每只蚂蚁都随机选择一个城市作为其出发城市,并维护一个路径记忆向量,用来存放该蚂蚁依次经过的城市。蚂蚁在构建路径的每一步中,按照一个随机比例规则选择下一个要到达的城市。

        定义1 AS中的随机比例规则:对于每只蚂蚁 k,路径记忆向量R^{k}按照访问顺序记录了所有 k 已经经过的城市序号。设蚂蚁 k 当前所在城市为 i,则其选择城市 j 作为下一个访问对象的概率为:

 其中,J_{k}(i)表示从城市 i 可以直接到达的且又不在蚂蚁访问过的城市序列 R^k中的城市集合。\eta (i,j)是一个启发式信息,通常由\eta (i,j)=1/d_{ij}直接计算。\tau (i,j)表示边(i,j)上的信息素量。由概率公式可知,长度越短、信息素浓度越大的路径被蚂蚁选择的概率越大。\alpha\beta是两个预先设置的参数,用来控制启发式信息与信息素浓度作用的权重关系。当\alpha =0时,算法演变成传统的随机贪婪算法,最邻近城市被选中的概率越大。当\beta =0时,蚂蚁完全只根据信息素浓度确定路径,算法将快速收敛,这样构建出的最优路径往往与实际目标有着较大差异,算法性能比较糟糕。实验表明,在AS中设置\alpha =1,\beta =2...5比较合适。

          2.信息素更新

        在算法初始化时,问题空间中所有的边上的信息素都被初始化为\tau _0{}。如果\tau _0{}太小,算法容易早熟,即蚂蚁很快就全部集中一条局部最优的路径上。反之,如果\tau _0{}太大,信息素对搜索方向的指导作用太低,也会影响算法性能。对AS来说,我们使用\tau _{0} = m/C^{m},m是蚂蚁的个数,C^{m}是由贪婪算法构造的路径的长度。

        当所有蚂蚁构建完路径后,算法将会对所有的路径进行全局信息素的更新。注意,此描述的是AS的ant-cycle版本,更新是在全部蚂蚁均完成了路径的构造后才进行的,信息素的浓度变化与蚂蚁在这一轮中构建的路径长度相关。

        信息素的更新也有两个步骤:1)每一轮过后,问题空间中的所有路径上的信息素都会发生蒸发,我们为所有边上的信息素乘上一个小于1的常数。信息素蒸发是自然界本身固有的特征,在算法中能够帮助避免信息素的无限积累,使得算法可以快速丢弃之前构建过的较差的路径。2)随后所有的蚂蚁根据自己构建的路径长度在它们本轮经过的边上释放信息素。蚂蚁构建的路径越短、释放的信息素就越多;一条边被蚂蚁爬过的次数越多、它所获得的信息素也越多。AS中城市 i 与城市 j 的相连边上的信息素量\tau (i,j)按如下公式进行更新:

 这里,m是蚂蚁个数;\rho是信息素的蒸发率,规定0<\rho \leqslant 1,在AS中通常设置为\rho =0.5

\Delta \tau _{k}(i,j)是第 k 只蚂蚁在它经过的边上释放的信息素量,它等于蚂蚁 k 本轮构建路径长度的倒数。C_{k}表示路径长度,它是R^{k}中所有边的长度和。

        AS求解TSP的流程图和伪代码如图

         路径的两种构建方式:顺序构建并行构建。顺序构建是指当一只蚂蚁完成一轮完整的构建并返回到初始城市之后,下一只蚂蚁才开始构建;并行构建是指所有蚂蚁同时开始构建,每次所有蚂蚁各走一步(从当前城市移动到下一个城市)。两种方式对AS算法来说等价,但对于一些改进算法不等价。

三、应用举例

 四、改进版本

蚁群系统:

>在路径选择中采用了利用和探索相结合的方法

        随机数rand \epsilon [0,1],当这个随机数rand\leqslant q_{0}时,蚂蚁选择目前的最优路径

        当rand > q_{0}时,系统采用了探索策略,

        即如同基本蚁群算法,按照概率的方式选择路径。

        q_{0}是一个[0,1]区间内的参数。

>信息素的更新采用了全局更新和局部更新相结合的方案

        局部更新是所有蚂蚁完成一次移动后执行

        \gamma系数,\tau _{jk}表示 i -> j -> k(1),i -> j -> k(2),......

         全局更新是在所有的蚂蚁完成了旅行商回路后执行,全局更新仅仅对目前的最优回路上的路径(边)进行信息素的添加。

蚁群算法步骤如下:

  1. 初始化信息素和蚂蚁的位置。
  2. 蚂蚁根据信息素浓度选择路径,并更新信息素。
  3. 计算路径的长度和适应度。
  4. 更新最优解。
  5. 重复步骤2-4,直到满足停止条件。

在实现蚁群算法时,需要注意以下几点:

  1. 信息素的更新需要考虑信息素挥发和信息素增加。
  2. 蚂蚁的选择路径需要考虑信息素浓度和路径长度。
  3. 最优解的更新需要考虑全局最优解和局部最优解。

五、相关代码

import random

# 蚂蚁数量
ant_num = 10

# 城市数量
city_num = 20

# 最大迭代次数
max_iter = 100

# 信息素挥发系数
rho = 0.5

# 信息素增加系数
alpha = 1

# 启发函数中信息素重要程度因子
beta = 2

# 城市间距离矩阵
distance_matrix = [[random.randint(1, 100) for j in range(city_num)] for i in range(city_num)]

# 初始信息素浓度
pheromone_matrix = [[1 / (city_num * city_num) for j in range(city_num)] for i in range(city_num)]

# 初始蚂蚁位置和路径
ant_path = [[] for i in range(ant_num)]
ant_position = [random.randint(0, city_num - 1) for i in range(ant_num)]
for i in range(ant_num):
    ant_path[i].append(ant_position[i])

# 迭代
for iter in range(max_iter):
    # 每只蚂蚁按照信息素浓度和距离选择下一个城市
    for i in range(ant_num):
        next_city_prob = [0 for j in range(city_num)]
        for j in range(city_num):
            if j not in ant_path[i]:
                next_city_prob[j] = (pheromone_matrix[ant_position[i]][j] ** alpha) * ((1 / distance_matrix[ant_position[i]][j]) ** beta)
        next_city_prob_sum = sum(next_city_prob)
        next_city_prob = [prob / next_city_prob_sum for prob in next_city_prob]
        ant_position[i] = next_city_prob.index(max(next_city_prob))
        ant_path[i].append(ant_position[i])

    # 更新信息素浓度
    for i in range(city_num):
        for j in range(city_num):
            pheromone_matrix[i][j] = (1 - rho) * pheromone_matrix[i][j]
            for k in range(ant_num):
                if j in ant_path[k] and ant_path[k].index(j) == len(ant_path[k]) - 1:
                    pheromone_matrix[i][j] += alpha / distance_matrix[i][j]

# 输出结果
best_path = []
best_distance = float('inf')
for i in range(ant_num):
    distance = sum([distance_matrix[ant_path[i][j - 1]][ant_path[i][j]] for j in range(1, city_num)])
    if distance < best_distance:
        best_distance = distance
        best_path = ant_path[i]
print('最短路径:', best_path)
print('最短距离:', best_distance)

这段代码实现了一个简单的蚁群算法,用于解决旅行商问题。在实际应用中,需要根据具体问题进行适当修改。

六、相关应用

1)旅行商问题;

2)车辆路径问题;

3)车间作业调度问题;

4)动态组合规划问题(通信领域的路由问题)。

七、参考文献

计算智能 张军

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值