Skip to content

Commit 9a91197

Browse files
committed
reconstruct cec2022, fix and add funcs of basic.py
1 parent 3a87871 commit 9a91197

File tree

3 files changed

+76
-55
lines changed

3 files changed

+76
-55
lines changed

src/evox/problems/numerical/basic.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,17 @@
77
"Schwefel",
88
"Sphere",
99
"Ellipsoid",
10+
"Zakharov",
11+
"Levy",
1012
"ackley_func",
1113
"griewank_func",
1214
"rastrigin_func",
1315
"rosenbrock_func",
1416
"schwefel_func",
1517
"sphere_func",
1618
"ellipsoid_func",
19+
"zakharov_func",
20+
"levy_func",
1721
]
1822

1923

@@ -86,7 +90,7 @@ def _true_evaluate(self, x: torch.Tensor) -> torch.Tensor:
8690

8791

8892
def griewank_func(x: torch.Tensor) -> torch.Tensor:
89-
f = 1 / 4000 * torch.sum(x**2, dim=1) - torch.prod(torch.cos(x / torch.sqrt(torch.arange(1, x.size(1) + 1)))) + 1
93+
f = 1 / 4000 * torch.sum(x**2, dim=1) - torch.prod(torch.cos(x / torch.sqrt(torch.arange(1, x.size(1) + 1, device=x.device))), dim=1) + 1
9094
return f
9195

9296

@@ -193,3 +197,45 @@ def _true_evaluate(self, x: torch.Tensor) -> torch.Tensor:
193197

194198
def ellipsoid_func(x: torch.Tensor):
195199
return torch.sum(torch.arange(1, x.size(1) + 1, device=x.device) * x**2, dim=1)
200+
201+
202+
def zakharov_func(x: torch.Tensor) -> torch.Tensor:
203+
d = x.size(-1)
204+
i = torch.arange(1, d + 1, dtype=x.dtype, device=x.device)
205+
sum1 = torch.sum(x ** 2, dim=-1)
206+
sum2 = torch.sum(0.5 * i * x, dim=-1)
207+
return sum1 + sum2 ** 2 + sum2 ** 4
208+
209+
210+
class Zakharov(ShiftAffineNumericalProblem):
211+
"""The Zakharov function whose minimum is x = [0, ..., 0]"""
212+
213+
def __init__(self, **kwargs):
214+
"""Initialize the Zakharov function with the given parameters.
215+
216+
:param **kwargs: The keyword arguments (`shift` and `affine`) to pass to the superclass `ShiftAffineNumericalProblem`.
217+
"""
218+
super().__init__(**kwargs)
219+
220+
def _true_evaluate(self, x: torch.Tensor) -> torch.Tensor:
221+
return zakharov_func(x)
222+
223+
def levy_func(x: torch.Tensor) -> torch.Tensor:
224+
w = 1 + (x - 1) / 4
225+
term1 = torch.sin(torch.pi * w[:, 0]) ** 2
226+
term2 = torch.sum((w[:, :-1] - 1) ** 2 * (1 + 10 * torch.sin(torch.pi * w[:, :-1] + 1) ** 2), dim=1)
227+
term3 = (w[:, -1] - 1) ** 2 * (1 + torch.sin(2 * torch.pi * w[:, -1]) ** 2)
228+
return term1 + term2 + term3
229+
230+
class Levy(ShiftAffineNumericalProblem):
231+
"""The Levy function whose minimum is x = [1, ..., 1]"""
232+
233+
def __init__(self, **kwargs):
234+
"""Initialize the Levy function with the given parameters.
235+
236+
:param **kwargs: The keyword arguments (`shift` and `affine`) to pass to the superclass `ShiftAffineNumericalProblem`.
237+
"""
238+
super().__init__(**kwargs)
239+
240+
def _true_evaluate(self, x: torch.Tensor) -> torch.Tensor:
241+
return levy_func(x)

src/evox/problems/numerical/cec2022.py

Lines changed: 28 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
import torch
1111

1212
from evox.core import Problem
13+
from evox.problems.numerical.basic import (
14+
ackley_func,
15+
griewank_func,
16+
rastrigin_func,
17+
rosenbrock_func,
18+
zakharov_func,
19+
)
1320

1421

