参考一篇论文《An ant colony optimization algorithm for image edge detection》来尝试说清楚蚁群优化算法的大概流程。
蚁群算法是一种群体智能算法,这类算法主要是依靠随机选择加上(目标函数)引导来拓宽解的搜索能力。我个人觉得这一类的群体算法在概率上并不能保证得到的结果都是最优的,因此会出现不可控性。但是它的表示能力比较强,许多难以用数学函数描述的问题,能够借助群体智能算法来就行巧妙地求解,且能得到一个满意的解,群体智能算法的另一个优点是易于实现并行化。
1.初始化
蚁群算法在初始的情况下,会随机出现一定数量的蚂蚁来搜索食物。比如论文中:在
n r o w × n c o l 大小的图像中,随机生成K(ant_total_num)只蚂蚁:
temp = rand (ant_total_num, 2 );
ant_pos_idx(:,1 ) = round (1 + (nrow-1 ) * temp(:,1 ));
ant_pos_idx(:,2 ) = round (1 + (ncol-1 ) * temp(:,2 ));
蚂蚁在运动过程中所携带的信息素初始为:
p = 0.0001 .* ones(size(img));
2.构造解
论文中,edge detection这个问题的解(也是下一步移动的参考依据–转移概率)定义为:
p ( n ) ( l , m ) , ( i , j ) = ( τ ( n − 1 ) i , j ) α ( η i , j ) β ∑ ( i , j ) ∈ Ω ( l , m ) ( τ ( n − 1 ) i , j ) α ( η i , j ) β
Ω ( l , m ) 表示当前像素点的(i,j)的邻域,
η i , j 是启发式信息,也是能够检测边缘的决定部分。
论文中是这样定义
η i , j 的:
η ( i , j ) = 1 Z V c ( I i , j ) , Z = ∑ V c ( I )
其实就是利用亮度的差分运算来得到类边缘信息,因此这一步就相当于可以得到粗略的边缘了,下图是
η ( i , j ) (实验对象是cameraman.bmp:128*128)。
f ( ⋆ ) 表示一个成正相关的函数:
构造解之后,就进入下一步的更新,不断循环2-3。
3.信息素迭代更新
依据信息素随着时间的推移会减弱甚至完全消失,如果有不同的蚂蚁都经过同一路径,信息素可能会增强,按照经典的蚁群算法来更新信息素,每一只蚂蚁信息素的更新:
其中,
Δ ( k ) i , j 就是
η ( i , j ) ,
ρ 是常数。
全部蚂蚁按照上式更新完,进行下一轮迭代的更新:
设定停止迭代次数后,用二值化的方法能得到最终的边缘。
结果及结论
该论文默认参数得到的结果为:
对比发现,竟然不如上面的亮度差分得到的结果好,但是用蚁群算法,可以算的上是一个小创新。
其他的不足之处:
运行时间长,边缘出现断续,参数不好调 。这也是其他群体智能算法会有的缺点。