Skip to content

Commit 00f0746

Browse files
committed
Add tests, new class for FA, remove .rst
1 parent bd93aff commit 00f0746

File tree

12 files changed

+89
-83
lines changed

12 files changed

+89
-83
lines changed

FireflyAlgorithm.py

Lines changed: 0 additions & 28 deletions
This file was deleted.

README.rst

Lines changed: 0 additions & 42 deletions
This file was deleted.

examples/run.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import numpy as np
2+
from fireflyalgorithm import FireflyAlgorithm
3+
4+
5+
def sphere(x):
6+
return np.sum(x ** 2)
7+
8+
9+
FA = FireflyAlgorithm(function=sphere, dim=10, lb=-5, ub=5, max_evals=10000)
10+
best = FA.move()
11+
12+
print(best)

fireflyalgorithm/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from fireflyalgorithm.fireflyalgorithm import FireflyAlgorithm
2+
3+
__all__ = ['FireflyAlgorithm']
4+
5+
__version__ = '0.2'

fireflyalgorithm/fireflyalgorithm.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import numpy as np
2+
from numpy.random import default_rng
3+
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
12+
self.pop_size = pop_size
13+
self.alpha = alpha
14+
self.betamin = betamin
15+
self.gamma = gamma
16+
self.seed = seed
17+
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)
22+
best = np.min(intensity)
23+
24+
evaluations = self.pop_size
25+
new_alpha = self.alpha
26+
search_range = self.ub - self.lb
27+
28+
while evaluations <= self.max_evals:
29+
new_alpha *= 0.97
30+
for i in range(self.pop_size):
31+
for j in range(self.pop_size):
32+
if intensity[i] >= intensity[j]:
33+
r = np.sum(np.square(fireflies[i] - fireflies[j]), axis=-1)
34+
beta = self.betamin * np.exp(-self.gamma * r)
35+
steps = new_alpha * (rng.random(self.dim) - 0.5) * search_range
36+
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])
39+
evaluations += 1
40+
best = min(intensity[i], best)
41+
return best

fireflyalgorithm/tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

fireflyalgorithm/tests/conftest.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import logging
2+
3+
4+
def pytest_configure(config):
5+
r"""Disable verbose output when running tests."""
6+
logging.basicConfig(level=logging.DEBUG)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
from unittest import TestCase
2+
3+
import numpy as np
4+
from fireflyalgorithm import FireflyAlgorithm
5+
import os
6+
7+
def sphere(x):
8+
return np.sum(x ** 2)
9+
10+
class TestFA(TestCase):
11+
def test_algorithm(self):
12+
FA = FireflyAlgorithm(function=sphere, dim=10, lb=-5, ub=5, max_evals=10000)
13+
best = FA.move()
14+
self.assertLess(best, 5)

pyproject.toml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,21 @@ authors = ["firefly-cpp"]
66
license = "MIT"
77
readme = "README.md"
88

9-
packages = [
10-
{include = "FireflyAlgorithm.py"},
9+
include = [
10+
{ path="LICENSE", format="sdist" }
1111
]
1212

13+
1314
[tool.poetry.dependencies]
1415
python = "^3.7"
1516
numpy = [
1617
{ version = "^1.21.5", python = ">=3.7,<3.11" },
1718
{ version = "^1.22.0", python = "^3.11" }
1819
]
1920

21+
[tool.poetry.dev-dependencies]
22+
pytest = "^7.0.1"
23+
2024
[build-system]
2125
requires = ["poetry-core>=1.0.0"]
2226
build-backend = "poetry.core.masonry.api"

run.py

Lines changed: 0 additions & 11 deletions
This file was deleted.

tests/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

tests/test_fireflyalgorithm.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from fireflyalgorithm.tests.conftest import pytest_configure
2+
3+
__all__ = ["pytest_configure"]

0 commit comments

Comments
 (0)