当麋鹿开始玩优化:聊聊这个奇葩算法IEHO
[改进]改进麋鹿群优化算法IEHO。 (Elk herd optimizerEHO)是一种新型的元启发式算法智能优化算法灵感来自麋鹿群的繁殖过程。 该算法由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, keylambda x:x.fitness) return sorted_elk[:self.population_size]这里有个设计细节动态分组时强壮的leader会分配到更多追随者类似自然界中的赢家通吃[改进]改进麋鹿群优化算法IEHO。 (Elk herd optimizerEHO)是一种新型的元启发式算法智能优化算法灵感来自麋鹿群的繁殖过程。 该算法由Mohammed等学者发布于SCI 2区期刊《Artificial Intelligence Review》采用多种改进策略进行改进。 EHO原理 麋鹿有两个主要的繁殖季节:发情期和产犊期。 在发情季节麋鹿群分成大小不一的不同家庭。 这种划分是基于公鹿之间争夺统治权更强壮的公鹿可以组成一个拥有大量后宫的家庭。 在产犊季节每个家族都会从公鹿和后宫中孕育新的小鹿。 这种灵感是在优化环境中设置的其中优化循环由三个操作符组成:车辙季节产犊季节和选择季节。 在选择季节所有的家族都合并在一起包括公鹿、母鹿和小鹿。 最适合的麋鹿群将被挑选出来用于即将到来的发情和产犊季节。 简而言之EHO将种群分成一组每组在发情季节有一个领导者和几个追随者。 追随者的数量是根据其领导群体的适应度值来确定的。 在产犊季节每个群体都会根据其领导者和追随者产生新的解决方案。 所有群体的成员包括领导者、追随者和新解决方案都被组合在一起在选择季节选择最适合的群体。改进点才是重点原版EHO在分组策略上比较死板改进版IEHO做了三个关键调整弹性分组策略不再固定每个组的追随者数量而是根据适应度动态分配扰动产犊机制生小鹿时加入了高斯扰动避免早熟收敛精英保留策略每代保留前5%的优质解防止好基因丢失比如产犊时的扰动实现def _mutate_offspring(parent, sigma0.1): # 在父代基础上加高斯噪声 new_params parent.params np.random.normal(0, sigma, sizeparent.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个人心得这种生物启发算法最有趣的地方在于看似无厘头的生物行为转化成数学模型后居然真的能用。不过要注意参数设置比如群体数量太少的话公鹿们可能还没开打就全灭在局部最优里了。另外实践发现加入柯西变异代替高斯有时效果更好可能因为柯西分布的长尾特性更适合跳出深坑。最后吐槽一句这算法要是用在多目标优化上会不会出现公鹿们既要抢地盘又要当暖男的场景想想还挺带感的...手动狗头