110 lines
2.8 KiB
Python
110 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
Created on Thu May 26 02:00:55 2016
|
|
|
|
@author: hossam
|
|
"""
|
|
import math
|
|
import numpy
|
|
import random
|
|
import time
|
|
from solution import solution
|
|
|
|
|
|
def BAT(objf, lb, ub, dim, N, Max_iteration):
|
|
|
|
n = N
|
|
# Population size
|
|
|
|
if not isinstance(lb, list):
|
|
lb = [lb] * dim
|
|
if not isinstance(ub, list):
|
|
ub = [ub] * dim
|
|
N_gen = Max_iteration # Number of generations
|
|
|
|
A = 0.5
|
|
# Loudness (constant or decreasing)
|
|
r = 0.5
|
|
# Pulse rate (constant or decreasing)
|
|
|
|
Qmin = 0 # Frequency minimum
|
|
Qmax = 2 # Frequency maximum
|
|
|
|
d = dim # Number of dimensions
|
|
|
|
# Initializing arrays
|
|
Q = numpy.zeros(n) # Frequency
|
|
v = numpy.zeros((n, d)) # Velocities
|
|
Convergence_curve = []
|
|
|
|
# Initialize the population/solutions
|
|
Sol = numpy.zeros((n, d))
|
|
for i in range(dim):
|
|
Sol[:, i] = numpy.random.rand(n) * (ub[i] - lb[i]) + lb[i]
|
|
|
|
S = numpy.zeros((n, d))
|
|
S = numpy.copy(Sol)
|
|
Fitness = numpy.zeros(n)
|
|
|
|
# initialize solution for the final results
|
|
s = solution()
|
|
print('BAT is optimizing "' + objf.__name__ + '"')
|
|
|
|
# Initialize timer for the experiment
|
|
timerStart = time.time()
|
|
s.startTime = time.strftime("%Y-%m-%d-%H-%M-%S")
|
|
|
|
# Evaluate initial random solutions
|
|
for i in range(0, n):
|
|
Fitness[i] = objf(Sol[i, :])
|
|
|
|
# Find the initial best solution and minimum fitness
|
|
I = numpy.argmin(Fitness)
|
|
best = Sol[I, :]
|
|
fmin = min(Fitness)
|
|
|
|
# Main loop
|
|
for t in range(0, N_gen):
|
|
|
|
# Loop over all bats(solutions)
|
|
for i in range(0, n):
|
|
Q[i] = Qmin + (Qmin - Qmax) * random.random()
|
|
v[i, :] = v[i, :] + (Sol[i, :] - best) * Q[i]
|
|
S[i, :] = Sol[i, :] + v[i, :]
|
|
|
|
# Check boundaries
|
|
for j in range(d):
|
|
Sol[i, j] = numpy.clip(Sol[i, j], lb[j], ub[j])
|
|
|
|
# Pulse rate
|
|
if random.random() > r:
|
|
S[i, :] = best + 0.001 * numpy.random.randn(d)
|
|
|
|
# Evaluate new solutions
|
|
Fnew = objf(S[i, :])
|
|
|
|
# Update if the solution improves
|
|
if (Fnew <= Fitness[i]) and (random.random() < A):
|
|
Sol[i, :] = numpy.copy(S[i, :])
|
|
Fitness[i] = Fnew
|
|
|
|
# Update the current best solution
|
|
if Fnew <= fmin:
|
|
best = numpy.copy(S[i, :])
|
|
fmin = Fnew
|
|
|
|
# update convergence curve
|
|
Convergence_curve.append(fmin)
|
|
|
|
if t % 1 == 0:
|
|
print(["At iteration " + str(t) + " the best fitness is " + str(fmin)])
|
|
|
|
timerEnd = time.time()
|
|
s.endTime = time.strftime("%Y-%m-%d-%H-%M-%S")
|
|
s.executionTime = timerEnd - timerStart
|
|
s.convergence = Convergence_curve
|
|
s.optimizer = "BAT"
|
|
s.bestIndividual = best
|
|
s.objfname = objf.__name__
|
|
|
|
return s
|