1. 程式人生 > >numba版 自適應差分進化演算法 速度超快 可以求解約束問題

numba版 自適應差分進化演算法 速度超快 可以求解約束問題

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]