1. 头脑风暴算法简介
(以下描述,均不是学术用语,仅供大家快乐的阅读)
可能大家对“头脑风暴”这个词不怎么熟,毕竟是外来词汇,其大概含义就是分组讨论,畅所欲言。
头脑风暴算法(Brain Storm Optimization)是根据人们进行“头脑风暴”讨论困难问题的解决方案的过程而提出的优化算法。算法提出于2011年,很高兴,这又是一个中国人提出的优化算法,不过该算法的描述和实现都比较复杂,相关的论文也不多,大家可以尝试对其进行“开发”。
头脑风暴算法中,每个人的位置(idea,描述为位置更好理解)表示解空间中的一个可行解。群体将会被分为几组来进行它们的头脑风暴,每组中位置最好的人被称为该组的leader,也叫聚类中心。每个个体有两种方式来到达新的位置:独自思考,融合思考,而每个组的leader还有一种新的方式:随机思考。每个人将根据一定的规则选取其移动方式,并选择是否更新为这个新的idea。具体实现比较复杂,下一节将详细描述。
2. 算法流程
人群中的个体数量为N, 其idea(位置,其实还是用位置来描述更加方便)为 ,其适应度值为 。
头脑风暴算法大体分为两步:
- 划分聚类:将群体划分为几个小组。
- 更新位置:每个人根据不同的策略来更新自己的idea。
2.1划分聚类
划分聚类这一步其实很简单,就是将群体划分为m个组。然后以组为单位进行头脑风暴更新位置。
划分聚类的策略有很多,可以随机分组,也可以使用聚类算法如:k-means,fuzzy-c-means等聚类算法。
原文的聚类选择了k-means聚类算法,k=5。
k-means简述:
1. 群体中随机设置k个聚类中心。
2. 所有个体自动归类为距自己最近的中心。
3. 更新聚类中心为该聚类的重心。
4. 直到聚类中心不再变动,否则跳至步骤2。
5. 输出4中得到的聚类中心所划分的聚类。
个人认为聚类步骤不应过于复杂,可以直接将群体随机分成m组,也可以使用N mod m 来进行分组,以保证各组人数差别不会太大。
分组完成后,将每一组中最优个体作为该组的聚类中心。
2.2更新位置
更新位置这一步中,算法使用了三种策略来更新个体的idea:
1. 随机思考:在解空间内重置该个体的idea。
2. 独自思考:选择一个人,并在其idea周围搜索。
3. 融合他人:选择两个人,融合这两个人的位置为一个新的idea。
2.2.1随机思考
随机思考是一个简单的随机步骤,即在解空间内随机生成一个idea,可以看做是一个跳出局部最优的步骤,只有成为聚类中心的个体才有该操作。
2.2.2独自思考
独自思考步骤将会针对自己的idea进行小幅度的修改,产生一个新的idea。如果新idea优于原来的idea,则替换之。具体的实现公式如下:
其中 表示第i个个体新产生的idea的第d维的值。T为最大迭代次数,t为当前迭代次数;n为正态分布随机数,一般取值为标准正态分布,r为(0,1)内的均匀分布随机数,k为常数,一般取值为20。
从公式可以看出,新的idea将会在原idea附近产生,从整体上看,这个步骤为算法提供了局部搜索操作。
2.2.3融合他人
在原文中并没有看到融合的具体细节。
不过好在其他论文中有提及,具体公式如下:
其中A和B为选定的进行融合的两个个体,r为取值在(0,1)内的均匀随机数。
如果Xnew优于A,则用该idea替换A的idea,否则,再看该idea是否优于B的idea,若更优则替换否则保持B的idea不变。
可以看出产生的新的idea位于选定的两个idea之间,实现也比较简单。该操作为算法提供了部分全局搜索能力。但也有一个问题,与万有引力算法类似,该操作产生的新idea位于当前所有idea围成的凸包内,当最优的idea不在此范围内时,难以到达最优idea附近。
如上图,A,B,C为三个向量,其中C=rA+(1-r)B,r为(0,1)内的均匀随机数,可知C的范围为AB之间。
当r取值为(0,2)内的均匀随机数时,C的取值范围如下。
可以看出C可以去到AB之外的值。由于AB是随机选择的,即C=rA+(1-r)B与C=C=rB+(1-r)A都可能出现,所有r取(0,2)内的均匀随机数即可。
当然我们也可以组合个体A和个体B的idea成为一个新的idea,此时随机取r为0或1即可。
2.3算法步骤
上面介绍了算法的基本步骤,但原论文里写的要比上面复杂很多。主要复杂在其步骤上,下面结合上述的基本步骤,理一理算法的实际实现步骤。
参数对应原论文中的参数,p5a = 0.2,p6b = 0.8,p6b3 = 0.4,p6c = 0.5。
Rand为(0,1)内的均匀随机数,每个步骤会重新计算。
流程图也有点复杂,总共有五个步骤:
1. 随机思考:随机选择聚类中心进行随机思考操作
2. 独自思考:随机选择聚类中心进行独自思考操作
3. 独自思考:随机选择个体进行独自思考操作
4. 融合思考:随机选择2个聚类中心进行融合思考操作
5. 融合思考:随机选择2个个体进行融合思考操作
算法每次迭代会使用上述5个步骤产生N个新的idea。若进行了随机思考操作,那么其他操作会产生N-1个idea,若没有进行随机思考操作,则其他操作会产生N个新idea。
算法虽复杂,但其结构比较有规则,梳理清晰后还是比较好理解和记忆的。
3.实验
适应度函数。
实验一:
值 | |
---|---|
问题维度(维度) | 2 |
总群数量(种群数) | 20 |
最大迭代次数 | 50 |
k | 20 |
划分聚类 | 随机分组 |
分组数m | 5 |
融合随机数r | Rand(0,1) |
取值范围 | (-100,100) |
实验次数 | 10 |
值 | |
---|---|
最优值 | 4.6314656772629463E-4 |
最差值 | 1067.9359409478532 |
平均值 | 305.88935862391594 |
从结果可以看出算法可以得到不错的结果,也有很差的结果,图像我选取了较差的结果的图像。从图像可以看出群体仍在不断向目标位置靠近,但是由于迭代次数较少,还没到达目标位置迭代已经结束。可以看出该条件下算法的收敛速度较慢,但有着不错的局部搜索精度。
实验二:选取k-means为聚类方式
值 | |
---|---|
问题维度(维度) | 2 |
总群数量(种群数) | 20 |
最大迭代次数 | 50 |
k | 20 |
划分聚类 | k-means |
分组数m | 5 |
融合随机数r | Rand(0,1) |
取值范围 | (-100,100) |
实验次数 | 10 |
值 | |
---|---|
最优值 | 0.20909178232205813 |
最差值 | 1321.371927178569 |
平均值 | 353.9612645125847 |
从图像和结果可以看出,使用k-means算法进行聚类的结果与使用随机分组的策略进行聚类的结果相差不多,不过好像个体聚集的好像较为密集,有点容易陷入局部最优。如图,群体还没聚集到目标解附近时较为集中并开始了局部搜索,此时虽然可能有聚类中心会通过随机步骤跳出局部最优,但之后它有更大的概率与其他聚类中心融合并重新向群体聚集。
实验三:融合过程随机数选取rand(0,2)
值 | |
---|---|
问题维度(维度) | 2 |
总群数量(种群数) | 20 |
最大迭代次数 | 50 |
k | 20 |
划分聚类 | 随机分组 |
分组数m | 5 |
融合随机数r | Rand(0,2) |
取值范围 | (-100,100) |
实验次数 | 10 |
值 | |
---|---|
最优值 | 1.4165053625505455E-4 |
最差值 | 60.64675577646573 |
平均值 | 14.389005547297723 |
结果比之前好了不少,但从图像可以看出,群体没有那么集中,聚集的没有那么快,而且个体移动的幅度较大。修改了融合步骤的随机数后,算法的全局搜索能力有了提升,但收敛速度下降了不少,群体还没有聚集到一块算法已经运行完毕。不过从图像的趋势可以看出,如果能增加迭代次数,算法能够得到更好的结果。
实验四:融合过程随机数选取rand{0,1}
值 | |
---|---|
问题维度(维度) | 2 |
总群数量(种群数) | 20 |
最大迭代次数 | 50 |
k | 20 |
划分聚类 | 随机分组 |
分组数m | 5 |
融合随机数r | Rand{0,1} |
取值范围 | (-100,100) |
实验次数 | 10 |
值 | |
---|---|
最优值 | 2.9866482236668317E-5 |
最差值 | 447.3550076153455 |
平均值 | 123.7297434413936 |
实验四的结果不如实验三,它的问题和实验一类似,当目标的各个维度距群体较远时,则较难快速向目标位置靠近。实验三的策略类似于遗传算法的交叉步骤,从图像可以看出,群体总是在一个类似十字架的形状上移动,但当所有个体的某一维度距离目标位置,群体将难以到达目标位置。既然如此,可以将融合步骤改为类似差分进化算法的交叉步骤,相信会有不错的效果,但是融合所需的个体也将由2个变为3个,具体的实现留给大家自己实现吧。
4.总结
头脑风暴算法是根据人们运用头脑风暴方法思考问题而提出的优化算法。算法原文描述比较复杂,但究其本质,还是一个将群体分组,并按组进行搜索的算法,在已有算法中也有不少算法采用了类似的策略,比如人工蜂群算法(按蜜源分组),萤火虫算法改进版(分簇萤火虫算法),蛙跳算法(取模分组)。
头脑风暴结合了聚类算法进行分组,与随机分组相较各有利弊,聚类算法将选取较为集中的个体集中搜索,但易陷入局部最优,不过可以通过改进聚类算法的“距离”的定义来避免,不使用直接的个体位置计算距离,也可以考虑将其适应度函数作为权重。
算法主要有随机思考,独自思考,融合思考三个搜索步骤,分别提供了跳出局部最优能力,局部搜索能力和全局搜索能力。从实验图像可知,由于随机思考步骤,有不少距目标位置较近的点莫名的消失了,这对整体来说损失了不少的精度,并降低了算法的收敛速度。故可以考虑保留全局最优个体,当其进行随机思考时进行贪婪算法过滤新解或者直接不能选择该个体进行随机思考操作。
参考文献
Cheng S , Qin Q , Chen J , et al. Brain storm optimization algorithm[J]. Artificial Intelligence Review, 2016. 提取码:d5it
El-Abd M . Global-best Brain Storm Optimization Algorithm[J]. Swarm and Evolutionary Computation, 2017, 37.提取码:0lax
以下指标纯属个人yy,仅供参考
指标 | 星数 |
---|---|
复杂度 | ★★★★★★★☆☆☆ |
收敛速度 | ★★★★☆☆☆☆☆☆ |
全局搜索 | ★★★★★☆☆☆☆☆ |
局部搜索 | ★★★★★★☆☆☆ |
优化性能 | ★★★★★★☆☆☆☆ |
跳出局部最优 | ★★☆☆☆☆☆☆☆☆ |
改进点 | ★★★★☆☆☆☆☆☆ |