DE——速度最快的进化算法。
特点:包括变异、交叉和选择三个步骤。模拟了群体中的个体的合作与竞争的过程。变异向量由父代差分向量生成,并与父代个体向量交叉生成新个体向量,直接与其父代个体进行选择。
优点:算法原理简单,控制参数少,只有交叉概率和缩放比例因子,鲁棒性强,易于实现。
初始化种群的表示:X基因,个体,代数,宏观时,小如基因看不到,常被隐藏。
交叉:两父体,父v必给一个j=jrand的基因,父v给出rand<=cr交叉概率的基因,父x给出rand>cr的基因。其中,rand是随机分配的。组成的个体为u,它拥有两父体的等位基因。
算法步骤
step1:确定差分进化算法控制参数,确定适应度函数。差分进化算法控制参数包括:种群大小NP、缩放因子F与杂交概率CR。
step2:随机产生初始种群。
step3:对初始种群进行评价,即计算初始种群中每个个体的适应度值。
step4:判断是否达到终止条件或进化代数达到最大。若是,则终止进化,将得到最佳个体作为最优解输出;若否,继续。
step5:进行变异和交叉操作,得到中间种群。
step6:在原种群和中间种群中选择个体,得到新一代种群。
step7:进化代数g=g+1,转step4。
实验:用DE求函数的最值
第一个函数为y=
def obj_func(u):
#f的函数
f = (np.pi)*(np.exp(u**2))
return f[0]
进化的结果如下,比较符合y的最小值。
第一个函数为y=+cosx
def obj_func(u):
#f的函数
#f = np.cos(u) * np.exp(-(u - np.pi) ** 2)
f = (np.pi)*(np.exp(u**2))+np.cos(u)
return f[0]
进化的结果如下,与求导求最值得到的结果相差无几。
这说明,DE算法得到的结果还是比较准确的。
源代码如下:
import numpy as np # 定义一些参数 POPULATION = 10 F = 0.7 P_CROSS = 0.9 MAX_ITER = 50 LAM = 1e15 print("-------------------------------------------------------------") lb = np.array([-10]) ub = np.array([10]) def obj_func(u): #f的函数 #f = np.cos(u) * np.exp(-(u - np.pi) ** 2) f = (np.pi)*(np.exp(u**2))+np.cos(u) return f[0] # 初始化 s = np.zeros((POPULATION, len(lb))) fitness = np.zeros(POPULATION) for i in range(POPULATION): s[i] = lb + (ub - lb) * np.random.rand(len(lb)) fitness[i] = obj_func(s[i]) i = 0 f_opt = np.min(fitness) u_opt = s[np.argmin(fitness)] # 开始DE while i < MAX_ITER: i += 1 k = np.random.randint(0, POPULATION, 2) v = s + F * (s[k[0]] - s[k[1]]) for x in v: for p in range(len(x)): if x[p] > ub[p]: x[p] = ub[p] if x[p] < lb[p]: x[p] = lb[p] is_cross = np.random.rand(POPULATION * len(lb)).reshape((POPULATION, len(lb))) < P_CROSS v = s * (1 - is_cross) + v * is_cross for p in range(POPULATION): f_new = obj_func(v[p]) if f_new <= fitness[p]: s[p] = v[p] fitness[p] = f_new if f_new < f_opt: f_opt = f_new u_opt = v[p] print(u_opt, f_opt, sep='\t') print("The solution is:", u_opt) print("The objective value is:", f_opt)