-
Notifications
You must be signed in to change notification settings - Fork 0
/
WOA.py
112 lines (74 loc) · 3.23 KB
/
WOA.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import random
import numpy
import math
from solution import solution
import time
def WOA(objf,lb,ub,dim,SearchAgents_no,Max_iter):
#dim=30
#SearchAgents_no=50
#lb=-100
#ub=100
#Max_iter=500
# initialize position vector and score for the leader
Leader_pos=numpy.zeros(dim)
Leader_score=float("inf") #change this to -inf for maximization problems
#Initialize the positions of search agents
Positions=numpy.random.uniform(0,1,(SearchAgents_no,dim)) *(ub-lb)+lb
#Initialize convergence
convergence_curve=numpy.zeros(Max_iter)
############################
s=solution()
print("WOA is optimizing \""+objf.__name__+"\"")
timerStart=time.time()
s.startTime=time.strftime("%Y-%m-%d-%H-%M-%S")
############################
t=0 # Loop counter
# Main loop
while t<Max_iter:
for i in range(0,SearchAgents_no):
# Return back the search agents that go beyond the boundaries of the search space
#Positions[i,:]=checkBounds(Positions[i,:],lb,ub)
Positions[i,:]=numpy.clip(Positions[i,:], lb, ub)
# Calculate objective function for each search agent
fitness=objf(Positions[i,:])
# Update the leader
if fitness<Leader_score: # Change this to > for maximization problem
Leader_score=fitness; # Update alpha
Leader_pos=Positions[i,:]
a=2-t*((2)/Max_iter); # a decreases linearly fron 2 to 0 in Eq. (2.3)
# a2 linearly dicreases from -1 to -2 to calculate t in Eq. (3.12)
a2=-1+t*((-1)/Max_iter);
# Update the Position of search agents
for i in range(0,SearchAgents_no):
r1=random.random() # r1 is a random number in [0,1]
r2=random.random() # r2 is a random number in [0,1]
A=2*a*r1-a # Eq. (2.3) in the paper
C=2*r2 # Eq. (2.4) in the paper
b=1; # parameters in Eq. (2.5)
l=(a2-1)*random.random()+1 # parameters in Eq. (2.5)
p = random.random() # p in Eq. (2.6)
for j in range(0,dim):
if p<0.5:
if abs(A)>=1:
rand_leader_index = math.floor(SearchAgents_no*random.random());
X_rand = Positions[rand_leader_index, :]
D_X_rand=abs(C*X_rand[j]-Positions[i,j])
Positions[i,j]=X_rand[j]-A*D_X_rand
elif abs(A)<1:
D_Leader=abs(C*Leader_pos[j]-Positions[i,j])
Positions[i,j]=Leader_pos[j]-A*D_Leader
elif p>=0.5:
distance2Leader=abs(Leader_pos[j]-Positions[i,j])
# Eq. (2.5)
Positions[i,j]=distance2Leader*math.exp(b*l)*math.cos(l*2*math.pi)+Leader_pos[j]
convergence_curve[t]=Leader_score
if (t%1==0):
print(['At iteration '+ str(t)+ ' the best fitness is '+ str(Leader_score)]);
t=t+1
timerEnd=time.time()
s.endTime=time.strftime("%Y-%m-%d-%H-%M-%S")
s.executionTime=timerEnd-timerStart
s.convergence=convergence_curve
s.optimizer="WOA"
s.objfname=objf.__name__
return s