信息素的局部更新策略
每只蚂蚁在构造出一条从起点到终点的路径后,蚁群算法还要求根据路径的总长度来更新这条路径所包含的每条边上信息素的浓度(在旅行商问题中每座城市是图中的一个节点,城市两两间有一条边相连)。下面给出了蚁群算法更新信息素的公式:
.
上面的第一个公式体现了信息素的更新值的计算,其中,Ck代表第k只蚂蚁所构造的路径的总长度,Q是凭经验设定的一个参数,通常置为1。component(i,j)表示从城市i到城市j的一条边,m是蚂蚁的总数。上面的第二个公式是说i和j这条边的信息素值tau等于这条边上原有的信息素加上在上一次构造路径活动中所有经过这条边的蚂蚁贡献的信息素更新值(即第一个公式)。
假设三只蚂蚁构造的路径长度如下所示:
Tour 1: 450
Tour 2: 380
Tour 1: 460
则它们的信息素的更新值相加结果为:componentNewPheromone = (Q / 450) + (Q / 380) + (Q / 460)
最后把它加到各个蚂蚁的路径中每条边原来的信息素值之上:
componentPheromone = componentPheromone + componentNewPheromone
上述信息素更新过程的伪代码如下所示:
for ant in colony do //蚁群中每条蚂蚁都逐个更新自己路径经过边上的的信息素
tour = ant.getTour(); //蚂蚁计算路径的总长度
pheromoneToAdd = getParam('Q') / tour.distance(); //蚂蚁计算信息素的更新值
for cityIndex in tour do //回溯路径中的每个城市
if lastCity(cityIndex) do // 如果当前城市是路径上的最后一个城市,取出它和第一个城市间的边
edge = getEdge(cityIndex, 0)
else do
edge = getEdge(cityIndex, cityIndex+1) //否则,取当前城市和路径上下一个城市间的边
end if
currentPheromone = edge.getPheromone(); //获得边上之前的信息素
edge.setPheromone(currentPheromone + pheromoneToAdd)//原有信息素加上更新值后得到新信息素
end for // ant路径上所有的边的信息素更新完毕
end for //蚁群中所有蚂蚁都处理完毕
信息素的挥发
在自然界中蚂蚁遗留下来的信息素经过一段时间后会挥发,我们在算法中也模拟上述过程,具体公式如下:
rho是一个人为设定的参数,称为挥发率,一般为0-1间的数。
相应的伪代码如下所示:
for edge in edges
updatedPheromone = (1 - getParam('rho')) * edge.getPheromone()
edge.setPheromone(updatedPheromone)
end for
精英蚂蚁策略
精英蚂蚁是对蚁群算法的一种改进,所谓精英蚂蚁是指当全部蚂蚁都构造完各自的路径之后,所有路径中最短的那条路径所对应的蚂蚁。精英蚂蚁策略的公式如下所示,它和上面的信息素局部更新公式的唯一区别在于精英蚂蚁在像其它蚂蚁一样更新完自己路径上的信息素后,还要再重复一遍信息素的更新过程,只不过这次要把更新值乘上一个参数e,e通常选在0和1之间。