|
2 | 2 | from numpy.random import default_rng
|
3 | 3 |
|
4 | 4 |
|
5 |
| -class FireflyAlgorithm(): |
6 |
| - def __init__(self, function, dim, lb, ub, max_evals, pop_size=20, alpha=1.0, betamin=1.0, gamma=0.01, seed=None): |
7 |
| - self.function = function |
8 |
| - self.dim = dim |
9 |
| - self.lb = lb |
10 |
| - self.ub = ub |
11 |
| - self.max_evals = max_evals |
| 5 | +class FireflyAlgorithm: |
| 6 | + def __init__(self, pop_size=20, alpha=1.0, betamin=1.0, gamma=0.01, seed=None): |
12 | 7 | self.pop_size = pop_size
|
13 | 8 | self.alpha = alpha
|
14 | 9 | self.betamin = betamin
|
15 | 10 | self.gamma = gamma
|
16 |
| - self.seed = seed |
| 11 | + self.rng = default_rng(seed) |
17 | 12 |
|
18 |
| - def move(self): |
19 |
| - rng = default_rng(self.seed) |
20 |
| - fireflies = rng.uniform(self.lb, self.ub, (self.pop_size, self.dim)) |
21 |
| - intensity = np.apply_along_axis(self.function, 1, fireflies) |
| 13 | + def run(self, function, dim, lb, ub, max_evals): |
| 14 | + fireflies = self.rng.uniform(lb, ub, (self.pop_size, dim)) |
| 15 | + intensity = np.apply_along_axis(function, 1, fireflies) |
22 | 16 | best = np.min(intensity)
|
23 | 17 |
|
24 | 18 | evaluations = self.pop_size
|
25 | 19 | new_alpha = self.alpha
|
26 |
| - search_range = self.ub - self.lb |
| 20 | + search_range = ub - lb |
27 | 21 |
|
28 |
| - while evaluations <= self.max_evals: |
| 22 | + while evaluations <= max_evals: |
29 | 23 | new_alpha *= 0.97
|
30 | 24 | for i in range(self.pop_size):
|
31 | 25 | for j in range(self.pop_size):
|
32 | 26 | if intensity[i] >= intensity[j]:
|
33 | 27 | r = np.sum(np.square(fireflies[i] - fireflies[j]), axis=-1)
|
34 | 28 | beta = self.betamin * np.exp(-self.gamma * r)
|
35 |
| - steps = new_alpha * (rng.random(self.dim) - 0.5) * search_range |
| 29 | + steps = new_alpha * (self.rng.random(dim) - 0.5) * search_range |
36 | 30 | fireflies[i] += beta * (fireflies[j] - fireflies[i]) + steps
|
37 |
| - fireflies[i] = np.clip(fireflies[i], self.lb, self.ub) |
38 |
| - intensity[i] = self.function(fireflies[i]) |
| 31 | + fireflies[i] = np.clip(fireflies[i], lb, ub) |
| 32 | + intensity[i] = function(fireflies[i]) |
39 | 33 | evaluations += 1
|
40 | 34 | best = min(intensity[i], best)
|
41 | 35 | return best
|
0 commit comments