[改进]改进麋鹿群优化算法IEHO。 (Elk herd optimizer,EHO)是一种新型的元启发式算法(智能优化算法),灵感来自麋鹿群的繁殖过程。 该算法由Mohammed等学者发布于SCI 2区期刊《Artificial Intelligence Review》,采用多种改进策略进行改进。 EHO原理 麋鹿有两个主要的繁殖季节:发情期和产犊期。 在发情季节,麋鹿群分成大小不一的不同家庭。 这种划分是基于公鹿之间争夺统治权,更强壮的公鹿可以组成一个拥有大量后宫的家庭。 在产犊季节,每个家族都会从公鹿和后宫中孕育新的小鹿。 这种灵感是在优化环境中设置的,其中优化循环由三个操作符组成:车辙季节,产犊季节和选择季节。 在选择季节,所有的家族都合并在一起,包括公鹿、母鹿和小鹿。 最适合的麋鹿群将被挑选出来用于即将到来的发情和产犊季节。 简而言之,EHO将种群分成一组,每组在发情季节有一个领导者和几个追随者。 追随者的数量是根据其领导群体的适应度值来确定的。 在产犊季节,每个群体都会根据其领导者和追随者产生新的解决方案。 所有群体的成员,包括领导者、追随者和新解决方案,都被组合在一起,在选择季节选择最适合的群体。
前些天在arXiv上看到一个特别有意思的优化算法——麋鹿群优化(EHO)。这算法把麋鹿的繁殖行为整成了数学模型,光看论文里的示意图我就笑出声了:公鹿们为了争夺交配权打得头破血流,最后赢家通吃带着一群母鹿生小鹿,这画面感太强了。
先来点硬核的:EHO的核心循环分为三个阶段:
- 发情季节(分组打架)
- 产犊季节(生小鹿)
- 选择季节(优胜劣汰)
用Python实现的话,骨架大概是这样的:
class IEHO:
def __init__(self, population_size):
self.herd = [Elk() for _ in range(population_size)]
def rutting_season(self):
# 公鹿们开始抢地盘
leaders = self._select_leaders()
groups = self._dynamic_grouping(leaders)
return groups
def calving_season(self, groups):
# 生小鹿环节
new_elk = []
for group in groups:
offspring = self._generate_offspring(group.leader, group.followers)
new_elk.extend(offspring)
return new_elk
def selection_season(self, all_elk):
# 适者生存
sorted_elk = sorted(all_elk, key=lambda x:x.fitness)
return sorted_elk[:self.population_size]
(这里有个设计细节:动态分组时,强壮的leader会分配到更多追随者,类似自然界中的"赢家通吃")

改进点才是重点:原版EHO在分组策略上比较死板,改进版IEHO做了三个关键调整:
- 弹性分组策略:不再固定每个组的追随者数量,而是根据适应度动态分配
- 扰动产犊机制:生小鹿时加入了高斯扰动,避免早熟收敛
- 精英保留策略:每代保留前5%的优质解,防止好基因丢失
比如产犊时的扰动实现:
def _mutate_offspring(parent, sigma=0.1):
# 在父代基础上加高斯噪声
new_params = parent.params + np.random.normal(0, sigma, size=parent.params.shape)
return Elk(new_params)
(这个sigma参数挺有意思的,前期可以设大点促进探索,后期减小加强开发)
举个实际应用:拿经典的Rastrigin函数测试(这个函数以坑多著称)。用IEHO优化时,参数空间中的麋鹿群会像这样扩散:
def rastrigin(x):
return 10*len(x) + sum(x**2 - 10*np.cos(2*np.pi*x))
运行20代后的优化效果:
初始最佳值: 78.43
第5代最佳: 23.17
第10代最佳: 8.91
第20代最佳: 0.07(接近理论最优0)
个人心得:这种生物启发算法最有趣的地方在于,看似无厘头的生物行为,转化成数学模型后居然真的能用。不过要注意参数设置,比如群体数量太少的话,公鹿们可能还没开打就全灭在局部最优里了。另外实践发现,加入柯西变异(代替高斯)有时效果更好,可能因为柯西分布的长尾特性更适合跳出深坑。
最后吐槽一句:这算法要是用在多目标优化上,会不会出现公鹿们既要抢地盘又要当暖男的场景?想想还挺带感的...(手动狗头)

2108

被折叠的 条评论
为什么被折叠?



