Skip to content

Commit 170394d

Browse files
committed
First commit
1 parent e4986d0 commit 170394d

File tree

2 files changed

+135
-0
lines changed

2 files changed

+135
-0
lines changed

FireflyAlgorithm.py

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import random
2+
import math
3+
4+
5+
class FireflyAlgorithm():
6+
7+
def __init__(self, D, NP, nFES, alpha, betamin, gamma, LB, UB, function):
8+
self.D = D # dimension of the problem
9+
self.NP = NP # population size
10+
self.nFES = nFES # number of function evaluations
11+
self.alpha = alpha # alpha parameter
12+
self.betamin = betamin # beta parameter
13+
self.gamma = gamma # gamma parameter
14+
# sort of fireflies according to fitness value
15+
self.Index = [0] * self.NP
16+
self.Fireflies = [[0 for i in range(self.D)]
17+
for j in range(self.NP)] # firefly agents
18+
self.Fireflies_tmp = [[0 for i in range(self.D)] for j in range(
19+
self.NP)] # intermediate pop
20+
self.Fitness = [0.0] * self.NP # fitness values
21+
self.I = [0.0] * self.NP # light intensity
22+
self.nbest = [0.0] * self.NP # the best solution found so far
23+
self.LB = LB # lower bound
24+
self.UB = UB # upper bound
25+
self.fbest = None # the best
26+
self.evaluations = 0
27+
self.Fun = function
28+
29+
def init_ffa(self):
30+
for i in range(self.NP):
31+
for j in range(self.D):
32+
self.Fireflies[i][j] = random.uniform(
33+
0, 1) * (self.UB - self.LB) + self.LB
34+
self.Fitness[i] = 1.0 # initialize attractiveness
35+
self.I[i] = self.Fitness[i]
36+
37+
def alpha_new(self, a):
38+
delta = 1.0 - math.pow((math.pow(10.0, -4.0) / 0.9), 1.0 / float(a))
39+
return (1 - delta) * self.alpha
40+
41+
def sort_ffa(self): # implementation of bubble sort
42+
for i in range(self.NP):
43+
self.Index[i] = i
44+
45+
for i in range(0, (self.NP - 1)):
46+
j = i + 1
47+
for j in range(j, self.NP):
48+
if (self.I[i] > self.I[j]):
49+
z = self.I[i] # exchange attractiveness
50+
self.I[i] = self.I[j]
51+
self.I[j] = z
52+
z = self.Fitness[i] # exchange fitness
53+
self.Fitness[i] = self.Fitness[j]
54+
self.Fitness[j] = z
55+
z = self.Index[i] # exchange indexes
56+
self.Index[i] = self.Index[j]
57+
self.Index[j] = z
58+
59+
def replace_ffa(self): # replace the old population according to the new Index values
60+
# copy original population to a temporary area
61+
for i in range(self.NP):
62+
for j in range(self.D):
63+
self.Fireflies_tmp[i][j] = self.Fireflies[i][j]
64+
65+
# generational selection in the sense of an EA
66+
for i in range(self.NP):
67+
for j in range(self.D):
68+
self.Fireflies[i][j] = self.Fireflies_tmp[self.Index[i]][j]
69+
70+
def FindLimits(self, k):
71+
for i in range(self.D):
72+
if self.Fireflies[k][i] < self.LB:
73+
self.Fireflies[k][i] = self.LB
74+
if self.Fireflies[k][i] > self.UB:
75+
self.Fireflies[k][i] = self.UB
76+
77+
def move_ffa(self):
78+
for i in range(self.NP):
79+
scale = abs(self.UB - self.LB)
80+
for j in range(self.NP):
81+
r = 0.0
82+
for k in range(self.D):
83+
r += (self.Fireflies[i][k] - self.Fireflies[j][k]) * \
84+
(self.Fireflies[i][k] - self.Fireflies[j][k])
85+
r = math.sqrt(r)
86+
if self.I[i] > self.I[j]: # brighter and more attractive
87+
beta0 = 1.0
88+
beta = (beta0 - self.betamin) * \
89+
math.exp(-self.gamma * math.pow(r, 2.0)) + self.betamin
90+
for k in range(self.D):
91+
r = random.uniform(0, 1)
92+
tmpf = self.alpha * (r - 0.5) * scale
93+
self.Fireflies[i][k] = self.Fireflies[i][
94+
k] * (1.0 - beta) + self.Fireflies_tmp[j][k] * beta + tmpf
95+
self.FindLimits(i)
96+
97+
def Run(self):
98+
self.init_ffa()
99+
100+
while self.evaluations < self.nFES:
101+
102+
# optional reducing of alpha
103+
self.alpha = self.alpha_new(self.nFES/self.NP)
104+
105+
# evaluate new solutions
106+
for i in range(self.NP):
107+
self.Fitness[i] = self.Fun(self.D, self.Fireflies[i])
108+
self.evaluations = self.evaluations + 1
109+
self.I[i] = self.Fitness[i]
110+
111+
# ranking fireflies by their light intensity
112+
self.sort_ffa()
113+
# replace old population
114+
self.replace_ffa()
115+
# find the current best
116+
self.fbest = self.I[0]
117+
# move all fireflies to the better locations
118+
self.move_ffa()
119+
120+
return self.fbest

run.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!/usr/bin/env python2
2+
from FireflyAlgorithm import *
3+
4+
5+
def Fun(D, sol):
6+
val = 0.0
7+
for i in range(D):
8+
val = val + sol[i] * sol[i]
9+
return val
10+
11+
12+
Algorithm = FireflyAlgorithm(10, 20, 10000, 0.5, 0.2, 1.0, -2.0, 2.0, Fun)
13+
Best = Algorithm.Run()
14+
15+
print Best

0 commit comments

Comments
 (0)