前言
这段时间用过这个算法做过相关的工作,今天就介绍一下吧。虽然感觉效果嘛,勉勉强强啦。不过每种算法肯定有其适用的地方,用到了就Mark一下方便后人吧~
介绍
帝国竞争算法(imperialist competitive algorithm,ICA)是Atashpaz-Gargari和Lucas于2007年提出的一种基于帝国主义殖民竞争机制的进化算法,属于社会启发的随机优化搜索方法。目前,ICA已被成功应用于多种优化问题中,如调度问题、分类问题和机械设计问题等。[2]
帝国主义竞争算法,借鉴了人类历史上政治社会殖民阶段帝国主义国家之间的竞争、占领、吞并殖民殖民地国家从而成为帝国国家的演化,是一种全局性的优化算法。该算法把所有初始化的个体都称作国家,按照国家势力分成帝国主义国家及殖民地两种,前者优势大于后者。[1]
其实,从另一个角度来看,ICA可以被认为是遗传算法(GA)的社会对应物。ICA是基于人类社会进化的过程,而GA是基于物种的生物进化过程。二者其实有异曲同工之妙。
不过话说回来,大多数群体仿生类算法都有异曲同工之妙~
流程图
学习算法框架,当然先搞懂流程图啦。算法的流程图我就不重新画了,找了一篇文献上的直接挪过来:[1]
整个流程大体如上,可能大家在其他地方看到的有些专有名词可能对不上,但描述的都是一个东西,本质是一样的。我们下面来一步步分析这个过程吧。
算法解析
其实和群体进化类算法还是非常像的,只不过把个体
的概念换成了国家
而已。我们一步步来看。
1. 初始化
ICA的个体是国家,相当于遗传算法中的染色体,对于一个N维的优化问题,国家可以表示成如下形式:
c o u n t r y = [ p 1 , p 2 , . . . , p N ] country =[p1, p2, ..., pN] country=[p1,p2,...,pN]
国家的势力大小通过代价函数来衡量:
c o s t = f ( c o u n t r y ) = f ( [ p 1 , p 2 , . . . , p N ] ) cost = f (country) = f ([p1, p2, ..., pN]) cost=f(country)=f([p1,p2,...,pN])
国家的势力和代价函数值成反比,即代价函数值越小,国家势力越大。初始帝国的产生分为以下几个步骤:
STEP 1:首先,随机产生$ N_{pop} 个 国 家 , 从 中 选 出 势 力 较 大 的 前 个国家,从中选出势力较大的前 个国家,从中选出势力较大的前 N_{imp} 个 国 家 作 为 帝 国 主 义 国 家 , 剩 下 的 个国家作为帝国主义国家,剩下的 个国家作为帝国主义国家,剩下的 N_{col} $个国家作为殖民地。
STEP 2:其次,根据帝国主义国家的势力大小划分殖民地。每个帝国的殖民地个数按照式(1)~(3)计算:
C n = c n − max i { c i } (1) C_{n}=c_{n}-\max _{i}\left\{c_{i}\right\} \tag{1}