您的位置:首页 > 编程语言 > Python开发

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息