1522
class CEC2022(Problem):
@@ -141,19 +148,19 @@ def cf_cal(self, x: torch.Tensor, fit: List[torch.Tensor], delta: List[int], bia
141148
# Problem
142149
def cec2022_f1(self, x: torch.Tensor) -> torch.Tensor:
143150
"""Zakharov Function"""
144-
return self.zakharov_func(self.sr_func_rate(x, 1.0, True, True, self.OShift, self.M)) + 300.0
151+
return zakharov_func(self.sr_func_rate(x, 1.0, True, True, self.OShift, self.M)) + 300.0
145152

146153
def cec2022_f2(self, x: torch.Tensor) -> torch.Tensor:
147154
"""Rosenbrock Function"""
148-
return self.rosenbrock_func(self.sr_func_rate(x, 2.048e-2, True, True, self.OShift, self.M)) + 400
155+
return rosenbrock_func(1 + self.sr_func_rate(x, 2.048e-2, True, True, self.OShift, self.M)) + 400
149156

150157
def cec2022_f3(self, x: torch.Tensor) -> torch.Tensor:
151158
"""Schaffer F7 Function"""
152159
return self.schaffer_F7_func(self.sr_func_rate(x, 1.0, True, True, self.OShift, self.M)) + 600.0
153160

154161
def cec2022_f4(self, x: torch.Tensor) -> torch.Tensor:
155162
"""Step Rastrigin Function (Noncontinuous Rastrigin's)"""
156-
return self.step_rastrigin_func(self.sr_func_rate(x, 5.12e-2, True, True, self.OShift, self.M)) + 800.0
163+
return rastrigin_func(self.sr_func_rate(x, 5.12e-2, True, True, self.OShift, self.M)) + 800.0
157164

158165
def cec2022_f5(self, x: torch.Tensor) -> torch.Tensor:
159166
"""Levy Function"""
@@ -167,7 +174,7 @@ def cec2022_f6(self, x: torch.Tensor) -> torch.Tensor:
167174

168175
fit0 = self.bent_cigar_func(self.sr_func_rate(y[0], 1.0, False, False, self.OShift, self.M))
169176
fit1 = self.hgbat_func(self.sr_func_rate(y[1], 5.00e-2, False, False, self.OShift, self.M))
170-
fit2 = self.rastrigin_func(self.sr_func_rate(y[2], 5.12e-2, False, False, self.OShift, self.M))
177+
fit2 = rastrigin_func(self.sr_func_rate(y[2], 5.12e-2, False, False, self.OShift, self.M))
171178

172179
return fit0 + fit1 + fit2 + 1800.0
173180

@@ -179,9 +186,9 @@ def cec2022_f7(self, x: torch.Tensor) -> torch.Tensor:
179186

180187
fit0 = self.hgbat_func(self.sr_func_rate(y[0], 5.00e-2, False, False, self.OShift, self.M))
181188
fit1 = self.katsuura_func(self.sr_func_rate(y[1], 5.00e-2, False, False, self.OShift, self.M))
182-
fit2 = self.ackley_func(self.sr_func_rate(y[2], 1.0, False, False, self.OShift, self.M))
183-
fit3 = self.rastrigin_func(self.sr_func_rate(y[3], 5.12e-2, False, False, self.OShift, self.M))
184-
fit4 = self.schwefel_func(self.sr_func_rate(y[4], 10.0, False, False, self.OShift, self.M))
189+
fit2 = ackley_func(20.0, 0.2, 2 * torch.pi, self.sr_func_rate(y[2], 1.0, False, False, self.OShift, self.M))
190+
fit3 = rastrigin_func(self.sr_func_rate(y[3], 5.12e-2, False, False, self.OShift, self.M))
191+
fit4 = self.modified_schwefel_func(self.sr_func_rate(y[4], 10.0, False, False, self.OShift, self.M))
185192
fit5 = self.schaffer_F7_func(self.sr_func_rate(y[5], 1.0, False, False, self.OShift, self.M))
186193

187194
return fit0 + fit1 + fit2 + fit3 + fit4 + fit5 + 2000.0
@@ -195,8 +202,8 @@ def cec2022_f8(self, x: torch.Tensor) -> torch.Tensor:
195202
fit0 = self.katsuura_func(self.sr_func_rate(y[0], 5.00e-2, False, False, self.OShift, self.M))
196203
fit1 = self.happycat_func(self.sr_func_rate(y[1], 5.00e-2, False, False, self.OShift, self.M))
197204
fit2 = self.grie_rosen_func(self.sr_func_rate(y[2], 5.00e-2, False, False, self.OShift, self.M))
198-
fit3 = self.schwefel_func(self.sr_func_rate(y[3], 10.0, False, False, self.OShift, self.M))
199-
fit4 = self.ackley_func(self.sr_func_rate(y[4], 1.0, False, False, self.OShift, self.M))
205+
fit3 = self.modified_schwefel_func(self.sr_func_rate(y[3], 10.0, False, False, self.OShift, self.M))
206+
fit4 = ackley_func(20.0, 0.2, 2 * torch.pi, self.sr_func_rate(y[4], 1.0, False, False, self.OShift, self.M))
200207

201208
return fit0 + fit1 + fit2 + fit3 + fit4 + 2200.0
202209

@@ -206,8 +213,8 @@ def cec2022_f9(self, x: torch.Tensor) -> torch.Tensor:
206213
delta = [10, 20, 30, 40, 50]
207214
bias = [0, 200, 300, 100, 400]
208215
fit = [
209-
self.rosenbrock_func(
210-
self.sr_func_rate(x, 2.048e-2, True, True, self.OShift[:, 0 * nx : 1 * nx], self.M[:, 0 * nx : 1 * nx])
216+
rosenbrock_func(
217+
1 + self.sr_func_rate(x, 2.048e-2, True, True, self.OShift[:, 0 * nx : 1 * nx], self.M[:, 0 * nx : 1 * nx])
211218
)
212219
* 10000
213220
/ 1e4,
@@ -240,11 +247,11 @@ def cec2022_f10(self, x: torch.Tensor) -> torch.Tensor:
240247
delta = [20, 10, 10]
241248
bias = [0, 200, 100]
242249
fit = [
243-
self.schwefel_func(
250+
self.modified_schwefel_func(
244251
self.sr_func_rate(x, 10.0, True, False, self.OShift[:, 0 * nx : 1 * nx], self.M[:, 0 * nx : 1 * nx])
245252
)
246253
* 1.0,
247-
self.rastrigin_func(
254+
rastrigin_func(
248255
self.sr_func_rate(x, 5.12e-2, True, True, self.OShift[:, 1 * nx : 2 * nx], self.M[:, 1 * nx : 2 * nx])
249256
)
250257
* 1.0,
@@ -267,20 +274,18 @@ def cec2022_f11(self, x: torch.Tensor) -> torch.Tensor:
267274
)
268275
* 10000
269276
/ 2e7,
270-
self.schwefel_func(
277+
self.modified_schwefel_func(
271278
self.sr_func_rate(x, 10.0, True, True, self.OShift[:, 1 * nx : 2 * nx], self.M[:, 1 * nx : 2 * nx])
272279
)
273280
* 1.0,
274-
self.griewank_func(
275-
self.sr_func_rate(x, 6.0, True, True, self.OShift[:, 2 * nx : 3 * nx], self.M[:, 2 * nx : 3 * nx])
276-
)
281+
griewank_func(self.sr_func_rate(x, 6.0, True, True, self.OShift[:, 2 * nx : 3 * nx], self.M[:, 2 * nx : 3 * nx]))
277282
* 1000
278283
/ 100,
279-
self.rosenbrock_func(
280-
self.sr_func_rate(x, 2.048e-2, True, True, self.OShift[:, 3 * nx : 4 * nx], self.M[:, 3 * nx : 4 * nx])
284+
rosenbrock_func(
285+
1 + self.sr_func_rate(x, 2.048e-2, True, True, self.OShift[:, 3 * nx : 4 * nx], self.M[:, 3 * nx : 4 * nx])
281286
)
282287
* 1.0,
283-
self.rastrigin_func(
288+
rastrigin_func(
284289
self.sr_func_rate(x, 5.12e-2, True, True, self.OShift[:, 4 * nx : 5 * nx], self.M[:, 4 * nx : 5 * nx])
285290
)
286291
* 10000
@@ -300,12 +305,12 @@ def cec2022_f12(self, x: torch.Tensor) -> torch.Tensor:
300305
)
301306
* 10000
302307
/ 1000,
303-
self.rastrigin_func(
308+
rastrigin_func(
304309
self.sr_func_rate(x, 5.12e-2, True, True, self.OShift[:, 1 * nx : 2 * nx], self.M[:, 1 * nx : 2 * nx])
305310
)
306311
* 10000
307312
/ 1e3,
308-
self.schwefel_func(
313+
self.modified_schwefel_func(
309314
self.sr_func_rate(x, 10.0, True, True, self.OShift[:, 2 * nx : 3 * nx], self.M[:, 2 * nx : 3 * nx])
310315
)
311316
* 10000
@@ -331,17 +336,6 @@ def cec2022_f12(self, x: torch.Tensor) -> torch.Tensor:
331336
return f + 2700.0
332337

333338
# Basic functions
334-
def zakharov_func(self, x: torch.Tensor) -> torch.Tensor:
335-
"""Problem number = 1."""
336-
sum1 = x**2
337-
idx = torch.arange(1, x.size(1) + 1, device=x.device)
338-
sum2 = torch.sum((0.5 * idx) * x, dim=1)
339-
return torch.sum(sum1, dim=1) + sum2**2 + sum2**4
340-
341-
def step_rastrigin_func(self, x: torch.Tensor) -> torch.Tensor:
342-
"""Problem number = 4."""
343-
return torch.sum(x**2 - 10.0 * torch.cos(2.0 * torch.pi * x) + 10.0, dim=1)
344-
345339
def levy_func(self, x: torch.Tensor) -> torch.Tensor:
346340
"""Problem number = 5."""
347341
w = 1.0 + x / 4.0
@@ -360,9 +354,6 @@ def hgbat_func(self, x: torch.Tensor) -> torch.Tensor:
360354
sum_x = torch.sum(tmp, dim=1)
361355
return torch.abs(r2**2 - sum_x**2) ** (2 * alpha) + (0.5 * r2 + sum_x) / x.size(1) + 0.5
362356

363-
def rastrigin_func(self, x: torch.Tensor) -> torch.Tensor:
364-
return torch.sum(x**2 - 10.0 * torch.cos(2.0 * torch.pi * x) + 10.0, dim=1)
365-
366357
def katsuura_func(self, x: torch.Tensor) -> torch.Tensor:
367358
nx = x.size(1)
368359
tmp1 = 2.0 ** torch.arange(1, 33, device=x.device)
@@ -372,12 +363,7 @@ def katsuura_func(self, x: torch.Tensor) -> torch.Tensor:
372363
f = torch.prod((1 + temp * tmp3.unsqueeze(0)) ** (10.0 / (nx**1.2)), dim=1)
373364
return (f - 1) * (10.0 / nx / nx)
374365

375-
def ackley_func(self, x: torch.Tensor) -> torch.Tensor:
376-
mean1 = torch.mean(x**2, dim=1)
377-
mean2 = torch.mean(torch.cos(2.0 * torch.pi * x), dim=1)
378-
return torch.e - 20.0 * torch.exp(-0.2 * torch.sqrt(mean1)) - torch.exp(mean2) + 20.0
379-
380-
def schwefel_func(self, x: torch.Tensor) -> torch.Tensor:
366+
def modified_schwefel_func(self, x: torch.Tensor) -> torch.Tensor:
381367
nx = x.size(1)
382368
tmp1 = x + 420.9687462275036
383369
tmp2 = -tmp1 * tmp1.abs().sqrt().sin()
@@ -413,16 +399,6 @@ def grie_rosen_func(self, x: torch.Tensor) -> torch.Tensor:
413399
tmp = 100.0 * (x**2 - y) ** 2 + (x - 1.0) ** 2
414400
return torch.sum((tmp**2) / 4000.0 - torch.cos(tmp) + 1.0, dim=1)
415401

416-
def griewank_func(self, x: torch.Tensor) -> torch.Tensor:
417-
sum_sq = torch.sum(x**2, dim=1)
418-
idx = torch.arange(1, x.size(1) + 1, device=x.device)
419-
prod_cos = torch.prod(torch.cos(x / torch.sqrt(idx)), dim=1)
420-
return 1.0 + sum_sq / 4000.0 - prod_cos
421-
422-
def rosenbrock_func(self, x: torch.Tensor) -> torch.Tensor:
423-
tmp = x + 1
424-
return torch.sum(100.0 * (tmp[:, :-1] ** 2 - tmp[:, 1:]) ** 2 + (tmp[:, :-1] - 1.0) ** 2, dim=1)
425-
426402
def discus_func(self, x: torch.Tensor) -> torch.Tensor:
427403
return (10.0**6) * x[:, 0] ** 2 + torch.sum(x[:, 1:] ** 2, dim=1)
428404

unit_test/problems/test_cec2022.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import unittest
22

33
import torch
4+
from CEC2022_by_P_N_Suganthan import cec2022_func
45

56
from evox.problems.numerical import CEC2022
67

7-
from .CEC2022_by_P_N_Suganthan import cec2022_func
8-
98

109
class TestCEC2022(unittest.TestCase):
1110
def setUp(self):

0 commit comments

Comments
 (0)