DE算法理解与实验

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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值