跳转到内容

简介

由于多数优化算法都是MATLAB代码,不容易与一些机器学习算法组合使用,如下是一些常见优化算法Python版本的代码,希望能帮到你。

粒子群优化算法代码

python
import numpy as np
import copy as copy

def initialization(pop,ub,lb,dim):
    X = np.zeros([pop,dim]) 
    for i in range(pop):
        for j in range(dim):
            X[i,j]=(ub[j]-lb[j])*np.random.random()+lb[j] 
    return X

def vchange(pop,ub,lb,dim):
    v = np.zeros([pop,dim]) 
    for i in range(pop):
        for j in range(dim):
            v[i,j]= -(ub[j]-lb[j])*0.2+(ub[j]-lb[j])*0.4*np.random.random() 
    return v
     
def BorderCheck(X,ub,lb,pop,dim):
    for i in range(pop):
        for j in range(dim):
            if X[i,j]>ub[j]:
                X[i,j] = ub[j]
            elif X[i,j]<lb[j]:
                X[i,j] = lb[j]
    return X

def vCheck(v,pop,dim,vmax):
    for i in range(pop):
        for j in range(dim):
            if v[i,j]>vmax[j]:
                v[i,j] =vmax[j]
            elif v[i,j]<-vmax[j]:
                v[i,j] = -vmax[j]
    return v

def CaculateFitness(X,fun):
    pop = X.shape[0]
    fitness = np.zeros([pop, 1])
    for i in range(pop):
        fitness[i] = fun(X[i, :])
    return fitness

def PSO(pop, dim, lb, ub, maxIter, fun, vmax):
    c1 = 2  
    c2 = 2  
    w = 0.9 

    X = initialization(pop,ub,lb,dim)  
    v = vchange(pop,ub,lb,dim)
    fitness = CaculateFitness(X, fun)  
    ind = np.argmin(fitness)  
    GbestPositon = np.zeros([1,dim])
    GbestPositon = X[ind, :]
    GbestScore = np.min(fitness)
    pbest = np.zeros([pop,dim])
    pbest = copy.copy(X)
    Curve = np.zeros([maxIter, 1])
    
    for j in range(maxIter):  
        for p in range(pop):
            fitness = CaculateFitness(X, fun)
            v[p, :] = w * (v[p, :]) + c1 * (np.random.rand(dim)) * (pbest[p, :] - X[p, :]) + c2 * (np.random.rand(dim)) * (GbestPositon - X[p, :])        
        v = vCheck(v,pop,dim,vmax)
        X = X+v
        X = BorderCheck(X,ub,lb,pop,dim)
        fitness = CaculateFitness(X, fun) 
        for k in range(pop): 
            if fitness[k] < fun(pbest[k, :]):
                pbest[k,:] = X[k,:]
        if np.min(fitness) < GbestScore:  
                GbestPositon = X[np.argmin(fitness), :]                              
                GbestScore = np.min(fitness)
        Curve[j] = GbestScore
    return GbestScore,GbestPositon,Curve