numba版 自适应差分进化算法 速度超快 可以求解约束问题
2016-06-13 19:24
471 查看
import numpy as np from numba import njit from math import cos,pi random=np.random.random randint=np.random.randint @njit def fitness(x,Dn,Cn,Fn): s=0.0 for j in range(Dn): s+=x[j]**2-10*cos(2*pi*x[j])+10 x[Dn+Cn]=s @njit def my_cmp(a,b,Dn,Cn,Fn): Va=0 Vb=0 Sa=0.0 Sb=0.0 for j in range(Cn): if a[Dn+j]>0: Va+=1 Sa+=a[Dn+j] if b[Dn+j]>0: Vb+=1 Sb+=b[Dn+j] if Va<Vb: return -1 elif Va>Vb: return 1 else: if Sa<Sb: return -1 elif Sa>Sb: return 1 else: fa,fb=a[Dn+Cn],b[Dn+Cn] if fa<fb: return -1 elif fa>fb: return 1 else: return 0 @njit def run(Dn,Cn,Fn,N,G,F,Cr): F_=F Cr_=Cr U=np.array([5.12]*Dn) L=np.array([-5.12]*Dn) X=np.empty((N,Dn+Cn+Fn), dtype=np.float64) V=np.empty(Dn+Cn+Fn, dtype=np.float64) for i in range(N): for j in range(Dn): X[i,j]=(U[j]-L[j])*random()+L[j] fitness(X[i],Dn,Cn,Fn) best=X[0].copy() for g in range(G): for i in range(N): while True: i0=randint(N) if i0!=i: break while True: i1=randint(N) if i1!=i0 and i1!=i: break while True: i2=randint(N) if i2!=i1 and i2!=i0 and i2!=i: break #print i,i0,i1,i2 F=F_ if random()<0.9 else random()*0.8+0.2 Cr=Cr_ if random()<0.9 else random() jrand=randint(Dn) for j in range(Dn): if random()<=Cr or j==jrand: V[j]=X[i0,j]+F*(X[i1,j]-X[i2,j]) if not L[j]<=V[j]<=U[j]: V[j]=random()*(U[j]-L[j])+L[j] else: V[j]=X[i,j] fitness(V,Dn,Cn,Fn) if my_cmp(V, X[i],Dn,Cn,Fn)<=0: X[i,:]=V F_=F Cr_=Cr if my_cmp(V, best,Dn,Cn,Fn)<=0: best[:]=V # if g%10==0: # print g,best[Cn+Dn] return best Dn=30 Cn=0 Fn=1 N=100 G=1000 F=0.5 Cr=0.9 best=run(Dn,Cn,Fn,N,G,F,Cr) print best[Dn+Cn]
相关文章推荐
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法