python:差分进化算法(Differential Evolution,DE)求解23个测试函数(提供python代码)

一、差分进化算法

差分进化算法(Differential Evolution,DE)于1997年由Rainer Storn和Kenneth Price在遗传算法等进化思想的基础上提出的。差分进化思想来源即是早期提出的遗传算法(GeneticAlgorithm,GA),模拟遗传学中的杂交(crossover)、变异(mutation)、复制(reproduction)来设计遗传算子。差分进化算法相对于遗传算法而言,相同点都是通过随机生成初始种群,以种群中每个个体的适应度值为选择标准,主要过程也都包括变异、交叉和选择三个步骤。不同之处在于遗传算法是根据适应度值来控制父代杂交,变异后产生的子代被选择的概率值,在最大化问题中适应值大的个体被选择的概率相应也会大一些。而差分进化算法变异向量是由父代差分向量生成,并与父代个体向量交叉生成新个体向量,直接与其父代个体进行选择。显然差分进化算法相对遗传算法的逼近效果更加显著。差分进化算法原理:差分进化算法(Differential Evolution)-CSDN博客

二、差分进化算法求解23个函数

23个函数基本信息:

测试集:23组基本测试函数简介及图像(提供python代码)_IT猿手的博客-CSDN博客

部分代码:

from FunInfo import Get_Functions_details
from DE import DE
import matplotlib.pyplot as plt
#主程序
function_name =8 #测试函数1-23
SearchAgents_no = 50#种群大小
Max_iter = 100#迭代次数
lb,ub,dim,fobj=Get_Functions_details(function_name)#获取问题信息
BestX,BestF,curve = DE(SearchAgents_no, Max_iter,lb,ub,dim,fobj)#问题求解


#画收敛曲线图
if BestF>0:
    plt.semilogy(curve,color='b',linewidth=3,label='DE')
else:
    plt.plot(curve,color='b',linewidth=3,label='DE')
plt.xlabel("Iteration")
plt.ylabel("Fitness")
plt.xlim(0,Max_iter)
plt.title("F"+str(function_name))
plt.legend()
plt.savefig(str(function_name)+'.png')
plt.show()
print('\nThe best solution is:\n'+str(BestX))
print('\nThe best optimal value of the objective funciton is:\n'+str(BestF))

部分结果:

三、完整python代码

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用差分进化算法求解香蕉函数最小值的Python代码: ```python import numpy as np # 定义香蕉函数 def banana(x): return (1-x[0])**2 + 100*(x[1]-x[0]**2)**2 # 定义差分进化算法 def differential_evolution(func, bounds, popsize=20, mutation=0.8, recombination=0.7, maxiter=1000): # 随机生成初始种群 dimensions = len(bounds) pop = np.random.rand(popsize, dimensions) min_b, max_b = np.asarray(bounds).T diff = np.fabs(min_b - max_b) pop_denorm = min_b + pop * diff # 迭代优化 for i in range(maxiter): # 变异操作 mutant = pop[np.random.randint(0, popsize, popsize), :] for j in range(popsize): idxs = np.arange(popsize) != j a, b, c = mutant[np.random.choice(idxs, 3, replace=False)] mutant[j] = np.clip(a + mutation * (b - c), 0, 1) # 交叉操作 cross_points = np.random.rand(popsize, dimensions) < recombination if not np.any(cross_points): cross_points[np.random.randint(0, popsize), np.random.randint(0, dimensions)] = True pop_new = np.where(cross_points, mutant, pop) # 选择操作 pop_denorm_new = min_b + pop_new * diff scores = np.asarray([func(ind) for ind in pop_denorm]) scores_new = np.asarray([func(ind) for ind in pop_denorm_new]) idx = scores_new < scores pop[idx] = pop_new[idx] # 返回最优解和最优值 return min_b + pop[np.argmin(scores)] # 定义搜索范围 bounds = [(-10, 10), (-10, 10)] # 调用差分进化算法求解最小值 result = differential_evolution(banana, bounds) # 输出结果 print("最小值点:", result) print("最小值:", banana(result)) ``` 在上述代码中,首先定义了香蕉函数 `banana(x)`,然后定义了差分进化算法 `differential_evolution()`,其中包括随机生成初始种群、变异操作、交叉操作和选择操作等步骤。最后定义了搜索范围并调用差分进化算法求解最小值,输出结果为最小值点和最小值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值