python code for honey badger optimization

# import packages

import random

import time

import numpy as np

rng = np.random.default_rng()

import math

import sys

from numpy import linalg as LA

Supporting functions

def fun(X):

output = sum(np.square(X))

return output

# This function is to initialize the Honey Badger population.

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

# Calculate fitness values for each Honey Badger.

def CaculateFitness1(X,fun):

fitness = fun(X)

return fitness

# Sort fitness.

def SortFitness(Fit):

fitness = np.sort(Fit, axis=0)

index = np.argsort(Fit, axis=0)

return fitness,index

# Sort the position of the Honey Badger according to fitness.

def SortPosition(X,index):

Xnew = np.zeros(X.shape)

for i in range(X.shape[0]):

Xnew[i,:] = X[index[i],:]

return Xnew

# Boundary detection function.

def BorderCheck1(X,lb,ub,dim):

for j in range(dim):

if X[j]<lb[j]:

X[j] = ub[j]

elif X[j]>ub[j]:

X[j] = lb[j]

return X

def Intensity(pop,GbestPositon,X):

epsilon = 0.00000000000000022204

di = np.zeros(pop)

S = np.zeros(pop)

I = np.zeros(pop)

for j in range(pop):

if (j <= pop):

di[j]=LA.norm([[X[j,:]-GbestPositon+epsilon]])

S[j]= LA.norm([X[j,:]-X[j+1,:]+epsilon])

di[j] = np.power(di[j], 2)

S[j]= np.power(S[j], 2)

else:

di[j]=[ LA.norm[[X[pop,:]-GbestPositon+epsilon]]]

S[j]=[LA.norm[[X[pop,:]-X[1,:]+epsilon]]]

di[j] = np.power(di[j], 2)

S[j]= np.power(S[j], 2)

for i in range(pop):

n = random.random()

I[i] = n*S[i]/[4*math.pi*di[i]]

return I


HBO Algorithm

def hba(pop,dim,lb,ub,Max_iter,fun):

X = initial(pop, dim, lb,ub) # Initialize the number of honey badgers

fitness = np.zeros([pop, 1])

for i in range(pop):

fitness[i] = CaculateFitness1(X[i, :], fun)

fitness, sortIndex = SortFitness(fitness) # Sort the fitness values of honey badger.

X = SortPosition(X, sortIndex) # Sort the honey badger.

GbestScore = fitness[0] # The optimal value for the current iteration.

GbestPositon = np.zeros([1, dim])

GbestPositon[0, :] = X[0, :]

Curve = np.zeros([Max_iter, 1])

C = 2 # constant in Eq. (3)

beta = 6 # the ability of HB to get the food Eq.(4)

vec_flag=[1,-1]

vec_flag=np.array(vec_flag)

Xnew = np.zeros([pop, dim])

for t in range(Max_iter):

#print("iteration: ",t)

alpha=C*math.exp(-t/Max_iter); # density factor in Eq. (3)

I=Intensity(pop,GbestPositon,X); # intensity in Eq. (2)

Vs=random.random()

for i in range(pop):

Vs=random.random()

F=vec_flag[math.floor((2*random.random()))]

for j in range(dim):

di=GbestPositon[0,j]-X[i,j]

if (Vs <0.5): # Digging phase Eq. (4)

r3=np.random.random()

r4=np.random.randn()

r5=np.random.randn()

Xnew[i,j]=GbestPositon[0,j] +F*beta*I[i]* GbestPositon[0,j]+F*r3*alpha*(di)*np.abs(math.cos(2*math.pi*r4)*(1-math.cos(2*math.pi*r5)));

else:

r7=random.random()

Xnew[i,j]=GbestPositon[0,j]+F*r7*alpha*di; # Honey phase Eq. (6)

#print(di)

Xnew[i,:] = BorderCheck1(Xnew[i,:], lb, ub, dim)

tempFitness = CaculateFitness1(Xnew[i,:], fun)

if (tempFitness <= fitness[i]):

fitness[i] = tempFitness

X[i,:] = Xnew[i,:]

for i in range(pop):

X[i,:] = BorderCheck1(X[i,:], lb, ub ,dim)

Ybest,index = SortFitness(fitness) # Sort fitness values.

if (Ybest[0] <= GbestScore):

GbestScore = Ybest[0] # Update the global optimal solution.

GbestPositon[0, :] = X[index[0], :] # Sort fitness values

Curve[t] = GbestScore

return GbestScore,GbestPositon,Curve


Main code

rng = np.random.default_rng()

time_start = time.time()

pop = 50 # Honey Badger population size.

MaxIter = 300 # Maximum number of iterations.

dim = 20 # The dimension.

fl=-10 # The lower bound of the search interval.

ul=10 # The upper bound of the search interval.

lb = fl*np.ones([dim, 1])

ub = ul*np.ones([dim, 1])

GbestScore, GbestPositon, Curve = hba(pop, dim, lb, ub, MaxIter, fun)

time_end = time.time()

print(f"The running time is: {time_end - time_start } s")

print('The optimal value:',GbestScore)

print('The optimal solution:',GbestPositon)