差分进化算法DE和粒子群算法PSO

您所在的位置:网站首页 PSO优化算法 差分进化算法DE和粒子群算法PSO

差分进化算法DE和粒子群算法PSO

2023-04-23 07:25| 来源: 网络整理| 查看: 265

 1.差分进化算法(DE)

DE与GA的主要区别在变异步骤。

对于每个目标向量 Xi,G  (i=1,2,……,NP),基本DE算法的变异向量如下产生

其中,随机选择的序号r1,r2和r3互不相同,且r1,r2和r3与目标向量序号i也应不同,所以须满足NP≥4。变异算子F∈[0,2]是一个实常数因数,控制偏差变量的放大作用。

实现如下。由于此目标过于简单,即便去掉交叉步,也能得到不错的结果。

 

# coding: utf8 import numpy as np N=20 # 编码长度 MAX=10.0/(2**(N)) # [0,10), 区间内有两个最大值(17)的点 NUM=500 # 种群数量 def f(x): # 函数 return 10*np.sin(5*x) + 7*np.cos(4*x) def new(num=NUM,len=N): # 随机生成 return np.random.randint(1,2**len,num) def n2b(nums): # 数字编码 return [bin(i)[2:].zfill(N) for i in nums] def b2n(bits): # 解码 return [int(i,base=2) for i in bits] def fit(nums,s_rate=0.15,r_rate=0.05): # 适应度和选择 n=len(nums) sn=int(n*s_rate) on=int(n*r_rate) np.random.shuffle(nums) outs=nums[:on] res=[f(i*MAX) for i in nums] # 适应度选择和随机选择,可能有重复 temp=np.argsort(res) others=[nums[i] for i in temp[-sn:]] outs=np.concatenate((outs, others)) return outs,nums[temp[-1]]*MAX,res[temp[-1]] def repo(fits,mode='DE'): # 扩增,此处5倍;增加了进化算法 n=len(fits) pt=np.random.randint(0,n,4*n) pt=np.reshape(pt,(2*n,2)) bits=n2b(fits) new_bits=bits for i in pt: b1,b2=exchange([bits[j] for j in i]) new_bits.append(b1) new_bits.append(b2) if mode=='DE': return dmut(new_bits) return mut(new_bits) def exchange(bits,change_rate=0.4,mode='cross'): #交换,提供了随机交换和节点互换 n=int(change_rate*N) if mode=='rand': rn=range(N) new_bits=[list(i) for i in bits] for i in rn[:n]: new_bits[0][i] = bits[1][i] new_bits[1][i] = bits[0][i] new_bits=[''.join(i) for i in new_bits] else: n = int(change_rate * N) new_bits = [list(i) for i in bits] new_bits[0][:n] = bits[1][:n] new_bits[1][:n] = bits[0][:n] new_bits = [''.join(i) for i in new_bits] return new_bits def mut(bits,mut_rate=0.03): # 变异 length=len(bits)*N n = int(mut_rate * length) if n


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3