-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfireflyalgorithm.py
35 lines (30 loc) · 1.39 KB
/
fireflyalgorithm.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import numpy as np
from numpy.random import default_rng
class FireflyAlgorithm:
def __init__(self, pop_size=20, alpha=1.0, betamin=1.0, gamma=0.01, seed=None):
self.pop_size = pop_size
self.alpha = alpha
self.betamin = betamin
self.gamma = gamma
self.rng = default_rng(seed)
def run(self, function, dim, lb, ub, max_evals):
fireflies = self.rng.uniform(lb, ub, (self.pop_size, dim))
intensity = np.apply_along_axis(function, 1, fireflies)
best = np.min(intensity)
evaluations = self.pop_size
new_alpha = self.alpha
search_range = ub - lb
while evaluations <= max_evals:
new_alpha *= 0.97
for i in range(self.pop_size):
for j in range(self.pop_size):
if intensity[i] >= intensity[j]:
r = np.sum(np.square(fireflies[i] - fireflies[j]), axis=-1)
beta = self.betamin * np.exp(-self.gamma * r)
steps = new_alpha * (self.rng.random(dim) - 0.5) * search_range
fireflies[i] += beta * (fireflies[j] - fireflies[i]) + steps
fireflies[i] = np.clip(fireflies[i], lb, ub)
intensity[i] = function(fireflies[i])
evaluations += 1
best = min(intensity[i], best)
return best