# -*- coding: utf-8 -*- """ Created on Mon May 16 00:27:50 2016 @author: Hossam Faris """ import random import numpy import math from .solution import solution import time def GWO(objf, lb, ub, dim, SearchAgents_no, Max_iter): # Max_iter=1000 # lb=-100 # ub=100 # dim=30 # SearchAgents_no=5 # initialize alpha, beta, and delta_pos Alpha_pos = numpy.zeros(dim) Alpha_score = float("inf") Beta_pos = numpy.zeros(dim) Beta_score = float("inf") Delta_pos = numpy.zeros(dim) Delta_score = float("inf") if not isinstance(lb, list): lb = [lb] * dim if not isinstance(ub, list): ub = [ub] * dim # Initialize the positions of search agents Positions = numpy.zeros((SearchAgents_no, dim)) for i in range(dim): Positions[:, i] = ( numpy.random.uniform(0, 1, SearchAgents_no) * (ub[i] - lb[i]) + lb[i] ) Convergence_curve = numpy.zeros(Max_iter) s = solution() # Loop counter print('GWO is optimizing "' + objf.__name__ + '"') timerStart = time.time() s.startTime = time.strftime("%Y-%m-%d-%H-%M-%S") # Main loop for l in range(0, Max_iter): for i in range(0, SearchAgents_no): # Return back the search agents that go beyond the boundaries of the search space for j in range(dim): Positions[i, j] = numpy.clip(Positions[i, j], lb[j], ub[j]) # Calculate objective function for each search agent fitness = objf(Positions[i, :]) # Update Alpha, Beta, and Delta if fitness < Alpha_score: Delta_score = Beta_score # Update delte Delta_pos = Beta_pos.copy() Beta_score = Alpha_score # Update beta Beta_pos = Alpha_pos.copy() Alpha_score = fitness # Update alpha Alpha_pos = Positions[i, :].copy() if fitness > Alpha_score and fitness < Beta_score: Delta_score = Beta_score # Update delte Delta_pos = Beta_pos.copy() Beta_score = fitness # Update beta Beta_pos = Positions[i, :].copy() if fitness > Alpha_score and fitness > Beta_score and fitness < Delta_score: Delta_score = fitness # Update delta Delta_pos = Positions[i, :].copy() a = 2 - l * ((2) / Max_iter) # a decreases linearly fron 2 to 0 # Update the Position of search agents including omegas for i in range(0, SearchAgents_no): for j in range(0, dim): r1 = random.random() # r1 is a random number in [0,1] r2 = random.random() # r2 is a random number in [0,1] A1 = 2 * a * r1 - a # Equation (3.3) C1 = 2 * r2 # Equation (3.4) D_alpha = abs(C1 * Alpha_pos[j] - Positions[i, j]) # Equation (3.5)-part 1 X1 = Alpha_pos[j] - A1 * D_alpha # Equation (3.6)-part 1 r1 = random.random() r2 = random.random() A2 = 2 * a * r1 - a # Equation (3.3) C2 = 2 * r2 # Equation (3.4) D_beta = abs(C2 * Beta_pos[j] - Positions[i, j]) # Equation (3.5)-part 2 X2 = Beta_pos[j] - A2 * D_beta # Equation (3.6)-part 2 r1 = random.random() r2 = random.random() A3 = 2 * a * r1 - a # Equation (3.3) C3 = 2 * r2 # Equation (3.4) D_delta = abs(C3 * Delta_pos[j] - Positions[i, j]) # Equation (3.5)-part 3 X3 = Delta_pos[j] - A3 * D_delta # Equation (3.5)-part 3 Positions[i, j] = (X1 + X2 + X3) / 3 # Equation (3.7) Convergence_curve[l] = Alpha_score if l % 1 == 0: print(["At iteration " + str(l) + " the best fitness is " + str(Alpha_score)]) timerEnd = time.time() s.endTime = time.strftime("%Y-%m-%d-%H-%M-%S") s.executionTime = timerEnd - timerStart s.convergence = Convergence_curve s.optimizer = "GWO" s.bestIndividual = Alpha_pos s.objfname = objf.__name__ return s