跳转到内容

简介

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

灰狼优化算法代码

python
import numpy as np
import random
import copy

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

    return X, lb, ub

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 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 SortFitness(Fit):
    fitness = np.sort(Fit, axis=0)
    index = np.argsort(Fit, axis=0)
    return fitness, index

def SortPosition(X, index):
    Xnew = np.zeros(X.shape)
    for i in range(X.shape[0]):
        Xnew[i, :] = X[index[i], :]
    return Xnew

def GWO(pop, dim, lb, ub, MaxIter, fun):
   
    Alpha_pos=np.zeros([1,dim])
    Alpha_score = float("inf")
    Beta_pos=np.ones([1,dim])
    Beta_score = float("inf")
    Delta_pos=np.ones([1,dim])
    Delta_score = float("inf")
    
    
    X, lb, ub = initial(pop, dim, ub, lb)  # 初始化种群
    fitness = CaculateFitness(X, fun)  # 计算适应度值
    indexBest = np.argmin(fitness)
    GbestScore = copy.copy(fitness[indexBest])
    GbestPositon = np.zeros([1,dim])
    GbestPositon[0,:] = copy.copy(X[indexBest,:])
    Curve = np.zeros([MaxIter, 1])
    for t in range(MaxIter):
        
        for i in range(pop):            
            fitValue = fun(X[i,:])
            if fitValue<Alpha_score:
                Alpha_score = copy.copy(fitValue)
                Alpha_pos[0,:] = copy.copy(X[i,:])
            
            if fitValue>Alpha_score and fitValue<Beta_score:
                Beta_score = copy.copy(fitValue)
                Beta_pos[0,:] = copy.copy(X[i,:])
                
            if fitValue>Alpha_score and fitValue>Beta_score and fitValue<Delta_score:
                Delta_score = copy.copy(fitValue)
                Delta_pos[0,:] = copy.copy(X[i,:])
        
        a = 2 - t*(2/MaxIter)
        for i in range(pop):
            for j in range(dim):
                r1 = random.random()
                r2 = random.random()
                A1= 2*a*r1-a
                C1 = 2*r2
                
                D_alpha=np.abs(C1*Alpha_pos[0,j]-X[i,j])
                X1=Alpha_pos[0,j]-A1*D_alpha
                
                r1 = random.random()
                r2 = random.random()
                A2= 2*a*r1-a
                C2 = 2*r2
                
                D_beta=np.abs(C2*Beta_pos[0,j]-X[i,j])
                X2=Beta_pos[0,j]-A2*D_beta
                
                r1 = random.random()
                r2 = random.random()
                A3= 2*a*r1-a
                C3 = 2*r2
                D_beta=np.abs(C3*Delta_pos[0,j]-X[i,j])
                X3=Delta_pos[0,j]-A3*D_beta
                
                X[i,j] = (X1+X2+X3)/3
                
                  
        X = BorderCheck(X, ub, lb, pop, dim)  # 边界检测
        fitness = CaculateFitness(X, fun)  # 计算适应度值
        indexBest = np.argmin(fitness)
        if fitness[indexBest] <= GbestScore:  # 更新全局最优
            GbestScore = copy.copy(fitness[indexBest])
            GbestPositon[0,:] = copy.copy(X[indexBest, :])
        Curve[t] = GbestScore

    return GbestScore, GbestPositon, Curve