-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbgoa.py
63 lines (60 loc) · 1.98 KB
/
bgoa.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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import meta
import numpy as np
import sklearn
import helper
import sys
import math
import knn
def social(x):
x = math.fabs(x)
return meta.f * math.exp((0-x)/meta.l) - math.exp(0-x)
def sigmoid(x):
return 1/(1 + math.exp(-x))
def bgoa():
agents = helper.init()
fitness = helper.fitness(agents)
inds = fitness.argsort()
agents = agents[inds]
target = agents[0]
maxscore = helper.fitness(np.asarray([target]))
dist = np.zeros((meta.ns,meta.ns))
for l in range(meta.L):
print("Iteration : ",l+1)
c = meta.cmax - l * (meta.cmax-meta.cmin)/meta.L
dmin = sys.float_info.max
dmax = 0
for i in range(meta.ns):
for j in range(meta.ns):
if j==i:
continue
dist[i][j] = dist[j][i] = np.linalg.norm(agents[i]-agents[j])
dmax = max(dist[i][j],dmax)
dmin = min(dist[i][j],dmin)
dist = np.interp(dist,(dmin,dmax),(1,4))
dT = np.zeros((meta.ns,meta.dim))
for i in range(meta.ns):
upd = np.zeros(meta.dim)
for d in range(meta.dim):
for j in range(meta.ns):
if(i==j):
continue
upd[d] += social(math.fabs(agents[j][d] - agents[i][d])) * (agents[j][d] - agents[i][d]) / dist[i][j]
upd = upd * (c*c*0.5)
T = np.array([sigmoid(x) for x in upd])
dT[i] = T
# print("Updating Vectors")
for i in range(meta.ns):
for j in range(meta.dim):
r = np.random.rand(1)
if(r>=dT[i][j]):
agents[i][j] = 0
else:
agents[i][j] = 1
fitness = helper.fitness(agents)
inds = fitness.argsort()
score = helper.fitness(np.asarray([agents[inds[0]]]))
if(score > maxscore):
target = agents[inds[0]]
maxscore = score
print(maxscore)
return target