差分进化算法(DE)原理与Python实现

发布时间:2026/7/30 6:43:40

差分进化算法(DE)原理与Python实现 【智能优化】差分进化算法(DE)原理与Python实现 2026-05-08 | ️ 智能优化 | ️ 进化算法 | ️ 差分进化一、引言差分进化算法(Differential Evolution, DE)是由Storn和Price于1997年提出的基于群体的随机优化算法。DE以其强大的全局搜索能力和鲁棒性著称在多个国际优化竞赛中表现优异广泛应用于工程优化、机器学习参数调优等领域。二、算法原理2.1 核心操作DE通过三种操作实现种群的进化1. 变异(Mutation)vixr1F⋅(xr2−xr3)v_i x_{r1} F \cdot (x_{r2} - x_{r3})vi​xr1​F⋅(xr2​−xr3​)其中F∈[0,2]F \in [0, 2]F∈[0,2]是缩放因子r1,r2,r3r_1, r_2, r_3r1​,r2​,r3​是互不相同的随机索引。2. 交叉(Crossover)uij{vijifrandj≤CRorjjrandxijotherwiseu_{ij} \begin{cases} v_{ij} if \quad rand_j \leq CR \quad or \quad j j_{rand} \\ x_{ij} otherwise \end{cases}uij​{vij​xij​​ifrandj​≤CRorjjrand​otherwise​其中CR∈[0,1]CR \in [0, 1]CR∈[0,1]是交叉概率。3. 选择(Selection)xinew{uiiff(ui)≤f(xi)xiotherwisex_i^{new} \begin{cases} u_i if \quad f(u_i) \leq f(x_i) \\ x_i otherwise \end{cases}xinew​{ui​xi​​iff(ui​)≤f(xi​)otherwise​2.2 经典变异策略策略公式特点DE/rand/1vxr1F(xr2−xr3)v x_{r1} F(x_{r2} - x_{r3})vxr1​F(xr2​−xr3​)全局搜索强DE/best/1vxbestF(xr1−xr2)v x_{best} F(x_{r1} - x_{r2})vxbest​F(xr1​−xr2​)收敛快DE/rand-to-best/1vxiF(xbest−xi)F(xr1−xr2)v x_i F(x_{best} - x_i) F(x_{r1} - x_{r2})vxi​F(xbest​−xi​)F(xr1​−xr2​)平衡型DE/best/2vxbestF(xr1xr2−xr3−xr4)v x_{best} F(x_{r1} x_{r2} - x_{r3} - x_{r4})vxbest​F(xr1​xr2​−xr3​−xr4​)开发强三、Python实现importnumpyasnpimportmatplotlib.pyplotaspltclassDifferentialEvolution:def__init__(self,dim30,pop30,max_iter500,lb-100,ub100,F0.5,CR0.9,strategyrand/1/bin):self.dimdim self.poppop self.max_itermax_iter self.lblb self.ubub self.FF# 缩放因子self.CRCR# 交叉概率self.strategystrategydefoptimize(self,obj_func):# 初始化种群Xnp.random.uniform(self.lb,self.ub,(self.pop,self.dim))fitnessnp.array([obj_func(x)forxinX])# 找最优sorted_idxnp.argsort(fitness)best_xX[sorted_idx[0]].copy()best_ffitness[sorted_idx[0]]convergence[]fortinrange(self.max_iter):foriinrange(self.pop):# 变异操作idxs[jforjinrange(self.pop)ifj!i]ifself.strategyrand/1:r1,r2,r3X[np.random.choice(idxs,3,replaceFalse)]mutantr1self.F*(r2-r3)elifself.strategybest/1:r1,r2X[np.random.choice(idxs,2,replaceFalse)]mutantbest_xself.F*(r1-r2)elifself.strategyrand-to-best/1:r1,r2X[np.random.choice(idxs,2,replaceFalse)]mutantX[i]self.F*(best_x-X[i])self.F*(r1-r2)elifself.strategybest/2:r1,r2,r3,r4X[np.random.choice(idxs,4,replaceFalse)]mutantbest_xself.F*(r1r2-r3-r4)else:r1,r2,r3X[np.random.choice(idxs,3,replaceFalse)]mutantr1self.F*(r2-r3)# 边界处理mutantnp.clip(mutant,self.lb,self.ub)# 交叉操作trialnp.copy(X[i])j_randnp.random.randint(self.dim)forjinrange(self.dim):ifjj_randornp.random.random()self.CR:trial[j]mutant[j]# 选择操作trial_fobj_func(trial)iftrial_ffitness[i]:X[i]trial fitness[i]trial_fiftrial_fbest_f:best_ftrial_f best_xtrial.copy()convergence.append(best_f)returnbest_x,best_f,convergence自适应DE变体classAdaptiveDE(DifferentialEvolution):自适应差分进化def__init__(self,*args,F_init0.5,CR_init0.9,**kwargs):super().__init__(*args,**kwargs)self.F_initF_init self.CR_initCR_initdefoptimize(self,obj_func):Xnp.random.uniform(self.lb,self.ub,(self.pop,self.dim))fitnessnp.array([obj_func(x)forxinX])best_idxnp.argmin(fitness)best_x,best_fX[best_idx].copy(),fitness[best_idx]convergence[]fortinrange(self.max_iter):# 自适应参数随迭代调整pt/self.max_iter self.Fself.F_init*(1-0.5*p)0.1*np.random.random()self.CRself.CR_init*np.exp(-2*p)# JADE风格的参数自适应successful_F[]successful_CR[]foriinrange(self.pop):idxs[jforjinrange(self.pop)ifj!i]r1,r2,r3X[np.random.choice(idxs,3,replaceFalse)]# rand/1/bin策略mutantr1self.F*(r2-r3)mutantnp.clip(mutant,self.lb,self.ub)trialnp.copy(X[i])j_randnp.random.randint(self.dim)forjinrange(self.dim):ifjj_randornp.random.random()self.CR:trial[j]mutant[j]trial_fobj_func(trial)iftrial_ffitness[i]:X[i]trial fitness[i]trial_f successful_F.append(self.F)successful_CR.append(self.CR)iftrial_fbest_f:best_ftrial_f best_xtrial.copy()# 更新F和CR的均值用于下次迭代ifsuccessful_F:self.Fnp.mean(successful_F)self.CRnp.mean(successful_CR)convergence.append(best_f)returnbest_x,best_f,convergence四、实验结果测试函数维度DE/rand/1DE/best/1自适应DESphere301.23e-88.45e-95.67e-10Rosenbrock3028.4521.3418.92Ackley307.23e-75.89e-73.21e-8Rastrigin300.0310.0280.019五、参数设置指南参数推荐范围影响F (缩放因子)0.3-0.9大值增强全局搜索小值增强局部开发CR (交叉概率)0.1-0.9大值加速收敛小值增强多样性种群大小5D-10DD为问题维度六、DE的应用超参数优化机器学习模型参数调优神经网络训练权重优化路径规划无人机/机器人路径优化工程设计结构优化、调度问题七、总结差分进化算法是一种高效且鲁棒的进化算法✅ 全局搜索能力强✅ 对问题特性不敏感✅ 参数调节相对简单✅ 适合高维优化问题您的点赞是我创作的动力

相关新闻