蚁群算法:求解离散问题——原理

大家都看过蚂蚁的新闻,他们合作冲出火圈、他们的分工比蜜蜂还要明确、他们个个都是大力士。

但是,今天,我们将认识到,蚂蚁,还可以解优化问题!

原理

蚂蚁在觅食的时候,首先会漫无目的地寻找。此时的蚂蚁,可以说都是瞎子。但他们沿途会留下信息素,对,就是蚂蚁味。如果找到食物,它们就会返回,并同样留下信息素。

此后,蚂蚁前赴后继,顺着前人留下的信息素的强度,选择性地找到一条路来走。

由于那些不是最短的路,蚂蚁来回的时间比较长,所以信息素挥发得多。因此,如是过程一直持续下去,必然会出现一条路,上面的信息素的浓度远远大于其他路。

再往后,由于这条路的信息素浓度很高。几乎所有的蚂蚁,都会沿着这条路去搬运粮食。所以就造成了,我们小时候看到的,蚂蚁龙的现象。

而这条路,正是最短路径。

因此,能否将参数寻优问题对应到蚁群算法,找到最短路径的问题呢?

答案可能让大家失望了,比较难,或者说,不直观!

蚁群算法可以直观的用于求解,离散优化问题的经典——TSP 问题

什么是 TSP 问题,相信大家都知道了。

TSP 问题,可以很直观地对应到蚁群算法中。虽然没有“食物”这个东西。

转移概率原则

首先,假设有 m 只蚂蚁,由于 TSP 问题要求不能重复,因此对于每个蚂蚁,都维护一个禁忌表,table,表示蚂蚁下一次移动的目标,不能是 table 里面列举的城市。设城市节点构成一个集合,记为 C。城市 i 与 j 之间的距离为 d i j d_{ij} dij 。对于某一只蚂蚁 k,假设其当前时刻为 t,其位置为 i,则其移动到城市 j 的概率为:
p i j k ( t ) = τ i j α ( t ) η i j β ( t ) ∑ N τ i r α ( t ) η i r β ( t )          N = C − t a b l e k ( t ) p_{ij}^{k}(t) = \frac{\tau_{ij}^\alpha(t) \eta_{ij}^\beta(t)}{\sum_{N}\tau_{ir}^\alpha(t) \eta_{ir}^\beta(t)}~~~~~~~~N=C-table^k(t) pijk(t)=Nτirα(t)ηirβ(t)τijα(t)ηijβ(t)        N=Ctablek(t)
其中 τ i j ( t ) \tau_{ij}(t) τij(t) 是当前时刻,城市 i 和 j 留下的信息素。 η i j \eta_{ij} ηij 为启发元素,一般有
η i j = 1 / d i j \eta_{ij}=1/d_{ij} ηij=1/dij
如果 α = 0 \alpha=0 α=0,那么蚂蚁完全是靠着路程来选择路径,忽略了信息素的作用,同时加快了收敛,但增加了局部最优的风险(就好像贪心算法一样,但带有一点启发性/随机性)。如果 α \alpha α 很大,蚂蚁会容易过分依赖 “前人的经验”,无法 “创新”,从而同样导致局部最优。

因此,当从这一点来看,就可以发现蚁群算法对算法的参数敏感!

局部调整原则

信息素在经过一段时间后,就会挥发。蚁群算法也是如此,信息素 τ \tau τ的作用,也会随着时间的推进而减小。

在 TSP 问题中,时间比较难界定。我们可以设置,当蚂蚁(蚂蚁们同时出发,同时来到下一个城市)走过 n 个城市后,就启动挥发,减小当前的 τ ( t ) \tau(t) τ(t)
τ i j ( t + n ) = ( 1 − ϵ ) τ i j ( t ) + ϵ τ 0 \tau_{ij}(t+n) = (1-\epsilon)\tau_{ij}(t)+\epsilon \tau_0 τij(t+n)=(1ϵ)τij(t)+ϵτ0
其中, ϵ ∈ [ 0 , 1 ] \epsilon \in[0,1] ϵ[0,1]为挥发系数, τ 0 = 1 / ( n l m i n ) \tau_0=1/(nl_{min}) τ0=1/(nlmin),其中 l m i n l_{min} lmin为最小的 d i j d_{ij} dij

全局调整原则

蚁群算法和遗传算法一样,都是以种群为单位,而且都经过很多次迭代循环。

蚁群在其所经过的路径会留下信息素,但在算法中,蚁群的信息素不是及时留下的。而是在满一个迭代后,再来进行清算。清算的规则为:
τ i j ( T + 1 ) = ( 1 − ρ ) τ i j ( T ) + Δ τ i j ( T ) δ τ i j ( T ) = ∑ k = 1 m Δ τ i j k ( T ) \begin{array}{l} \tau_{ij}(T+1) = (1-\rho)\tau_{ij}(T) + \Delta\tau_{ij}(T) \\ \delta\tau_{ij}(T) = \sum_{k=1}^{m} \Delta \tau_{ij}^k(T) \end{array} τij(T+1)=(1ρ)τij(T)+Δτij(T)δτij(T)=k=1mΔτijk(T)
其中: Δ τ i j k ( T ) \Delta \tau_{ij}^k(T) Δτijk(T)是在循环 T 中,蚂蚁留下的信息素。

根据计算方式的不同,衍生出如下三种蚁群算法:

  • AC: Δ τ i j k ( T ) = { Q / L k        若 k 经 过 i j , Q 为 常 数 , L k 为 蚂 蚁 k 走 过 的 总 距 离 0               否 则 \Delta \tau_{ij}^k(T) = \left\{\begin{array}{c} Q/L_k ~~~~~~若 k 经过 ij ,Q 为常数,L_k 为蚂蚁k走过的总距离\\ 0 ~~~~~~~~~~~~~否则 \end{array}\right. Δτijk(T)={ Q/Lk      kijQLkk0             
  • AQ: Δ τ i j k ( T ) = { Q / d i j        若 k 经 过 i j 0               否 则 \Delta \tau_{ij}^k(T) = \left\{\begin{array}{c} Q/d_{ij} ~~~~~~若 k 经过 ij \\ 0 ~~~~~~~~~~~~~否则 \end{array}\right. Δτijk(T)={ Q/dij      kij0             
  • AD: Δ τ i j k ( T ) = { Q        若 k 经 过 i j 0               否 则 \Delta \tau_{ij}^k(T) = \left\{\begin{array}{c} Q ~~~~~~若 k 经过 ij \\ 0 ~~~~~~~~~~~~~否则 \end{array}\right. Δτijk(T)={ Q      kij0             

对于 AD、AQ,可以及时更新信息素,而不必到循环结束后再做清算。

流程

蚁群算法:求解离散问题——原理_第1张图片

参考文献

http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=27FAF83A33355430314226371D101358?doi=10.1.1.421.7129&rep=rep1&type=pdf

缺点

前期的搜索非常慢。要搜索到一定程度后,才会收敛。

算法的鲁棒性不高。也就是说,如果不加改变(大改),它很难用于其他问题,如连续型的优化问题。

优点

算法很健壮,他不是十分依赖与初始值。

你可能感兴趣的:(寻优算法,蚁群算法,TSP,原理)