|
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