多模态————Flamingo算法
一、Flamingo算法核心算法
Flamingo又名火烈鸟优化算法,是一种模拟火烈鸟群体行为的元启发式优化算法,属于智能优化算法的范畴,核心灵感来自火烈鸟的群体觅食、社交聚集、迁徙三大行为:
- 觅食行为:火烈鸟会朝着食物浓度高的区域移动,对应算法中 “向最优解方向搜索”;
- 社交聚集:火烈鸟倾向于聚集在群体中心,避免孤立,对应算法中 “群体协作,平衡探索与开发”;
- 迁徙行为:当当前区域食物不足时,火烈鸟会整体迁徙到新区域,对应算法中 “跳出局部最优,全局探索”。
该算法的核心目标是通过模拟上述行为,在解空间中高效搜索最优解(如最小值 / 最大值问题),相比传统算法(如 PSO、GA),它在平衡 “探索(全局搜索)” 和 “开发(局部求精)” 上表现更优。
二、Flamingo算法数学公式
1.符号定义
,第 t 代第 i 只火烈鸟的位置。
,第 t 代全局最优火烈鸟的位置最优解。
,第 t 代火烈鸟群体的平均位置。
N,火烈鸟种群规模。
d,解空间维度。
α,觅食步长因子(通常 0<α<1)。
β,聚集因子(通常 β∈[0,2])。
r1,r2,随机数(0<r1,r2<1)。
P,迁徙概率(通常 P=0.1)。
2.算法计算流程
1. 觅食行为位置更新
火烈鸟向全局最优解方向移动,公式:
2. 社交聚集行为位置更新
火烈鸟向群体中心移动,平衡局部搜索,公式:
3. 迁徙行为(全局探索)
当随机数小于迁徙概率 P 时,火烈鸟随机迁徙到新位置,跳出局部最优:
其中
是解空间的上下界,r3 是随机数。
4. 综合位置更新
实际实现中,会融合上述三种行为。
三、实例代码解释
模块一:核心库导入
import numpy as np模块二:定义目标函数
def sphere_function(x): """ Sphere函数:用于测试优化算法的经典函数,最小值在x=0处,值为0 参数x:单个火烈鸟的位置(d维向量) 返回:函数值(越小越优) """ return np.sum(x**2)模块三:定义 Flamingo 算法类
class FlamingoOptimization: def __init__(self, pop_size=50, dim=2, max_iter=100, x_min=-10, x_max=10, alpha=0.5, beta=1.5, P=0.1): """初始化参数""" self.pop_size = pop_size # 种群规模(火烈鸟数量) self.dim = dim # 解空间维度(比如2维就是找(x1,x2)使函数最小) self.max_iter = max_iter # 最大迭代次数(算法终止条件) self.x_min = x_min # 解空间下界(比如x1/x2的最小值) self.x_max = x_max # 解空间上界 self.alpha = alpha # 觅食步长因子(控制向最优解移动的步长) self.beta = beta # 聚集因子(控制向群体中心移动的步长) self.P = P # 迁徙概率(触发全局探索的概率) # 初始化种群位置:随机生成50个2维向量,每个元素在[-10,10]之间 self.population = np.random.uniform(low=x_min, high=x_max, size=(pop_size, dim)) # 计算每个火烈鸟的适应度(目标函数值) self.fitness = np.array([sphere_function(ind) for ind in self.population]) # 找到初始全局最优:适应度最小的火烈鸟位置和值 self.gbest_pos = self.population[np.argmin(self.fitness)].copy() self.gbest_fit = np.min(self.fitness)模块四:单次迭代更新逻辑
def update(self): """单次迭代的位置更新逻辑(核心)""" # 计算种群平均位置(社交聚集的中心) mean_pos = np.mean(self.population, axis=0) for i in range(self.pop_size): # 生成随机数(用于公式中的r1, r2, r4) r1 = np.random.random() # 0-1之间的随机数,控制觅食步长的随机性 r2 = np.random.random() # 0-1之间的随机数,控制聚集步长的随机性 r4 = np.random.random() # 0-1之间的随机数,判断是否触发迁徙 if r4 > self.P: # 情况1:不触发迁徙,执行觅食+聚集行为 # 公式:X_i^{t+1} = X_i^t + α*r1*(X_best - X_i) + β*r2*(X_mean - X_i) self.population[i] = self.population[i] + \ self.alpha * r1 * (self.gbest_pos - self.population[i]) + \ self.beta * r2 * (mean_pos - self.population[i]) else: # 情况2:触发迁徙,随机生成新位置(全局探索) # 公式:X_i^{t+1} = X_min + r3*(X_max - X_min) r3 = np.random.random(size=self.dim) # 每个维度生成一个随机数 self.population[i] = self.x_min + r3 * (self.x_max - self.x_min) # 边界处理:确保位置不超出解空间(比如x1/x2不会小于-10或大于10) self.population[i] = np.clip(self.population[i], self.x_min, self.x_max) # 更新所有火烈鸟的适应度 self.fitness = np.array([sphere_function(ind) for ind in self.population]) # 更新全局最优:如果当前迭代的最优比历史最优更好,则替换 current_best_idx = np.argmin(self.fitness) current_best_fit = self.fitness[current_best_idx] if current_best_fit < self.gbest_fit: self.gbest_fit = current_best_fit self.gbest_pos = self.population[current_best_idx].copy()模块五:运行完整算法
def run(self): """运行完整的Flamingo算法""" for iter_num in range(self.max_iter): self.update() # 每次迭代执行位置更新 # 每10次迭代打印一次结果,监控算法收敛过程 if (iter_num + 1) % 10 == 0: print(f"迭代次数:{iter_num+1:3d} | 全局最优适应度:{self.gbest_fit:.6f}") return self.gbest_pos, self.gbest_fit模块六:主函数运行
if __name__ == "__main__": # 初始化算法实例 fo = FlamingoOptimization( pop_size=50, # 50只火烈鸟 dim=2, # 2维解空间 max_iter=100, # 迭代100次 x_min=-10, # 解空间下界-10 x_max=10 # 解空间上界10 ) # 运行算法 best_pos, best_fit = fo.run() # 输出最终结果 print("\n==================== 最终结果 ====================") print(f"最优位置:{best_pos}") print(f"最优适应度(函数最小值):{best_fit:.6f}")运行结果
迭代次数: 10 | 全局最优适应度:0.004721
迭代次数: 20 | 全局最优适应度:0.000925
迭代次数: 30 | 全局最优适应度:0.000121
迭代次数: 40 | 全局最优适应度:0.000121
迭代次数: 50 | 全局最优适应度:0.000121
迭代次数: 60 | 全局最优适应度:0.000121
迭代次数: 70 | 全局最优适应度:0.000121
迭代次数: 80 | 全局最优适应度:0.000121
迭代次数: 90 | 全局最优适应度:0.000121
迭代次数:100 | 全局最优适应度:0.000121
==================== 最终结果 ====================
最优位置:[0.01060456 0.00298532]
最优适应度(函数最小值):0.000121
- 核心结论:这份结果表明 Flamingo 算法有效收敛到了 Sphere 函数的近最优解,最优位置接近 (0,0),适应度 0.000121 是极小值,算法达到了优化目标;
- 收敛特征:前 30 次快速收敛,30 次后停滞,体现了元启发式算法 “先探索、后开发” 的典型特征;
- 结果准确性:最优适应度和最优位置的计算完全匹配,验证了代码实现的正确性,只是受参数 / 迭代次数限制未达到理论最优(0)。
四、总结
- 核心逻辑:Flamingo 算法通过模拟火烈鸟的觅食(向最优解移动)、聚集(向群体中心移动)、迁徙(全局探索)行为,平衡 “探索” 和 “开发”,实现最优解搜索;
- 数学核心:位置更新公式分为 “觅食 + 聚集”(局部求精)和 “迁徙”(全局探索)两部分,通过随机数和概率控制行为切换;
- 代码关键:核心是种群位置的迭代更新,需注意边界处理、适应度计算和全局最优的实时更新,确保算法收敛。