蚁群算法简介(part2: 蚁群算法之构造路径)

时间:2022-12-23 15:25:49

蚁群算法主要可以分为以下几个步骤:首先,蚁群中的每只蚂蚁都根据地面上信息素浓度的大小找出一条从原点通向终点的遍历所有城市一次的路径(构造路径);然后每只蚂蚁沿着自己刚刚找到的路径回溯,在路径经过的各个component(在旅行商问题中component指的是连接两座城市的那条边)上根据找到路径的整体质量(在旅行商问题中,质量好坏可以用路径总长度的大小来评价)分泌出相应浓度的信息素(更新信息素);当所有蚂蚁都找到了遍历所有城市的路径并通过回溯完成了信息素的更新工作后,所有component上的信息素按照一定的挥发率进行挥发。我们不断地重复上面的步骤直到找到一条从原点通向终点的最优路径为止。

除了信息素之外,在构造路径时我们还要计算一个经验值来帮助引导蚂蚁的路径选择,以旅行商问题为例,这个经验值通常是当前访问的城市到其它城市之间的直线距离,一个城市离蚂蚁当前所在的城市距离越近,这个城市作为蚂蚁下一个访问的城市的概率就越大。下面的公式体现了蚂蚁如何按照经验值和信息素这两个因素来计算某个城市作为下一个被访问到的城市的概率:

aaarticlea/png;base64,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" alt="" />

在上面的公式中k代表蚂蚁的编号,pij代表如果第k个蚂蚁当前位于城市i那么它下一个要访问的城市是j的概率。tij代表第i个城市通向第j个城市的边上存储的信息素的值,nij代表第i个城市通向第j个城市的边上的经验值(与i和j间的距离成反比),l指的是与i有边相连且从未访问过的城市。alpha和beta分别是两个参数,在分母中的l表示与i之间有边直接相连的城市编号。下面的代码给出了如何根据pij的值来选择下一个要访问的城市的伪代码:

 rouletteWheel =
states = ant.getUnvisitedStates()//找到与当前城市state有边直接相连且从未访问的城市,把这些城市编号存到states里
/*计算上面公式的分母*/
for newState in states do
rouletteWheel += Math.pow(getPheromone(state, newState), getParam('alpha'))
* Math.pow(calcHeuristicValue(state, newState), getParam('beta'))
end for randomValue = random()//产生一个0-1之间的随机数
wheelPosition = 0
/* 从候选城市的集合states中逐一取出城市编号newstate,计算上面公式的分子部分,
并把计算出来的值进行累加,直到取出某个城市newState
后的累加值(即wheelPosition的值)大于等于随机数randomValue为止,
返回这个newState作为下一个访问的城市
*/
for newState in states do
wheelPosition += (Math.pow(getPheromone(state, newState), getParam('alpha'))
* Math.pow(calcHeuristicValue(state, newState), getParam('beta')))/rouletteWheel
if wheelPosition >= randomValue do
return newState
end for

需要注意的是在旅行商问题中每座城市只能被访问一次,因此我们需要将已经访问过的城市做标记,在计算上面公式的分母时不去考虑这些到过的城市。

Exploration and Exploitation 策略

在选择下一个访问城市的问题上,有一种叫作Exploration和Exploitation的策略,该策略的思路是生成一个0-1的随机数,将这个随机数和一个预先设定好的0-1之间的参数进行比较,如果随机数<这个参数,则通过Exploitation选择下一个访问的城市,否则通过Exploration操作选择下一个城市。Exploratation这个操作就是上面代码所示的操作,而Exploitation操作指的是在和当前节点(state)有边直接相连的尚未被访问的候选城市(newState)中挑选

Math.pow(getPheromone(state, newState), getParam('alpha'))* Math.pow(calcHeuristicValue(state, newState), getParam('beta'))

最大的那个城市作为下一个访问的城市。