|
1
|
|
|
# encoding=utf8 |
|
2
|
|
|
import logging |
|
3
|
|
|
from scipy.spatial.distance import euclidean as ed |
|
4
|
|
|
from numpy import apply_along_axis, argmin, argmax, sum, full, inf, asarray, mean, where, sqrt |
|
5
|
|
|
from NiaPy.util import fullArray |
|
6
|
|
|
from NiaPy.algorithms.algorithm import Algorithm |
|
7
|
|
|
|
|
8
|
|
|
logging.basicConfig() |
|
9
|
|
|
logger = logging.getLogger('NiaPy.algorithms.basic') |
|
10
|
|
|
logger.setLevel('INFO') |
|
11
|
|
|
|
|
12
|
|
|
__all__ = ['KrillHerdV1', 'KrillHerdV2', 'KrillHerdV3', 'KrillHerdV4', 'KrillHerdV11'] |
|
13
|
|
|
|
|
14
|
|
|
class KrillHerd(Algorithm): |
|
15
|
|
|
r"""Implementation of krill herd algorithm. |
|
16
|
|
|
|
|
17
|
|
|
Algorithm: |
|
18
|
|
|
Krill Herd Algorithm |
|
19
|
|
|
|
|
20
|
|
|
Date: |
|
21
|
|
|
2018 |
|
22
|
|
|
|
|
23
|
|
|
Authors: |
|
24
|
|
|
Klemen Berkovič |
|
25
|
|
|
|
|
26
|
|
|
License: |
|
27
|
|
|
MIT |
|
28
|
|
|
|
|
29
|
|
|
Reference URL: |
|
30
|
|
|
http://www.sciencedirect.com/science/article/pii/S1007570412002171 |
|
31
|
|
|
|
|
32
|
|
|
Reference paper: |
|
33
|
|
|
Amir Hossein Gandomi, Amir Hossein Alavi, Krill herd: A new bio-inspired optimization algorithm, Communications in Nonlinear Science and Numerical Simulation, Volume 17, Issue 12, 2012, Pages 4831-4845, ISSN 1007-5704, https://doi.org/10.1016/j.cnsns.2012.05.010. |
|
34
|
|
|
|
|
35
|
|
|
Attributes: |
|
36
|
|
|
Name (List[str]): List of strings representing algorithm names. |
|
37
|
|
|
NP (int): Number of krill herds in population. |
|
38
|
|
|
N_max (float): Maximum induced speed. |
|
39
|
|
|
V_f (float): Foraging speed. |
|
40
|
|
|
D_max (float): Maximum diffusion speed. |
|
41
|
|
|
C_t (float): Constant :math:`\in [0, 2]` |
|
42
|
|
|
W_n (Union[int, float, numpy.ndarray]): Interta weights of the motion induced from neighbors :math:`\in [0, 1]`. |
|
43
|
|
|
W_f (Union[int, float, numpy.ndarray]): Interta weights of the motion induced from foraging :math`\in [0, 1]`. |
|
44
|
|
|
d_s (float): Maximum euclidean distance for neighbors. |
|
45
|
|
|
nn (int): Maximum neighbors for neighbors effect. |
|
46
|
|
|
Cr (float): Crossover probability. |
|
47
|
|
|
Mu (float): Mutation probability. |
|
48
|
|
|
epsilon (float): Small numbers for division. |
|
49
|
|
|
|
|
50
|
|
|
See Also: |
|
51
|
|
|
* :class:`NiaPy.algorithms.algorithm.Algorithm` |
|
52
|
|
|
""" |
|
53
|
|
|
Name = ['KrillHerd', 'KH'] |
|
54
|
|
|
|
|
55
|
|
|
@staticmethod |
|
56
|
|
|
def algorithmInfo(): |
|
57
|
|
|
r"""Get basic information of algorithm. |
|
58
|
|
|
|
|
59
|
|
|
Returns: |
|
60
|
|
|
str: Basic information of algorithm. |
|
61
|
|
|
|
|
62
|
|
|
See Also: |
|
63
|
|
|
* :func:`NiaPy.algorithms.Algorithm.algorithmInfo` |
|
64
|
|
|
""" |
|
65
|
|
|
return r"""Amir Hossein Gandomi, Amir Hossein Alavi, Krill herd: A new bio-inspired optimization algorithm, Communications in Nonlinear Science and Numerical Simulation, Volume 17, Issue 12, 2012, Pages 4831-4845, ISSN 1007-5704, https://doi.org/10.1016/j.cnsns.2012.05.010.""" |
|
66
|
|
|
|
|
67
|
|
|
@staticmethod |
|
68
|
|
|
def typeParameters(): |
|
69
|
|
|
r"""Get dictionary with functions for checking values of parameters. |
|
70
|
|
|
|
|
71
|
|
|
Returns: |
|
72
|
|
|
Dict[str, Callable]: |
|
73
|
|
|
* N_max (Callable[[Union[int, float]], bool]) |
|
74
|
|
|
* V_f (Callable[[Union[int, float]], bool]) |
|
75
|
|
|
* D_max (Callable[[Union[int, float]], bool]) |
|
76
|
|
|
* C_t (Callable[[Union[int, float]], bool]) |
|
77
|
|
|
* W_n (Callable[[Union[int, float]], bool]) |
|
78
|
|
|
* W_f (Callable[[Union[int, float]], bool]) |
|
79
|
|
|
* d_s (Callable[[Union[int, float]], boool]) |
|
80
|
|
|
* nn (Callable[[int], bool]) |
|
81
|
|
|
* Cr (Callable[[float], bool]) |
|
82
|
|
|
* Mu (Callable[[float], bool]) |
|
83
|
|
|
* epsilon (Callable[[float], bool]) |
|
84
|
|
|
|
|
85
|
|
|
See Also: |
|
86
|
|
|
* :func:`NiaPy.algorithms.algorithm.Algorithm` |
|
87
|
|
|
""" |
|
88
|
|
|
d = Algorithm.typeParameters() |
|
89
|
|
|
d.update({ |
|
90
|
|
|
'N_max': lambda x: isinstance(x, (int, float)) and x > 0, |
|
91
|
|
|
'V_f': lambda x: isinstance(x, (int, float)) and x > 0, |
|
92
|
|
|
'D_max': lambda x: isinstance(x, (int, float)) and x > 0, |
|
93
|
|
|
'C_t': lambda x: isinstance(x, (int, float)) and x > 0, |
|
94
|
|
|
'W_n': lambda x: isinstance(x, (int, float)) and x > 0, |
|
95
|
|
|
'W_f': lambda x: isinstance(x, (int, float)) and x > 0, |
|
96
|
|
|
'd_s': lambda x: isinstance(x, (int, float)) and x > 0, |
|
97
|
|
|
'nn': lambda x: isinstance(x, int) and x > 0, |
|
98
|
|
|
'Cr': lambda x: isinstance(x, float) and 0 <= x <= 1, |
|
99
|
|
|
'Mu': lambda x: isinstance(x, float) and 0 <= x <= 1, |
|
100
|
|
|
'epsilon': lambda x: isinstance(x, float) and 0 < x < 1 |
|
101
|
|
|
}) |
|
102
|
|
|
return d |
|
103
|
|
|
|
|
104
|
|
|
def setParameters(self, NP=50, N_max=0.01, V_f=0.02, D_max=0.002, C_t=0.93, W_n=0.42, W_f=0.38, d_s=2.63, nn=5, Cr=0.2, Mu=0.05, epsilon=1e-31, **ukwargs): |
|
105
|
|
|
r"""Set the arguments of an algorithm. |
|
106
|
|
|
|
|
107
|
|
|
Arguments: |
|
108
|
|
|
NP (Optional[int]): Number of krill herds in population. |
|
109
|
|
|
N_max (Optional[float]): Maximum induced speed. |
|
110
|
|
|
V_f (Optional[float]): Foraging speed. |
|
111
|
|
|
D_max (Optional[float]): Maximum diffusion speed. |
|
112
|
|
|
C_t (Optional[float]): Constant $\in [0, 2]$. |
|
113
|
|
|
W_n (Optional[Union[int, float, numpy.ndarray]]): Intera weights of the motion induced from neighbors :math:`\in [0, 1]`. |
|
114
|
|
|
W_f (Optional[Union[int, float, numpy.ndarray]]): Intera weights of the motion induced from foraging :math:`\in [0, 1]`. |
|
115
|
|
|
d_s (Optional[float]): Maximum euclidean distance for neighbors. |
|
116
|
|
|
nn (Optional[int]): Maximum neighbors for neighbors effect. |
|
117
|
|
|
Cr (Optional[float]): Crossover probability. |
|
118
|
|
|
Mu (Optional[float]): Mutation probability. |
|
119
|
|
|
epsilon (Optional[float]): Small numbers for division. |
|
120
|
|
|
|
|
121
|
|
|
See Also: |
|
122
|
|
|
* :func:`NiaPy.algorithms.algorithm.Algorithm.setParameters` |
|
123
|
|
|
""" |
|
124
|
|
|
Algorithm.setParameters(self, NP=NP, **ukwargs) |
|
125
|
|
|
self.N_max, self.V_f, self.D_max, self.C_t, self.W_n, self.W_f, self.d_s, self.nn, self._Cr, self._Mu, self.epsilon = N_max, V_f, D_max, C_t, W_n, W_f, d_s, nn, Cr, Mu, epsilon |
|
126
|
|
|
|
|
127
|
|
|
def getParameters(self): |
|
128
|
|
|
r"""Get parameter values for the algorithm. |
|
129
|
|
|
|
|
130
|
|
|
Returns: |
|
131
|
|
|
Dict[str, Any]: TODO. |
|
132
|
|
|
""" |
|
133
|
|
|
d = Algorithm.getParameters(self) |
|
134
|
|
|
d.update({ |
|
135
|
|
|
'N_max': self.N_max, |
|
136
|
|
|
'V_f': self.V_f, |
|
137
|
|
|
'D_max': self.D_max, |
|
138
|
|
|
'C_t': self.C_t, |
|
139
|
|
|
'W_n': self.W_n, |
|
140
|
|
|
'W_f': self.W_f, |
|
141
|
|
|
'd_s': self.d_s, |
|
142
|
|
|
'nn': self.nn, |
|
143
|
|
|
'Cr': self.Cr, |
|
144
|
|
|
'Mu': self.Mu, |
|
145
|
|
|
'epsilon': self.epsilon |
|
146
|
|
|
}) |
|
147
|
|
|
return d |
|
148
|
|
|
|
|
149
|
|
|
def initWeights(self, task): |
|
150
|
|
|
r"""Initialize weights. |
|
151
|
|
|
|
|
152
|
|
|
Args: |
|
153
|
|
|
task (Task): Optimization task. |
|
154
|
|
|
|
|
155
|
|
|
Returns: |
|
156
|
|
|
Tuple[numpy.ndarray, numpy.ndarray]: |
|
157
|
|
|
1. Weights for neighborhood. |
|
158
|
|
|
2. Weights for foraging. |
|
159
|
|
|
""" |
|
160
|
|
|
return fullArray(self.W_n, task.D), fullArray(self.W_f, task.D) |
|
161
|
|
|
|
|
162
|
|
|
def sensRange(self, ki, KH): |
|
163
|
|
|
r"""Calculate sense range for selected individual. |
|
164
|
|
|
|
|
165
|
|
|
Args: |
|
166
|
|
|
ki (int): Selected individual. |
|
167
|
|
|
KH (numpy.ndarray): Krill heard population. |
|
168
|
|
|
|
|
169
|
|
|
Returns: |
|
170
|
|
|
float: Sense range for krill. |
|
171
|
|
|
""" |
|
172
|
|
|
return sum([ed(KH[ki], KH[i]) for i in range(self.NP)]) / (self.nn * self.NP) |
|
173
|
|
|
|
|
174
|
|
|
def getNeighbours(self, i, ids, KH): |
|
175
|
|
|
r"""Get neighbours. |
|
176
|
|
|
|
|
177
|
|
|
Args: |
|
178
|
|
|
i (int): Individual looking for neighbours. |
|
179
|
|
|
ids (float): Maximal distance for being a neighbour. |
|
180
|
|
|
KH (numpy.ndarray): Current population. |
|
181
|
|
|
|
|
182
|
|
|
Returns: |
|
183
|
|
|
numpy.ndarray: Neighbours of krill heard. |
|
184
|
|
|
""" |
|
185
|
|
|
N = list() |
|
186
|
|
|
for j in range(self.NP): |
|
187
|
|
|
if j != i and ids > ed(KH[i], KH[j]): N.append(j) |
|
188
|
|
|
if not N: N.append(self.randint(self.NP)) |
|
189
|
|
|
return asarray(N) |
|
190
|
|
|
|
|
191
|
|
|
def funX(self, x, y): |
|
192
|
|
|
r"""Get x values. |
|
193
|
|
|
|
|
194
|
|
|
Args: |
|
195
|
|
|
x (numpy.ndarray): First krill/individual. |
|
196
|
|
|
y (numpy.ndarray): Second krill/individual. |
|
197
|
|
|
|
|
198
|
|
|
Returns: |
|
199
|
|
|
numpy.ndarray: -- |
|
200
|
|
|
""" |
|
201
|
|
|
return ((y - x) + self.epsilon) / (ed(y, x) + self.epsilon) |
|
202
|
|
|
|
|
203
|
|
|
def funK(self, x, y, b, w): |
|
204
|
|
|
r"""Get k values. |
|
205
|
|
|
|
|
206
|
|
|
Args: |
|
207
|
|
|
x (numpy.ndarray): First krill/individual. |
|
208
|
|
|
y (numpy.ndarray): Second krill/individual. |
|
209
|
|
|
b (numpy.ndarray): Best krill/individual. |
|
210
|
|
|
w (numpy.ndarray): Worst krill/individual. |
|
211
|
|
|
|
|
212
|
|
|
Returns: |
|
213
|
|
|
numpy.ndarray: -- |
|
214
|
|
|
""" |
|
215
|
|
|
return ((x - y) + self.epsilon) / ((w - b) + self.epsilon) |
|
216
|
|
|
|
|
217
|
|
|
def induceNeighborsMotion(self, i, n, W, KH, KH_f, ikh_b, ikh_w, task): |
|
218
|
|
|
r"""Induced neighbours motion operator. |
|
219
|
|
|
|
|
220
|
|
|
Args: |
|
221
|
|
|
i (int): Index of individual being applied with operator. |
|
222
|
|
|
n: |
|
223
|
|
|
W (numpy.ndarray[float]): Wights for this operator. |
|
224
|
|
|
KH (numpy.ndarray): Current heard/population. |
|
225
|
|
|
KH_f (numpy.ndarray[float]): Current populations/heard function/fitness values. |
|
226
|
|
|
ikh_b (int): Current best krill in heard/population. |
|
227
|
|
|
ikh_w (int): Current worst krill in heard/population. |
|
228
|
|
|
task (Task): Optimization task. |
|
229
|
|
|
|
|
230
|
|
|
Returns: |
|
231
|
|
|
numpy.ndarray: Moved krill. |
|
232
|
|
|
""" |
|
233
|
|
|
Ni = self.getNeighbours(i, self.sensRange(i, KH), KH) |
|
234
|
|
|
Nx, Nf, f_b, f_w = KH[Ni], KH_f[Ni], KH_f[ikh_b], KH_f[ikh_w] |
|
235
|
|
|
alpha_l = sum(asarray([self.funK(KH_f[i], j, f_b, f_w) for j in Nf]) * asarray([self.funX(KH[i], j) for j in Nx]).T) |
|
236
|
|
|
alpha_t = 2 * (1 + self.rand() * task.Iters / task.nGEN) |
|
237
|
|
|
return self.N_max * (alpha_l + alpha_t) + W * n |
|
238
|
|
|
|
|
239
|
|
|
def induceForagingMotion(self, i, x, x_f, f, W, KH, KH_f, ikh_b, ikh_w, task): |
|
240
|
|
|
r"""Induced foraging motion operator. |
|
241
|
|
|
|
|
242
|
|
|
Args: |
|
243
|
|
|
i (int): Index of current krill being operated. |
|
244
|
|
|
x (numpy.ndarray): Position of food. |
|
245
|
|
|
x_f (float): Fitness/function values of food. |
|
246
|
|
|
f: |
|
247
|
|
|
W (numpy.ndarray[float]): Weights for this operator. |
|
248
|
|
|
KH (numpy.ndarray): Current population/heard. |
|
249
|
|
|
KH_f (numpy.ndarray[float]): Current heard/populations function/fitness values. |
|
250
|
|
|
ikh_b (int): Index of current best krill in heard. |
|
251
|
|
|
ikh_w (int): Index of current worst krill in heard. |
|
252
|
|
|
task (Task): Optimization task. |
|
253
|
|
|
|
|
254
|
|
|
Returns: |
|
255
|
|
|
numpy.ndarray: Moved krill. |
|
256
|
|
|
""" |
|
257
|
|
|
beta_f = 2 * (1 - task.Iters / task.nGEN) * self.funK(KH_f[i], x_f, KH_f[ikh_b], KH_f[ikh_w]) * self.funX(KH[i], x) if KH_f[ikh_b] < KH_f[i] else 0 |
|
258
|
|
|
beta_b = self.funK(KH_f[i], KH_f[ikh_b], KH_f[ikh_b], KH_f[ikh_w]) * self.funX(KH[i], KH[ikh_b]) |
|
259
|
|
|
return self.V_f * (beta_f + beta_b) + W * f |
|
260
|
|
|
|
|
261
|
|
|
def inducePhysicalDiffusion(self, task): |
|
262
|
|
|
r"""Induced physical diffusion operator. |
|
263
|
|
|
|
|
264
|
|
|
Args: |
|
265
|
|
|
task (Task): Optimization task. |
|
266
|
|
|
|
|
267
|
|
|
Returns: |
|
268
|
|
|
numpy.ndarray: |
|
269
|
|
|
""" |
|
270
|
|
|
return self.D_max * (1 - task.Iters / task.nGEN) * self.uniform(-1, 1, task.D) |
|
271
|
|
|
|
|
272
|
|
|
def deltaT(self, task): |
|
273
|
|
|
r"""Get new delta for all dimensions. |
|
274
|
|
|
|
|
275
|
|
|
Args: |
|
276
|
|
|
task (Task): Optimization task. |
|
277
|
|
|
|
|
278
|
|
|
Returns: |
|
279
|
|
|
numpy.ndarray: -- |
|
280
|
|
|
""" |
|
281
|
|
|
return self.C_t * sum(task.bRange) |
|
282
|
|
|
|
|
283
|
|
|
def crossover(self, x, xo, Cr): |
|
284
|
|
|
r"""Crossover operator. |
|
285
|
|
|
|
|
286
|
|
|
Args: |
|
287
|
|
|
x (numpy.ndarray): Krill/individual being applied with operator. |
|
288
|
|
|
xo (numpy.ndarray): Krill/individual being used in conjunction within operator. |
|
289
|
|
|
Cr (float): Crossover probability. |
|
290
|
|
|
|
|
291
|
|
|
Returns: |
|
292
|
|
|
numpy.ndarray: Crossoverd krill/individual. |
|
293
|
|
|
""" |
|
294
|
|
|
return [xo[i] if self.rand() < Cr else x[i] for i in range(len(x))] |
|
295
|
|
|
|
|
296
|
|
|
def mutate(self, x, x_b, Mu): |
|
297
|
|
|
r"""Mutate operator. |
|
298
|
|
|
|
|
299
|
|
|
Args: |
|
300
|
|
|
x (numpy.ndarray): Individual being mutated. |
|
301
|
|
|
x_b (numpy.ndarray): Global best individual. |
|
302
|
|
|
Mu (float): Probability of mutations. |
|
303
|
|
|
|
|
304
|
|
|
Returns: |
|
305
|
|
|
numpy.ndarray: Mutated krill. |
|
306
|
|
|
""" |
|
307
|
|
|
return [x[i] if self.rand() < Mu else (x_b[i] + self.rand()) for i in range(len(x))] |
|
308
|
|
|
|
|
309
|
|
|
def getFoodLocation(self, KH, KH_f, task): |
|
310
|
|
|
r"""Get food location for krill heard. |
|
311
|
|
|
|
|
312
|
|
|
Args: |
|
313
|
|
|
KH (numpy.ndarray): Current heard/population. |
|
314
|
|
|
KH_f (numpy.ndarray[float]): Current heard/populations function/fitness values. |
|
315
|
|
|
task (Task): Optimization task. |
|
316
|
|
|
|
|
317
|
|
|
Returns: |
|
318
|
|
|
Tuple[numpy.ndarray, float]: |
|
319
|
|
|
1. Location of food. |
|
320
|
|
|
2. Foods function/fitness value. |
|
321
|
|
|
""" |
|
322
|
|
|
x_food = task.repair(asarray([sum(KH[:, i] / KH_f) for i in range(task.D)]) / sum(1 / KH_f), rnd=self.Rand) |
|
323
|
|
|
x_food_f = task.eval(x_food) |
|
324
|
|
|
return x_food, x_food_f |
|
325
|
|
|
|
|
326
|
|
|
def Mu(self, xf, yf, xf_best, xf_worst): |
|
327
|
|
|
r"""Get mutation probability. |
|
328
|
|
|
|
|
329
|
|
|
Args: |
|
330
|
|
|
xf (float): |
|
331
|
|
|
yf (float): |
|
332
|
|
|
xf_best (float): |
|
333
|
|
|
xf_worst (float): |
|
334
|
|
|
|
|
335
|
|
|
Returns: |
|
336
|
|
|
float: New mutation probability. |
|
337
|
|
|
""" |
|
338
|
|
|
return self._Mu / (self.funK(xf, yf, xf_best, xf_worst) + 1e-31) |
|
339
|
|
|
|
|
340
|
|
|
def Cr(self, xf, yf, xf_best, xf_worst): |
|
341
|
|
|
r"""Get crossover probability. |
|
342
|
|
|
|
|
343
|
|
|
Args: |
|
344
|
|
|
xf (float): |
|
345
|
|
|
yf (float): |
|
346
|
|
|
xf_best (float): |
|
347
|
|
|
xf_worst (flaot): |
|
348
|
|
|
|
|
349
|
|
|
Returns: |
|
350
|
|
|
float: New crossover probability. |
|
351
|
|
|
""" |
|
352
|
|
|
return self._Cr * self.funK(xf, yf, xf_best, xf_worst) |
|
353
|
|
|
|
|
354
|
|
|
def initPopulation(self, task): |
|
355
|
|
|
r"""Initialize stating population. |
|
356
|
|
|
|
|
357
|
|
|
Args: |
|
358
|
|
|
task (Task): Optimization task. |
|
359
|
|
|
|
|
360
|
|
|
Returns: |
|
361
|
|
|
Tuple[numpy.ndarray, numpy.ndarray, Dict[str, Any]]: |
|
362
|
|
|
1. Initialized population. |
|
363
|
|
|
2. Initialized populations function/fitness values. |
|
364
|
|
|
3. Additional arguments: |
|
365
|
|
|
* W_n (numpy.ndarray): Weights neighborhood. |
|
366
|
|
|
* W_f (numpy.ndarray): Weights foraging. |
|
367
|
|
|
* N (numpy.ndarray): TODO |
|
368
|
|
|
* F (numpy.ndarray): TODO |
|
369
|
|
|
|
|
370
|
|
|
See Also: |
|
371
|
|
|
* :func:`NiaPy.algorithms.algorithm.Algorithm.initPopulation` |
|
372
|
|
|
""" |
|
373
|
|
|
KH, KH_f, d = Algorithm.initPopulation(self, task) |
|
374
|
|
|
W_n, W_f = self.initWeights(task) |
|
375
|
|
|
N, F = full(self.NP, .0), full(self.NP, .0) |
|
376
|
|
|
d.update({'W_n': W_n, 'W_f': W_f, 'N': N, 'F': F}) |
|
377
|
|
|
return KH, KH_f, d |
|
378
|
|
|
|
|
379
|
|
|
def runIteration(self, task, KH, KH_f, xb, fxb, W_n, W_f, N, F, **dparams): |
|
380
|
|
|
r"""Core function of KrillHerd algorithm. |
|
381
|
|
|
|
|
382
|
|
|
Args: |
|
383
|
|
|
task (Task): Optimization task. |
|
384
|
|
|
KH (numpy.ndarray): Current heard/population. |
|
385
|
|
|
KH_f (numpy.ndarray[float]): Current heard/populations function/fitness values. |
|
386
|
|
|
xb (numpy.ndarray): Global best individual. |
|
387
|
|
|
fxb (float): Global best individuals function fitness values. |
|
388
|
|
|
W_n (numpy.ndarray): |
|
389
|
|
|
W_f (numpy.ndarray): |
|
390
|
|
|
N (): |
|
391
|
|
|
F (): |
|
392
|
|
|
**dparams (Dict[str, Any]): Additional arguments. |
|
393
|
|
|
|
|
394
|
|
|
Returns: |
|
395
|
|
|
Tuple [numpy.ndarray, numpy.ndarray, numpy.ndarray, float Dict[str, Any]]: |
|
396
|
|
|
1. New herd/population |
|
397
|
|
|
2. New herd/populations function/fitness values. |
|
398
|
|
|
3. New global best solution. |
|
399
|
|
|
4. New global best solutoins fitness/objective value. |
|
400
|
|
|
5. Additional arguments: |
|
401
|
|
|
* W_n (numpy.ndarray): -- |
|
402
|
|
|
* W_f (numpy.ndarray): -- |
|
403
|
|
|
* N (numpy.ndarray): -- |
|
404
|
|
|
* F (numpy.ndarray): -- |
|
405
|
|
|
""" |
|
406
|
|
|
ikh_b, ikh_w = argmin(KH_f), argmax(KH_f) |
|
407
|
|
|
x_food, x_food_f = self.getFoodLocation(KH, KH_f, task) |
|
408
|
|
|
if x_food_f < fxb: xb, fxb = x_food, x_food_f # noqa: F841 |
|
409
|
|
|
N = asarray([self.induceNeighborsMotion(i, N[i], W_n, KH, KH_f, ikh_b, ikh_w, task) for i in range(self.NP)]) |
|
410
|
|
|
F = asarray([self.induceForagingMotion(i, x_food, x_food_f, F[i], W_f, KH, KH_f, ikh_b, ikh_w, task) for i in range(self.NP)]) |
|
411
|
|
|
D = asarray([self.inducePhysicalDiffusion(task) for i in range(self.NP)]) |
|
412
|
|
|
KH_n = KH + (self.deltaT(task) * (N + F + D)) |
|
413
|
|
|
Cr = asarray([self.Cr(KH_f[i], KH_f[ikh_b], KH_f[ikh_b], KH_f[ikh_w]) for i in range(self.NP)]) |
|
414
|
|
|
KH_n = asarray([self.crossover(KH_n[i], KH[i], Cr[i]) for i in range(self.NP)]) |
|
415
|
|
|
Mu = asarray([self.Mu(KH_f[i], KH_f[ikh_b], KH_f[ikh_b], KH_f[ikh_w]) for i in range(self.NP)]) |
|
416
|
|
|
KH_n = asarray([self.mutate(KH_n[i], KH[ikh_b], Mu[i]) for i in range(self.NP)]) |
|
417
|
|
|
KH = apply_along_axis(task.repair, 1, KH_n, rnd=self.Rand) |
|
418
|
|
|
KH_f = apply_along_axis(task.eval, 1, KH) |
|
419
|
|
|
xb, fxb = self.getBest(KH, KH_f, xb, fxb) |
|
420
|
|
|
return KH, KH_f, xb, fxb, {'W_n': W_n, 'W_f': W_f, 'N': N, 'F': F} |
|
421
|
|
|
|
|
422
|
|
|
class KrillHerdV4(KrillHerd): |
|
423
|
|
|
r"""Implementation of krill herd algorithm. |
|
424
|
|
|
|
|
425
|
|
|
Algorithm: |
|
426
|
|
|
Krill Herd Algorithm |
|
427
|
|
|
|
|
428
|
|
|
Date: |
|
429
|
|
|
2018 |
|
430
|
|
|
|
|
431
|
|
|
Authors: |
|
432
|
|
|
Klemen Berkovič |
|
433
|
|
|
|
|
434
|
|
|
License: |
|
435
|
|
|
MIT |
|
436
|
|
|
|
|
437
|
|
|
Reference URL: |
|
438
|
|
|
http://www.sciencedirect.com/science/article/pii/S1007570412002171 |
|
439
|
|
|
|
|
440
|
|
|
Reference paper: |
|
441
|
|
|
Amir Hossein Gandomi, Amir Hossein Alavi, Krill herd: A new bio-inspired optimization algorithm, Communications in Nonlinear Science and Numerical Simulation, Volume 17, Issue 12, 2012, Pages 4831-4845, ISSN 1007-5704, https://doi.org/10.1016/j.cnsns.2012.05.010. |
|
442
|
|
|
|
|
443
|
|
|
Attributes: |
|
444
|
|
|
Name (List[str]): List of strings representing algorithm name. |
|
445
|
|
|
""" |
|
446
|
|
|
Name = ['KrillHerdV4', 'KHv4'] |
|
447
|
|
|
|
|
448
|
|
|
@staticmethod |
|
449
|
|
|
def algorithmInfo(): |
|
450
|
|
|
r"""Get basic information of algorithm. |
|
451
|
|
|
|
|
452
|
|
|
Returns: |
|
453
|
|
|
str: Basic information of algorithm. |
|
454
|
|
|
|
|
455
|
|
|
See Also: |
|
456
|
|
|
* :func:`NiaPy.algorithms.Algorithm.algorithmInfo` |
|
457
|
|
|
""" |
|
458
|
|
|
return r"""Amir Hossein Gandomi, Amir Hossein Alavi, Krill herd: A new bio-inspired optimization algorithm, Communications in Nonlinear Science and Numerical Simulation, Volume 17, Issue 12, 2012, Pages 4831-4845, ISSN 1007-5704, https://doi.org/10.1016/j.cnsns.2012.05.010.""" |
|
459
|
|
|
|
|
460
|
|
|
@staticmethod |
|
461
|
|
|
def typeParameters(): |
|
462
|
|
|
r"""Get dictionary with functions for checking values of parameters. |
|
463
|
|
|
|
|
464
|
|
|
Returns: |
|
465
|
|
|
Dict[str, Callable]: Dictionary with testing functions for parameters. |
|
466
|
|
|
|
|
467
|
|
|
See Also: |
|
468
|
|
|
* :func:NiaPy.algorithms.basic.kh.KrillHerd.typeParameters` |
|
469
|
|
|
""" |
|
470
|
|
|
d = KrillHerd.typeParameters() |
|
471
|
|
|
d.pop('Cr', None) |
|
472
|
|
|
d.pop('Mu', None) |
|
473
|
|
|
d.pop('epsilon', None) |
|
474
|
|
|
return d |
|
475
|
|
|
|
|
476
|
|
|
def setParameters(self, NP=50, N_max=0.01, V_f=0.02, D_max=0.002, C_t=0.93, W_n=0.42, W_f=0.38, d_s=2.63, **ukwargs): |
|
477
|
|
|
r"""Set algorithm core parameters. |
|
478
|
|
|
|
|
479
|
|
|
Args: |
|
480
|
|
|
NP (int): Number of kills in herd. |
|
481
|
|
|
N_max (Optional[float]): TODO |
|
482
|
|
|
V_f (Optional[float]): TODO |
|
483
|
|
|
D_max (Optional[float]): TODO |
|
484
|
|
|
C_t (Optional[float]): TODO |
|
485
|
|
|
W_n (Optional[Union[int, float, numpy.ndarray, list]]): Weights for neighborhood. |
|
486
|
|
|
W_f (Optional[Union[int, float, numpy.ndarray, list]]): Weights for foraging. |
|
487
|
|
|
d_s (Optional[float]): TODO |
|
488
|
|
|
**ukwargs (Dict[str, Any]): Additional arguments. |
|
489
|
|
|
|
|
490
|
|
|
See Also: |
|
491
|
|
|
* :func:NiaPy.algorithms.basic.kh.KrillHerd.KrillHerd.setParameters` |
|
492
|
|
|
""" |
|
493
|
|
|
KrillHerd.setParameters(self, NP=NP, N_max=N_max, V_f=V_f, D_max=D_max, C_t=C_t, W_n=W_n, W_f=W_f, d_s=d_s, nn=4, Cr=0.2, Mu=0.05, epsilon=1e-31, **ukwargs) |
|
494
|
|
|
|
|
495
|
|
|
class KrillHerdV1(KrillHerd): |
|
496
|
|
|
r"""Implementation of krill herd algorithm. |
|
497
|
|
|
|
|
498
|
|
|
Algorithm: |
|
499
|
|
|
Krill Herd Algorithm |
|
500
|
|
|
|
|
501
|
|
|
Date: |
|
502
|
|
|
2018 |
|
503
|
|
|
|
|
504
|
|
|
Authors: |
|
505
|
|
|
Klemen Berkovič |
|
506
|
|
|
|
|
507
|
|
|
License: |
|
508
|
|
|
MIT |
|
509
|
|
|
|
|
510
|
|
|
Reference URL: |
|
511
|
|
|
http://www.sciencedirect.com/science/article/pii/S1007570412002171 |
|
512
|
|
|
|
|
513
|
|
|
Reference paper: |
|
514
|
|
|
Amir Hossein Gandomi, Amir Hossein Alavi, Krill herd: A new bio-inspired optimization algorithm, Communications in Nonlinear Science and Numerical Simulation, Volume 17, Issue 12, 2012, Pages 4831-4845, ISSN 1007-5704, https://doi.org/10.1016/j.cnsns.2012.05.010. |
|
515
|
|
|
|
|
516
|
|
|
Attributes: |
|
517
|
|
|
Name (List[str]): List of strings representing algorithm name. |
|
518
|
|
|
|
|
519
|
|
|
See Also: |
|
520
|
|
|
* :func:NiaPy.algorithms.basic.kh.KrillHerd.KrillHerd` |
|
521
|
|
|
""" |
|
522
|
|
|
Name = ['KrillHerdV1', 'KHv1'] |
|
523
|
|
|
|
|
524
|
|
|
@staticmethod |
|
525
|
|
|
def algorithmInfo(): |
|
526
|
|
|
r"""Get basic information of algorithm. |
|
527
|
|
|
|
|
528
|
|
|
Returns: |
|
529
|
|
|
str: Basic information of algorithm. |
|
530
|
|
|
|
|
531
|
|
|
See Also: |
|
532
|
|
|
* :func:`NiaPy.algorithms.Algorithm.algorithmInfo` |
|
533
|
|
|
""" |
|
534
|
|
|
return r"""Amir Hossein Gandomi, Amir Hossein Alavi, Krill herd: A new bio-inspired optimization algorithm, Communications in Nonlinear Science and Numerical Simulation, Volume 17, Issue 12, 2012, Pages 4831-4845, ISSN 1007-5704, https://doi.org/10.1016/j.cnsns.2012.05.010.""" |
|
535
|
|
|
|
|
536
|
|
|
@staticmethod |
|
537
|
|
|
def typeParameters(): |
|
538
|
|
|
r"""Get dictionary with functions for checking values of parameters. |
|
539
|
|
|
|
|
540
|
|
|
Returns: |
|
541
|
|
|
Dict[str, Callable]: Dictionary with testing functions for parameters. |
|
542
|
|
|
|
|
543
|
|
|
See Also: |
|
544
|
|
|
* :func:NiaPy.algorithms.basic.kh.KrillHerd.typeParameters` |
|
545
|
|
|
""" |
|
546
|
|
|
return KrillHerd.typeParameters() |
|
547
|
|
|
|
|
548
|
|
|
def crossover(self, x, xo, Cr): |
|
549
|
|
|
r"""Preform a crossover operation on individual. |
|
550
|
|
|
|
|
551
|
|
|
Args: |
|
552
|
|
|
x (numpy.ndarray): Current individual. |
|
553
|
|
|
xo (numpy.ndarray): New individual. |
|
554
|
|
|
Cr (float): Crossover probability. |
|
555
|
|
|
|
|
556
|
|
|
Returns: |
|
557
|
|
|
numpy.ndarray: Crossover individual. |
|
558
|
|
|
""" |
|
559
|
|
|
return x |
|
560
|
|
|
|
|
561
|
|
|
def mutate(self, x, x_b, Mu): |
|
562
|
|
|
r"""Mutate individual. |
|
563
|
|
|
|
|
564
|
|
|
Args: |
|
565
|
|
|
x (numpy.ndarray): Current individual. |
|
566
|
|
|
x_b (numpy.ndarray): Global best individual. |
|
567
|
|
|
Mu (float): Mutation probability. |
|
568
|
|
|
|
|
569
|
|
|
Returns: |
|
570
|
|
|
numpy.ndarray: Mutated krill. |
|
571
|
|
|
""" |
|
572
|
|
|
return x |
|
573
|
|
|
|
|
574
|
|
|
class KrillHerdV2(KrillHerd): |
|
575
|
|
|
r"""Implementation of krill herd algorithm. |
|
576
|
|
|
|
|
577
|
|
|
Algorithm: |
|
578
|
|
|
Krill Herd Algorithm |
|
579
|
|
|
|
|
580
|
|
|
Date: |
|
581
|
|
|
2018 |
|
582
|
|
|
|
|
583
|
|
|
Authors: |
|
584
|
|
|
Klemen Berkovič |
|
585
|
|
|
|
|
586
|
|
|
License: |
|
587
|
|
|
MIT |
|
588
|
|
|
|
|
589
|
|
|
Reference URL: |
|
590
|
|
|
http://www.sciencedirect.com/science/article/pii/S1007570412002171 |
|
591
|
|
|
|
|
592
|
|
|
Reference paper: |
|
593
|
|
|
Amir Hossein Gandomi, Amir Hossein Alavi, Krill herd: A new bio-inspired optimization algorithm, Communications in Nonlinear Science and Numerical Simulation, Volume 17, Issue 12, 2012, Pages 4831-4845, ISSN 1007-5704, https://doi.org/10.1016/j.cnsns.2012.05.010. |
|
594
|
|
|
|
|
595
|
|
|
Attributes: |
|
596
|
|
|
Name (List[str]): List of strings representing algorithm name. |
|
597
|
|
|
""" |
|
598
|
|
|
Name = ['KrillHerdV2', 'KHv2'] |
|
599
|
|
|
|
|
600
|
|
|
@staticmethod |
|
601
|
|
|
def algorithmInfo(): |
|
602
|
|
|
r"""Get basic information of algorithm. |
|
603
|
|
|
|
|
604
|
|
|
Returns: |
|
605
|
|
|
str: Basic information of algorithm. |
|
606
|
|
|
|
|
607
|
|
|
See Also: |
|
608
|
|
|
* :func:`NiaPy.algorithms.Algorithm.algorithmInfo` |
|
609
|
|
|
""" |
|
610
|
|
|
return r"""Amir Hossein Gandomi, Amir Hossein Alavi, Krill herd: A new bio-inspired optimization algorithm, Communications in Nonlinear Science and Numerical Simulation, Volume 17, Issue 12, 2012, Pages 4831-4845, ISSN 1007-5704, https://doi.org/10.1016/j.cnsns.2012.05.010.""" |
|
611
|
|
|
|
|
612
|
|
|
@staticmethod |
|
613
|
|
|
def typeParameters(): |
|
614
|
|
|
r"""Get dictionary with functions for checking values of parameters. |
|
615
|
|
|
|
|
616
|
|
|
Returns: |
|
617
|
|
|
Dict[str, Callable]: Dictionary with testing functions for algorithms parameters. |
|
618
|
|
|
|
|
619
|
|
|
See Also: |
|
620
|
|
|
* :func:NiaPy.algorithms.basic.kh.KrillHerd.typeParameters` |
|
621
|
|
|
""" |
|
622
|
|
|
d = KrillHerd.typeParameters() |
|
623
|
|
|
d.pop('Mu', None) |
|
624
|
|
|
return d |
|
625
|
|
|
|
|
626
|
|
|
def mutate(self, x, x_b, Mu): |
|
627
|
|
|
r"""Mutate individual. |
|
628
|
|
|
|
|
629
|
|
|
Args: |
|
630
|
|
|
x (numpy.ndarray): Individual to mutate. |
|
631
|
|
|
x_b (numpy.ndarray): Global best individual. |
|
632
|
|
|
Mu (float): Mutation probability. |
|
633
|
|
|
|
|
634
|
|
|
Returns: |
|
635
|
|
|
numpy.ndarray: Mutated individual. |
|
636
|
|
|
""" |
|
637
|
|
|
return x |
|
638
|
|
|
|
|
639
|
|
|
class KrillHerdV3(KrillHerd): |
|
640
|
|
|
r"""Implementation of krill herd algorithm. |
|
641
|
|
|
|
|
642
|
|
|
Algorithm: |
|
643
|
|
|
Krill Herd Algorithm |
|
644
|
|
|
|
|
645
|
|
|
Date: |
|
646
|
|
|
2018 |
|
647
|
|
|
|
|
648
|
|
|
Authors: |
|
649
|
|
|
Klemen Berkovič |
|
650
|
|
|
|
|
651
|
|
|
License: |
|
652
|
|
|
MIT |
|
653
|
|
|
|
|
654
|
|
|
Reference URL: |
|
655
|
|
|
http://www.sciencedirect.com/science/article/pii/S1007570412002171 |
|
656
|
|
|
|
|
657
|
|
|
Reference paper: |
|
658
|
|
|
Amir Hossein Gandomi, Amir Hossein Alavi, Krill herd: A new bio-inspired optimization algorithm, Communications in Nonlinear Science and Numerical Simulation, Volume 17, Issue 12, 2012, Pages 4831-4845, ISSN 1007-5704, https://doi.org/10.1016/j.cnsns.2012.05.010. |
|
659
|
|
|
""" |
|
660
|
|
|
Name = ['KrillHerdV3', 'KHv3'] |
|
661
|
|
|
|
|
662
|
|
|
@staticmethod |
|
663
|
|
|
def algorithmInfo(): |
|
664
|
|
|
r"""Get basic information of algorithm. |
|
665
|
|
|
|
|
666
|
|
|
Returns: |
|
667
|
|
|
str: Basic information of algorithm. |
|
668
|
|
|
|
|
669
|
|
|
See Also: |
|
670
|
|
|
* :func:`NiaPy.algorithms.Algorithm.algorithmInfo` |
|
671
|
|
|
""" |
|
672
|
|
|
return r"""Amir Hossein Gandomi, Amir Hossein Alavi, Krill herd: A new bio-inspired optimization algorithm, Communications in Nonlinear Science and Numerical Simulation, Volume 17, Issue 12, 2012, Pages 4831-4845, ISSN 1007-5704, https://doi.org/10.1016/j.cnsns.2012.05.010.""" |
|
673
|
|
|
|
|
674
|
|
|
@staticmethod |
|
675
|
|
|
def typeParameters(): |
|
676
|
|
|
r"""Get dictionary with functions for checking values of parameters. |
|
677
|
|
|
|
|
678
|
|
|
Returns: |
|
679
|
|
|
Dict[str, Callable]: Dictionary with testing functions for algorithms parameters. |
|
680
|
|
|
|
|
681
|
|
|
See Also: |
|
682
|
|
|
* :func:NiaPy.algorithms.basic.kh.KrillHerd.typeParameters` |
|
683
|
|
|
""" |
|
684
|
|
|
d = KrillHerd.typeParameters() |
|
685
|
|
|
d.pop('Cr', None) |
|
686
|
|
|
return d |
|
687
|
|
|
|
|
688
|
|
|
def crossover(self, x, xo, Cr): |
|
689
|
|
|
r"""Crossover operator. |
|
690
|
|
|
|
|
691
|
|
|
Args: |
|
692
|
|
|
x (numpy.ndarray): Krill/individual being applied with operator. |
|
693
|
|
|
xo (numpy.ndarray): Krill/individual being used in operator. |
|
694
|
|
|
Cr (float): Crossover probability. |
|
695
|
|
|
|
|
696
|
|
|
Returns: |
|
697
|
|
|
numpy.ndarray: Crossover krill/individual. |
|
698
|
|
|
""" |
|
699
|
|
|
return x |
|
700
|
|
|
|
|
701
|
|
|
class KrillHerdV11(KrillHerd): |
|
702
|
|
|
r"""Implementation of krill herd algorithm. |
|
703
|
|
|
|
|
704
|
|
|
Algorithm: |
|
705
|
|
|
Krill Herd Algorithm |
|
706
|
|
|
|
|
707
|
|
|
Date: |
|
708
|
|
|
2018 |
|
709
|
|
|
|
|
710
|
|
|
Authors: |
|
711
|
|
|
Klemen Berkovič |
|
712
|
|
|
|
|
713
|
|
|
License: |
|
714
|
|
|
MIT |
|
715
|
|
|
|
|
716
|
|
|
Reference URL: |
|
717
|
|
|
|
|
718
|
|
|
Reference paper: |
|
719
|
|
|
""" |
|
720
|
|
|
Name = ['KrillHerdV11', 'KHv11'] |
|
721
|
|
|
|
|
722
|
|
|
def ElitistSelection(self, KH, KH_f, KHo, KHo_f): |
|
723
|
|
|
r"""Select krills/individuals that are better than odl krills. |
|
724
|
|
|
|
|
725
|
|
|
Args: |
|
726
|
|
|
KH (numpy.ndarray): Current herd/population. |
|
727
|
|
|
KH_f (numpy.ndarray[float]): Current herd/populations function/fitness values |
|
728
|
|
|
KHo (numpy.ndarray): New herd/population. |
|
729
|
|
|
KHo_f (numpy.ndarray[float]): New herd/populations function/fitness vales. |
|
730
|
|
|
|
|
731
|
|
|
Returns: |
|
732
|
|
|
Tuple[numpy.ndarray, numpy.numpy[float]]: |
|
733
|
|
|
1. New herd/population. |
|
734
|
|
|
2. New herd/populations function/fitness values. |
|
735
|
|
|
""" |
|
736
|
|
|
ipb = where(KHo_f >= KH_f) |
|
737
|
|
|
KHo[ipb], KHo_f[ipb] = KH[ipb], KH_f[ipb] |
|
738
|
|
|
return KHo, KHo_f |
|
739
|
|
|
|
|
740
|
|
|
def Neighbors(self, i, KH, KH_f, iw, ib, N, W_n, task): |
|
741
|
|
|
r"""Neighbors operator. |
|
742
|
|
|
|
|
743
|
|
|
Args: |
|
744
|
|
|
i (int): Index of krill being applied with operator. |
|
745
|
|
|
KH (numpy.ndarray): Current herd/population. |
|
746
|
|
|
KH_f (numpy.ndarray[float]): Current herd/populations function/fitness values. |
|
747
|
|
|
iw (int): Index of worst krill/individual. |
|
748
|
|
|
ib (int): Index of best krill/individual. |
|
749
|
|
|
N (): -- |
|
750
|
|
|
W_n (numpy.ndarray): Weights for neighbors operator. |
|
751
|
|
|
task (Task): Optimization task. |
|
752
|
|
|
|
|
753
|
|
|
Returns: |
|
754
|
|
|
numpy.ndarray: -- |
|
755
|
|
|
""" |
|
756
|
|
|
Rgb, RR, Kw_Kgb = KH[ib] - KH[i], KH - KH[i], KH_f[iw] - KH_f[ib] |
|
757
|
|
|
R = sqrt(sum(RR * RR)) |
|
758
|
|
|
alpha_b = -2 * (1 + self.rand() * task.Iters / task.nGEN) * (KH_f[ib]) / Kw_Kgb / sqrt(sum(Rgb * Rgb)) * Rgb if KH_f[ib] < KH_f[i] else 0 |
|
759
|
|
|
alpah_n, nn, ds = 0.0, 0, mean(R) / 5 |
|
760
|
|
|
for n in range(self.NP): |
|
761
|
|
|
if R < ds and n != i: |
|
762
|
|
|
nn += 1 |
|
763
|
|
|
if nn <= 4 and KH_f[i] != KH[n]: alpah_n -= (KH(n) - KH[i]) / Kw_Kgb / R[n] * RR[n] |
|
764
|
|
|
return W_n * N * self.N_max * (alpha_b + alpah_n) |
|
765
|
|
|
|
|
766
|
|
|
def Foraging(self, KH, KH_f, KHo, KHo_f, W_f, F, KH_wf, KH_bf, x_food, x_food_f, task): |
|
767
|
|
|
r"""Foraging operator. |
|
768
|
|
|
|
|
769
|
|
|
Args: |
|
770
|
|
|
KH (numpy.ndarray): Current heard/population. |
|
771
|
|
|
KH_f (numpy.ndarray[float]): Current herd/populations function/fitness values. |
|
772
|
|
|
KHo (numpy.ndarray): New heard/population. |
|
773
|
|
|
KHo_f (numpy.ndarray[float]): New heard/population function/fitness values. |
|
774
|
|
|
W_f (numpy.ndarray): Weights for foraging. |
|
775
|
|
|
F (): -- |
|
776
|
|
|
KH_wf (numpy.ndarray): Worst krill in herd/population. |
|
777
|
|
|
KH_bf (numpy.ndarray): Best krill in herd/population. |
|
778
|
|
|
x_food (numpy.ndarray): Foods position. |
|
779
|
|
|
x_food_f (float): Foods function/fitness value. |
|
780
|
|
|
task (Task): Optimization task. |
|
781
|
|
|
|
|
782
|
|
|
Returns: |
|
783
|
|
|
numpy.ndarray: -- |
|
784
|
|
|
""" |
|
785
|
|
|
Rf, Kw_Kgb = x_food - KH, KH_wf - KH_bf |
|
786
|
|
|
beta_f = -2 * (1 - task.Iters / task.nGEN) * (x_food_f - KH_f) / Kw_Kgb / sqrt(sum(Rf * Rf)) * Rf if x_food_f < KH_f else 0 |
|
787
|
|
|
Rib = KHo - KH |
|
788
|
|
|
beta_b = -(KHo_f - KH_f) / Kw_Kgb / sqrt(sum(Rib * Rib)) * Rib if KHo_f < KH_f else 0 |
|
789
|
|
|
return W_f * F + self.V_f * (beta_b + beta_f) |
|
790
|
|
|
|
|
791
|
|
|
def Cr(self, KH_f, KHb_f, KHw_f): |
|
792
|
|
|
r"""Calculate crossover probability. |
|
793
|
|
|
|
|
794
|
|
|
Args: |
|
795
|
|
|
KH_f (float): Krill/individuals function/fitness value. |
|
796
|
|
|
KHb_f (float): Best krill/individual function/fitness value. |
|
797
|
|
|
KHw_f (float): Worst krill/individual function/fitness value. |
|
798
|
|
|
|
|
799
|
|
|
Returns: |
|
800
|
|
|
float: Crossover probability. |
|
801
|
|
|
""" |
|
802
|
|
|
return 0.8 + 0.2 * (KH_f - KHb_f) / (KHw_f - KHb_f) |
|
803
|
|
|
|
|
804
|
|
|
def initPopulation(self, task): |
|
805
|
|
|
r"""Initialize firt herd/population. |
|
806
|
|
|
|
|
807
|
|
|
Args: |
|
808
|
|
|
task (Task): Optimization task. |
|
809
|
|
|
|
|
810
|
|
|
Returns: |
|
811
|
|
|
Tuple[numpy.ndarray, numpy.ndarray[float], Dict[str, Any]]: |
|
812
|
|
|
1. Initialized herd/population. |
|
813
|
|
|
2. Initialized herd/populations function/fitness values. |
|
814
|
|
|
3. Additional arguments: |
|
815
|
|
|
* KHo (): -- |
|
816
|
|
|
* KHo_f (): -- |
|
817
|
|
|
* N (): -- |
|
818
|
|
|
* F (): -- |
|
819
|
|
|
* Dt (): -- |
|
820
|
|
|
|
|
821
|
|
|
See Also: |
|
822
|
|
|
* :func:`NiaPy.algorithms.Algorithm.initPopulation` |
|
823
|
|
|
""" |
|
824
|
|
|
KH, KH_f, d = Algorithm.initPopulation(self, task) |
|
825
|
|
|
KHo, KHo_f = full([self.NP, task.D], task.optType.value * inf), full(self.NP, task.optType.value * inf) |
|
826
|
|
|
N, F, Dt = full(self.NP, .0), full(self.NP, .0), mean(task.bcRange()) / 2 |
|
827
|
|
|
d.update({'KHo': KHo, 'KHo_f': KHo_f, 'N': N, 'F': F, 'Dt': Dt}) |
|
828
|
|
|
return KH, KH_f, d |
|
829
|
|
|
|
|
830
|
|
|
def runIteration(self, task, KH, KH_f, xb, fxb, KHo, KHo_f, N, F, Dt, **dparams): |
|
831
|
|
|
r"""Core function of KrillHerdV11 algorithm. |
|
832
|
|
|
|
|
833
|
|
|
Args: |
|
834
|
|
|
task (Task): Optimization task. |
|
835
|
|
|
KH (numpy.ndarray): Current herd/population. |
|
836
|
|
|
KH_f (numpy.ndarray[float]): Current herd/populations function/fitness values. |
|
837
|
|
|
xb (numpy.ndarray): Global best krill. |
|
838
|
|
|
fxb (float): Global best krill function/fitness value. |
|
839
|
|
|
KHo (): |
|
840
|
|
|
KHo_f (): |
|
841
|
|
|
N (): |
|
842
|
|
|
F (): |
|
843
|
|
|
Dt (): |
|
844
|
|
|
**dparams (Dict[str, Any]): Additional arguments. |
|
845
|
|
|
|
|
846
|
|
|
Returns: |
|
847
|
|
|
Tuple[numpy.ndarray, numpy.ndarray[float], Dict[str, Any]]: |
|
848
|
|
|
1. New herd/population. |
|
849
|
|
|
2. New herd/populations function/fitness values. |
|
850
|
|
|
3. Additional arguments: |
|
851
|
|
|
|
|
852
|
|
|
""" |
|
853
|
|
|
w = full(task.D, 0.1 + 0.8 * (1 - task.Iters / task.nGEN)) |
|
854
|
|
|
ib, iw = argmin(KH_f), argmax(KH_f) |
|
855
|
|
|
x_food, x_food_f = self.getFoodLocation(KH, KH_f, task) |
|
856
|
|
|
xb, fxb = self.getBest(x_food, x_food_f, xb, fxb) |
|
857
|
|
|
N = asarray([self.Neighbors(i, KH, KH_f, iw, ib, N[i], w, task) for i in range(self.NP)]) |
|
858
|
|
|
F = asarray([self.Foraging(KH[i], KH_f[i], KHo[i], KHo_f[i], w, F[i], KH_f[iw], KH_f[ib], x_food, x_food_f, task) for i in range(self.NP)]) |
|
859
|
|
|
Cr = asarray([self.Cr(KH_f[i], KH_f[ib], KH_f[iw]) for i in range(self.NP)]) |
|
860
|
|
|
KH_n = asarray([self.crossover(KH[self.randint(self.NP)], KH[i], Cr[i]) for i in range(self.NP)]) |
|
861
|
|
|
KH_n = KH + Dt * (F + N) |
|
862
|
|
|
KH = apply_along_axis(task.repair, 1, KH_n, self.Rand) |
|
863
|
|
|
KH_f = apply_along_axis(task.eval, 1, KH) |
|
864
|
|
|
KHo, KHo_f = self.ElitistSelection(KH, KH_f, KHo, KHo_f) |
|
865
|
|
|
xb, fxb = self.getBest(KH, KH_f, xb, fxb) |
|
866
|
|
|
return KH, KH_f, xb, fxb, {'KHo': KHo, 'KHo_f': KHo_f, 'N': N, 'F': F, 'Dt': Dt} |
|
867
|
|
|
|
|
868
|
|
|
# vim: tabstop=3 noexpandtab shiftwidth=3 softtabstop=3 |
|
869
|
|
|
|