pydmoo 0.1.0__py3-none-any.whl → 0.1.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pydmoo/algorithms/base/core/genetic.py +2 -2
- pydmoo/algorithms/base/dmoo/dmoead.py +8 -5
- pydmoo/algorithms/base/dmoo/dmoeadde.py +8 -5
- pydmoo/algorithms/base/dmoo/dnsga2.py +8 -5
- pydmoo/algorithms/base/moo/moead.py +2 -1
- pydmoo/algorithms/classic/__init__.py +0 -0
- pydmoo/algorithms/classic/moead_ae.py +77 -0
- pydmoo/algorithms/classic/moead_pps.py +94 -0
- pydmoo/algorithms/classic/moeadde_ae.py +77 -0
- pydmoo/algorithms/classic/moeadde_pps.py +94 -0
- pydmoo/algorithms/classic/nsga2_ae.py +76 -0
- pydmoo/algorithms/classic/nsga2_pps.py +94 -0
- pydmoo/algorithms/modern/moead_imkt.py +2 -1
- pydmoo/algorithms/modern/moead_imkt_igp.py +2 -1
- pydmoo/algorithms/modern/moead_imkt_lstm.py +2 -1
- pydmoo/algorithms/modern/moead_imkt_n.py +2 -1
- pydmoo/algorithms/modern/moead_imkt_n_igp.py +2 -1
- pydmoo/algorithms/modern/moead_imkt_n_lstm.py +2 -1
- pydmoo/algorithms/modern/moead_ktmm.py +2 -1
- pydmoo/algorithms/modern/moeadde_imkt.py +2 -1
- pydmoo/algorithms/modern/moeadde_imkt_clstm.py +2 -1
- pydmoo/algorithms/modern/moeadde_imkt_igp.py +2 -1
- pydmoo/algorithms/modern/moeadde_imkt_lstm.py +2 -1
- pydmoo/algorithms/modern/moeadde_imkt_n.py +2 -1
- pydmoo/algorithms/modern/moeadde_imkt_n_clstm.py +2 -1
- pydmoo/algorithms/modern/moeadde_imkt_n_igp.py +2 -1
- pydmoo/algorithms/modern/moeadde_imkt_n_lstm.py +2 -1
- pydmoo/algorithms/modern/moeadde_ktmm.py +2 -1
- pydmoo/algorithms/modern/nsga2_imkt.py +2 -1
- pydmoo/algorithms/modern/nsga2_imkt_clstm.py +2 -1
- pydmoo/algorithms/modern/nsga2_imkt_igp.py +2 -1
- pydmoo/algorithms/modern/nsga2_imkt_lstm.py +2 -1
- pydmoo/algorithms/modern/nsga2_imkt_n.py +2 -1
- pydmoo/algorithms/modern/nsga2_imkt_n_clstm.py +2 -1
- pydmoo/algorithms/modern/nsga2_imkt_n_igp.py +2 -1
- pydmoo/algorithms/modern/nsga2_imkt_n_lstm.py +2 -1
- pydmoo/algorithms/modern/nsga2_ktmm.py +2 -1
- pydmoo/problems/dyn.py +110 -15
- pydmoo/problems/dynamic/cec2015.py +2 -1
- pydmoo/problems/dynamic/df.py +2 -1
- pydmoo/problems/dynamic/gts.py +641 -82
- {pydmoo-0.1.0.dist-info → pydmoo-0.1.2.dist-info}/METADATA +1 -1
- pydmoo-0.1.2.dist-info/RECORD +77 -0
- pydmoo-0.1.0.dist-info/RECORD +0 -70
- {pydmoo-0.1.0.dist-info → pydmoo-0.1.2.dist-info}/WHEEL +0 -0
- {pydmoo-0.1.0.dist-info → pydmoo-0.1.2.dist-info}/licenses/LICENSE +0 -0
pydmoo/problems/dynamic/gts.py
CHANGED
|
@@ -65,7 +65,7 @@ class GTS(DynamicTestProblem):
|
|
|
65
65
|
def __init__(self,
|
|
66
66
|
part_idx,
|
|
67
67
|
bounds,
|
|
68
|
-
|
|
68
|
+
matrix_case="one",
|
|
69
69
|
add_time_perturbation=True,
|
|
70
70
|
n_var=10,
|
|
71
71
|
nt=10,
|
|
@@ -85,22 +85,22 @@ class GTS(DynamicTestProblem):
|
|
|
85
85
|
self.sub_vec_1, self.sub_vec_2, self.sub_vec_3 = self._partition_dimension(part_idx)
|
|
86
86
|
|
|
87
87
|
# positive semidefinite matrices
|
|
88
|
-
if
|
|
89
|
-
self.
|
|
90
|
-
self.
|
|
91
|
-
elif
|
|
92
|
-
self.
|
|
93
|
-
self.
|
|
94
|
-
elif
|
|
88
|
+
if matrix_case == "one":
|
|
89
|
+
self.matrix_2 = np.eye(len(self.sub_vec_2))
|
|
90
|
+
self.matrix_3 = np.eye(len(self.sub_vec_3))
|
|
91
|
+
elif matrix_case == "two":
|
|
92
|
+
self.matrix_2 = np.diag([i + 1 for i in range(len(self.sub_vec_2))])
|
|
93
|
+
self.matrix_3 = np.diag([i + 1 for i in range(len(self.sub_vec_3))])
|
|
94
|
+
elif matrix_case == "three":
|
|
95
95
|
diag_matrix = np.diag(len(self.sub_vec_2) + np.arange(len(self.sub_vec_2)))
|
|
96
96
|
ones_matrix = np.ones((len(self.sub_vec_2), len(self.sub_vec_2)))
|
|
97
|
-
self.
|
|
97
|
+
self.matrix_2 = np.where(np.eye(len(self.sub_vec_2), dtype=bool), diag_matrix, ones_matrix)
|
|
98
98
|
|
|
99
99
|
diag_matrix = np.diag(len(self.sub_vec_3) + np.arange(len(self.sub_vec_3)))
|
|
100
100
|
ones_matrix = np.ones((len(self.sub_vec_3), len(self.sub_vec_3)))
|
|
101
|
-
self.
|
|
101
|
+
self.matrix_3 = np.where(np.eye(len(self.sub_vec_3), dtype=bool), diag_matrix, ones_matrix)
|
|
102
102
|
else:
|
|
103
|
-
raise ValueError(f"{
|
|
103
|
+
raise ValueError(f"{matrix_case} must be `one`, `two` or `three`.")
|
|
104
104
|
|
|
105
105
|
# norm
|
|
106
106
|
self.p = 1
|
|
@@ -113,10 +113,10 @@ class GTS(DynamicTestProblem):
|
|
|
113
113
|
self.xu[self.sub_vec_3] = bounds[2][1]
|
|
114
114
|
|
|
115
115
|
def _calc_pareto_front(self, *args, **kwargs):
|
|
116
|
-
return Remote.get_instance().load("pydmoo", "pf", "GTS", f"{
|
|
116
|
+
return Remote.get_instance().load("pydmoo", "pf", "GTS", f"{self.__class__.__name__}.pf")
|
|
117
117
|
|
|
118
118
|
def _calc_pareto_set(self, *args, **kwargs):
|
|
119
|
-
return Remote.get_instance().load("pydmoo", "ps", "GTS", f"{
|
|
119
|
+
return Remote.get_instance().load("pydmoo", "ps", "GTS", f"{self.__class__.__name__}.ps")
|
|
120
120
|
|
|
121
121
|
# Designed to handle time-linkage properties within the GTS test suites.
|
|
122
122
|
def cal(self, F):
|
|
@@ -138,7 +138,7 @@ class GTS1(GTS):
|
|
|
138
138
|
Attributes
|
|
139
139
|
----------
|
|
140
140
|
name : str
|
|
141
|
-
Problem name, default is '
|
|
141
|
+
Problem name, default is 'GTS1'
|
|
142
142
|
n_var : int
|
|
143
143
|
Number of decision variables
|
|
144
144
|
n_obj : int
|
|
@@ -183,11 +183,11 @@ class GTS1(GTS):
|
|
|
183
183
|
|
|
184
184
|
- Pareto set (PS)
|
|
185
185
|
|
|
186
|
-

|
|
186
|
+
{: width="400px" height="300px"}
|
|
187
187
|
|
|
188
188
|
- Pareto front (PF)
|
|
189
189
|
|
|
190
|
-

|
|
190
|
+
{: width="400px" height="300px"}
|
|
191
191
|
"""
|
|
192
192
|
def __init__(self, **kwargs):
|
|
193
193
|
super().__init__(part_idx=1, bounds=((0, 1), (-1, 1), (-1, 2)), **kwargs)
|
|
@@ -200,8 +200,8 @@ class GTS1(GTS):
|
|
|
200
200
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
201
201
|
|
|
202
202
|
# quadratic form
|
|
203
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
204
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
203
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
204
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
205
205
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
206
206
|
|
|
207
207
|
f1 = x[:, 0]
|
|
@@ -226,10 +226,61 @@ class GTS1(GTS):
|
|
|
226
226
|
|
|
227
227
|
|
|
228
228
|
class GTS2(GTS):
|
|
229
|
+
r"""GTS2 test problem.
|
|
230
|
+
|
|
231
|
+
- Inherits all parameters from parent class GTS.
|
|
232
|
+
|
|
233
|
+
Attributes
|
|
234
|
+
----------
|
|
235
|
+
name : str
|
|
236
|
+
Problem name, default is 'GTS1'
|
|
237
|
+
n_var : int
|
|
238
|
+
Number of decision variables
|
|
239
|
+
n_obj : int
|
|
240
|
+
Number of objective functions
|
|
241
|
+
time_linkage : bool
|
|
242
|
+
Whether the problem has time linkage
|
|
243
|
+
|
|
244
|
+
Notes
|
|
245
|
+
-----
|
|
246
|
+
- Mathematical Formulation:
|
|
247
|
+
|
|
248
|
+
\begin{equation}
|
|
249
|
+
\text{min}
|
|
250
|
+
\begin{cases}
|
|
251
|
+
f_1(\mathbf{x},t) = 0.5x_1+x_2 \\
|
|
252
|
+
f_2(\mathbf{x},t) = g(\mathbf{x},t)(2.8 - (\frac{0.5x_1+x_2}{g(\mathbf{x},t)})^{H(t)})
|
|
253
|
+
\end{cases}
|
|
254
|
+
\end{equation}
|
|
255
|
+
|
|
256
|
+
with
|
|
257
|
+
|
|
258
|
+
\begin{equation*}
|
|
259
|
+
\begin{split}
|
|
260
|
+
g(\mathbf{x},t) = 1
|
|
261
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,1}(t) \bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
262
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,2}(t) \bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}}
|
|
263
|
+
\end{split}
|
|
264
|
+
\end{equation*}
|
|
265
|
+
|
|
266
|
+
where $p \geq 1$, $\mathbf{x}_I = (x_1, x_2)$, $\mathbf{x}_{II,1} = (x_3, \cdots, x_{\lfloor\frac{D}{2}\rfloor + 1})$ and $\mathbf{x}_{II,2} = (x_{\lfloor\frac{D}{2}\rfloor + 2}, \cdots, x_D)$, $c = \cot(3\pi t^2), \text{when~} t^2 \neq \frac{n}{3}, n \in \mathbb{Z}, c = 1e-32, \text{otherwise}$,
|
|
267
|
+
$h_1(\mathbf{x}_I, t) = \frac{1}{\pi}\left\vert{\arctan(c)}\right\vert$ and $h_2(\mathbf{x}_I, t) = G(t) + x_1^{H(t)}$,
|
|
268
|
+
$\mathbf{R}_{II,1}(t)$ and $\mathbf{R}_{II,2}(t)$ are symmetric positive semidefinite matrices in the $t$-th environment,
|
|
269
|
+
the search space is $[0,1]^2 \times [0,1]^{\lfloor\frac{D}{2}\rfloor -1} \times [-1, 2]^{\lceil\frac{D}{2}\rceil-1}$.
|
|
270
|
+
|
|
271
|
+
- Pareto set (PS)
|
|
272
|
+
|
|
273
|
+
{: width="400px" height="300px"}
|
|
274
|
+
|
|
275
|
+
- Pareto front (PF)
|
|
276
|
+
|
|
277
|
+
{: width="400px" height="300px"}
|
|
278
|
+
"""
|
|
229
279
|
def __init__(self, **kwargs):
|
|
230
280
|
super().__init__(part_idx=2, bounds=((0, 1), (0, 1), (-1, 2)), **kwargs)
|
|
231
281
|
|
|
232
282
|
def _evaluate(self, x, out, *args, **kwargs):
|
|
283
|
+
"""Evaluate."""
|
|
233
284
|
t = 3 * np.pi * self.time ** 2
|
|
234
285
|
cot = np.cos(t) / (np.sin(t) + (np.sin(t) == 0) * 1e-32)
|
|
235
286
|
|
|
@@ -239,8 +290,8 @@ class GTS2(GTS):
|
|
|
239
290
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
240
291
|
|
|
241
292
|
# quadratic form
|
|
242
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
243
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
293
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
294
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
244
295
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
245
296
|
|
|
246
297
|
f1 = 0.5 * x[:, 0] + x[:, 1]
|
|
@@ -249,6 +300,7 @@ class GTS2(GTS):
|
|
|
249
300
|
out["F"] = np.column_stack([f1, f2])
|
|
250
301
|
|
|
251
302
|
def _calc_pareto_front(self, *args, n_pareto_points=100, **kwargs):
|
|
303
|
+
"""Pareto front."""
|
|
252
304
|
H = 20
|
|
253
305
|
x1, x2 = np.meshgrid(np.linspace(0, 1, H), np.linspace(0, 1, H), indexing='xy')
|
|
254
306
|
|
|
@@ -257,6 +309,7 @@ class GTS2(GTS):
|
|
|
257
309
|
return get_PF(np.array([f1, f2]), False)
|
|
258
310
|
|
|
259
311
|
def _calc_pareto_set(self, *args, n_pareto_points=100, **kwargs):
|
|
312
|
+
"""Pareto set."""
|
|
260
313
|
t = 3 * np.pi * self.time ** 2
|
|
261
314
|
cot = np.cos(t) / (np.sin(t) + (np.sin(t) == 0) * 1e-32)
|
|
262
315
|
|
|
@@ -268,18 +321,69 @@ class GTS2(GTS):
|
|
|
268
321
|
|
|
269
322
|
|
|
270
323
|
class GTS3(GTS):
|
|
324
|
+
r"""GTS3 test problem.
|
|
325
|
+
|
|
326
|
+
- Inherits all parameters from parent class GTS.
|
|
327
|
+
|
|
328
|
+
Attributes
|
|
329
|
+
----------
|
|
330
|
+
name : str
|
|
331
|
+
Problem name, default is 'GTS1'
|
|
332
|
+
n_var : int
|
|
333
|
+
Number of decision variables
|
|
334
|
+
n_obj : int
|
|
335
|
+
Number of objective functions
|
|
336
|
+
time_linkage : bool
|
|
337
|
+
Whether the problem has time linkage
|
|
338
|
+
|
|
339
|
+
Notes
|
|
340
|
+
-----
|
|
341
|
+
- Mathematical Formulation:
|
|
342
|
+
|
|
343
|
+
\begin{equation}
|
|
344
|
+
\text{min}
|
|
345
|
+
\begin{cases}
|
|
346
|
+
f_1(\mathbf{x},t) = g(x)(x_1 + 0.1\sin(3\pi x_1))^{\beta_t} \\
|
|
347
|
+
f_2(\mathbf{x},t) = g(\mathbf{x},t)(1 - x_1 + 0.1\sin(3\pi x_1))^{\beta_t}
|
|
348
|
+
\end{cases}
|
|
349
|
+
\end{equation}
|
|
350
|
+
|
|
351
|
+
with
|
|
352
|
+
|
|
353
|
+
\begin{equation*}
|
|
354
|
+
\begin{split}
|
|
355
|
+
g(\mathbf{x},t) = 1
|
|
356
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,1}(t) \bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
357
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,2}(t) \bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}}
|
|
358
|
+
\end{split}
|
|
359
|
+
\end{equation*}
|
|
360
|
+
|
|
361
|
+
where $p \geq 1$, $\mathbf{x}_I = (x_1)$, $\mathbf{x}_{II,1} = (x_2, \cdots, x_{\lfloor\frac{D}{2}\rfloor})$ and $\mathbf{x}_{II,2} = (x_{\lfloor\frac{D}{2}\rfloor + 1}, \cdots, x_D)$,
|
|
362
|
+
$h_1(\mathbf{x}_I, t) = \frac{G(t)\sin(4\pi x_1)}{1 + \left\vert{G(t)}\right\vert}$ and $h_2(\mathbf{x}_I, t) = G(t) + x_1^{H(t)}$,
|
|
363
|
+
$\mathbf{R}_{II,1}(t)$ and $\mathbf{R}_{II,2}(t)$ are symmetric positive semidefinite matrices in the $t$-th environment,
|
|
364
|
+
the search space is $[0,1] \times [-1,1]^{\lfloor\frac{D}{2}\rfloor - 1} \times [-1, 2]^{\lceil\frac{D}{2}\rceil}$.
|
|
365
|
+
|
|
366
|
+
- Pareto set (PS)
|
|
367
|
+
|
|
368
|
+
{: width="400px" height="300px"}
|
|
369
|
+
|
|
370
|
+
- Pareto front (PF)
|
|
371
|
+
|
|
372
|
+
{: width="400px" height="300px"}
|
|
373
|
+
"""
|
|
271
374
|
def __init__(self, **kwargs):
|
|
272
375
|
super().__init__(part_idx=1, bounds=((0, 1), (-1, 1), (-1, 2)), **kwargs)
|
|
273
376
|
|
|
274
377
|
def _evaluate(self, x, out, *args, **kwargs):
|
|
378
|
+
"""Evaluate."""
|
|
275
379
|
xi = (G_t(self.time) * np.sin(4 * np.pi * x[:, 0])) / (1 + np.abs(G_t(self.time)))
|
|
276
380
|
xj = G_t(self.time) + np.power(x[:, 0], H_t(self.time))
|
|
277
381
|
|
|
278
382
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
279
383
|
|
|
280
384
|
# quadratic form
|
|
281
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
282
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
385
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
386
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
283
387
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
284
388
|
|
|
285
389
|
f1 = g * np.power(x[:, 0] + 0.1 * np.sin(3 * np.pi * x[:, 0]), beta_t(self.time))
|
|
@@ -288,6 +392,7 @@ class GTS3(GTS):
|
|
|
288
392
|
out["F"] = np.column_stack([f1, f2])
|
|
289
393
|
|
|
290
394
|
def _calc_pareto_front(self, *args, n_pareto_points=100, **kwargs):
|
|
395
|
+
"""Pareto front."""
|
|
291
396
|
x = np.linspace(0, 1, n_pareto_points)
|
|
292
397
|
f1 = np.power(x + 0.1 * np.sin(3 * np.pi * x), beta_t(self.time))
|
|
293
398
|
f2 = np.power(1 - x + 0.1 * np.sin(3 * np.pi * x), beta_t(self.time))
|
|
@@ -295,6 +400,7 @@ class GTS3(GTS):
|
|
|
295
400
|
return get_PF(np.array([f1, f2]), True)
|
|
296
401
|
|
|
297
402
|
def _calc_pareto_set(self, *args, n_pareto_points=100, **kwargs):
|
|
403
|
+
"""Pareto set."""
|
|
298
404
|
x_vec1 = np.linspace(0, 1, n_pareto_points)
|
|
299
405
|
x_vec2 = (G_t(self.time) * np.sin(4 * np.pi * x_vec1)) / (1 + np.abs(G_t(self.time)))
|
|
300
406
|
x_vec3 = G_t(self.time) + np.power(x_vec1, H_t(self.time))
|
|
@@ -303,18 +409,70 @@ class GTS3(GTS):
|
|
|
303
409
|
|
|
304
410
|
|
|
305
411
|
class GTS4(GTS):
|
|
412
|
+
r"""GTS4 test problem.
|
|
413
|
+
|
|
414
|
+
- Inherits all parameters from parent class GTS.
|
|
415
|
+
|
|
416
|
+
Attributes
|
|
417
|
+
----------
|
|
418
|
+
name : str
|
|
419
|
+
Problem name, default is 'GTS1'
|
|
420
|
+
n_var : int
|
|
421
|
+
Number of decision variables
|
|
422
|
+
n_obj : int
|
|
423
|
+
Number of objective functions
|
|
424
|
+
time_linkage : bool
|
|
425
|
+
Whether the problem has time linkage
|
|
426
|
+
|
|
427
|
+
Notes
|
|
428
|
+
-----
|
|
429
|
+
- Mathematical Formulation:
|
|
430
|
+
|
|
431
|
+
\begin{equation}
|
|
432
|
+
\text{min}
|
|
433
|
+
\begin{cases}
|
|
434
|
+
f_1(\mathbf{x},t) = g(\mathbf{x},t)\frac{1 + t}{x_1 + 3} \\
|
|
435
|
+
f_2(\mathbf{x},t) = g(\mathbf{x},t)\frac{x_1 + 3}{1 + t}
|
|
436
|
+
\end{cases}
|
|
437
|
+
\end{equation}
|
|
438
|
+
|
|
439
|
+
with
|
|
440
|
+
|
|
441
|
+
\begin{equation*}
|
|
442
|
+
\begin{split}
|
|
443
|
+
g(\mathbf{x},t) = 1
|
|
444
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,1}(t) \bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
445
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,2}(t) \bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
446
|
+
& - 0.5 + 0.25\sin(0.3\pi t)
|
|
447
|
+
\end{split}
|
|
448
|
+
\end{equation*}
|
|
449
|
+
|
|
450
|
+
where $p \geq 1$, $\mathbf{x}_I = (x_1)$, $\mathbf{x}_{II,1} = (x_2, \cdots, x_{\lfloor\frac{D}{2}\rfloor})$ and $\mathbf{x}_{II,2} = (x_{\lfloor\frac{D}{2}\rfloor + 1}, \cdots, x_D)$,
|
|
451
|
+
$h_1(\mathbf{x}_I, t) = \left\vert{G(t)}\right\vert$ and $h_2(\mathbf{x}_I, t) = \frac{G(t)\sin(4\pi x_1)}{1 + \left\vert{G(t)}\right\vert}$,
|
|
452
|
+
$\mathbf{R}_{II,1}(t)$ and $\mathbf{R}_{II,2}(t)$ are symmetric positive semidefinite matrices in the $t$-th environment,
|
|
453
|
+
the search space is $[0,1] \times [0,1]^{\lfloor\frac{D}{2}\rfloor -1} \times [-1, 1]^{\lceil\frac{D}{2}\rceil}$.
|
|
454
|
+
|
|
455
|
+
- Pareto set (PS)
|
|
456
|
+
|
|
457
|
+
{: width="400px" height="300px"}
|
|
458
|
+
|
|
459
|
+
- Pareto front (PF)
|
|
460
|
+
|
|
461
|
+
{: width="400px" height="300px"}
|
|
462
|
+
"""
|
|
306
463
|
def __init__(self, **kwargs):
|
|
307
464
|
super().__init__(part_idx=1, bounds=((0, 1), (0, 1), (-1, 1)), **kwargs)
|
|
308
465
|
|
|
309
466
|
def _evaluate(self, x, out, *args, **kwargs):
|
|
467
|
+
"""Evaluate."""
|
|
310
468
|
xi = np.abs(G_t(self.time))
|
|
311
469
|
xj = (G_t(self.time) * np.sin(4 * np.pi * x[:, 0])) / (1 + np.abs(G_t(self.time)))
|
|
312
470
|
|
|
313
471
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
314
472
|
|
|
315
473
|
# quadratic form
|
|
316
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
317
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
474
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
475
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
318
476
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
319
477
|
|
|
320
478
|
g += (-0.5 + 0.25 * np.sin(0.3 * np.pi * self.time))
|
|
@@ -325,6 +483,7 @@ class GTS4(GTS):
|
|
|
325
483
|
out["F"] = np.column_stack([f1, f2])
|
|
326
484
|
|
|
327
485
|
def _calc_pareto_front(self, *args, n_pareto_points=100, **kwargs):
|
|
486
|
+
"""Pareto front."""
|
|
328
487
|
x = np.linspace(0, 1, n_pareto_points)
|
|
329
488
|
g = 1 + (-0.5 + 0.25 * np.sin(0.3 * np.pi * self.time))
|
|
330
489
|
|
|
@@ -334,6 +493,7 @@ class GTS4(GTS):
|
|
|
334
493
|
return np.array([f1, f2]).T
|
|
335
494
|
|
|
336
495
|
def _calc_pareto_set(self, *args, n_pareto_points=100, **kwargs):
|
|
496
|
+
"""Pareto set."""
|
|
337
497
|
x_vec1 = np.linspace(0, 1, n_pareto_points)
|
|
338
498
|
x_vec2 = np.full(len(x_vec1), np.abs(G_t(self.time)))
|
|
339
499
|
x_vec3 = (G_t(self.time) * np.sin(4 * np.pi * x_vec1)) / (1 + np.abs(G_t(self.time)))
|
|
@@ -342,18 +502,70 @@ class GTS4(GTS):
|
|
|
342
502
|
|
|
343
503
|
|
|
344
504
|
class GTS5(GTS):
|
|
505
|
+
r"""GTS5 test problem.
|
|
506
|
+
|
|
507
|
+
- Inherits all parameters from parent class GTS.
|
|
508
|
+
|
|
509
|
+
Attributes
|
|
510
|
+
----------
|
|
511
|
+
name : str
|
|
512
|
+
Problem name, default is 'GTS1'
|
|
513
|
+
n_var : int
|
|
514
|
+
Number of decision variables
|
|
515
|
+
n_obj : int
|
|
516
|
+
Number of objective functions
|
|
517
|
+
time_linkage : bool
|
|
518
|
+
Whether the problem has time linkage
|
|
519
|
+
|
|
520
|
+
Notes
|
|
521
|
+
-----
|
|
522
|
+
- Mathematical Formulation:
|
|
523
|
+
|
|
524
|
+
\begin{equation}
|
|
525
|
+
\text{min}
|
|
526
|
+
\begin{cases}
|
|
527
|
+
f_1(\mathbf{x},t) = g(\mathbf{x},t)((0.5x_1+x_2)) + 0.02\sin(\omega_t\pi (0.5x_1+x_2))) \\
|
|
528
|
+
f_2(\mathbf{x},t) = g(\mathbf{x},t)(1.6 - (0.5x_1+x_2) + 0.02\sin(\omega_t\pi (0.5x_1+x_2)))
|
|
529
|
+
\end{cases}
|
|
530
|
+
\end{equation}
|
|
531
|
+
|
|
532
|
+
with
|
|
533
|
+
|
|
534
|
+
\begin{equation*}
|
|
535
|
+
\begin{split}
|
|
536
|
+
g(\mathbf{x},t) = 1
|
|
537
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,1}(t) \bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
538
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,2}(t) \bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
539
|
+
& + 0.5 + 0.5G(t)
|
|
540
|
+
\end{split}
|
|
541
|
+
\end{equation*}
|
|
542
|
+
|
|
543
|
+
where $p \geq 1$, $\mathbf{x}_I = (x_1, x_2)$, $\mathbf{x}_{II,1} = (x_3, \cdots, x_{\lfloor\frac{D}{2}\rfloor + 1})$ and $\mathbf{x}_{II,2} = (x_{\lfloor\frac{D}{2}\rfloor + 2}, \cdots, x_D)$,
|
|
544
|
+
$h_1(\mathbf{x}_I, t) = \cos(0.5\pi t)$ and $h_2(\mathbf{x}_I, t) = G(t) + x_1^{H(t)}$,
|
|
545
|
+
$\mathbf{R}_{II,1}(t)$ and $\mathbf{R}_{II,2}(t)$ are symmetric positive semidefinite matrices in the $t$-th environment,
|
|
546
|
+
the search space is $[0,1]^2 \times [-1,1]^{\lfloor\frac{D}{2}\rfloor - 1} \times [-1, 2]^{\lceil\frac{D}{2}\rceil-1}$.
|
|
547
|
+
|
|
548
|
+
- Pareto set (PS)
|
|
549
|
+
|
|
550
|
+
{: width="400px" height="300px"}
|
|
551
|
+
|
|
552
|
+
- Pareto front (PF)
|
|
553
|
+
|
|
554
|
+
{: width="400px" height="300px"}
|
|
555
|
+
"""
|
|
345
556
|
def __init__(self, **kwargs):
|
|
346
557
|
super().__init__(part_idx=2, bounds=((0, 1), (-1, 1), (-1, 2)), **kwargs)
|
|
347
558
|
|
|
348
559
|
def _evaluate(self, x, out, *args, **kwargs):
|
|
560
|
+
"""Evaluate."""
|
|
349
561
|
xi = np.cos(0.5 * np.pi * self.time)
|
|
350
562
|
xj = G_t(self.time) + np.power(x[:, 0], H_t(self.time))
|
|
351
563
|
|
|
352
564
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
353
565
|
|
|
354
566
|
# quadratic form
|
|
355
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
356
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
567
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
568
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
357
569
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
358
570
|
|
|
359
571
|
g += 0.5 + 0.5 * G_t(self.time)
|
|
@@ -366,6 +578,7 @@ class GTS5(GTS):
|
|
|
366
578
|
out["F"] = np.column_stack([f1, f2])
|
|
367
579
|
|
|
368
580
|
def _calc_pareto_front(self, *args, n_pareto_points=100, **kwargs):
|
|
581
|
+
"""Pareto front."""
|
|
369
582
|
H = 20
|
|
370
583
|
x1, x2 = np.meshgrid(np.linspace(0, 1, H), np.linspace(0, 1, H), indexing='xy')
|
|
371
584
|
g = 1 + 0.5 + 0.5 * G_t(self.time)
|
|
@@ -378,6 +591,7 @@ class GTS5(GTS):
|
|
|
378
591
|
return get_PF(np.array([f1, f2]), True)
|
|
379
592
|
|
|
380
593
|
def _calc_pareto_set(self, *args, n_pareto_points=100, **kwargs):
|
|
594
|
+
"""Pareto set."""
|
|
381
595
|
x_vec1 = np.linspace(0, 1, n_pareto_points)
|
|
382
596
|
x_vec2 = np.full(len(x_vec1), np.cos(0.5 * np.pi * self.time))
|
|
383
597
|
x_vec3 = G_t(self.time) + np.power(x_vec1, H_t(self.time))
|
|
@@ -386,18 +600,69 @@ class GTS5(GTS):
|
|
|
386
600
|
|
|
387
601
|
|
|
388
602
|
class GTS6(GTS):
|
|
603
|
+
r"""GTS6 test problem.
|
|
604
|
+
|
|
605
|
+
- Inherits all parameters from parent class GTS.
|
|
606
|
+
|
|
607
|
+
Attributes
|
|
608
|
+
----------
|
|
609
|
+
name : str
|
|
610
|
+
Problem name, default is 'GTS1'
|
|
611
|
+
n_var : int
|
|
612
|
+
Number of decision variables
|
|
613
|
+
n_obj : int
|
|
614
|
+
Number of objective functions
|
|
615
|
+
time_linkage : bool
|
|
616
|
+
Whether the problem has time linkage
|
|
617
|
+
|
|
618
|
+
Notes
|
|
619
|
+
-----
|
|
620
|
+
- Mathematical Formulation:
|
|
621
|
+
|
|
622
|
+
\begin{equation}
|
|
623
|
+
\text{min}
|
|
624
|
+
\begin{cases}
|
|
625
|
+
f_1(\mathbf{x},t) = x_1 \\
|
|
626
|
+
f_2(\mathbf{x},t) = g(\mathbf{x},t)(1 - (\frac{x_1}{g(\mathbf{x},t)})^{H(t)})
|
|
627
|
+
\end{cases}
|
|
628
|
+
\end{equation}
|
|
629
|
+
|
|
630
|
+
with
|
|
631
|
+
|
|
632
|
+
\begin{equation*}
|
|
633
|
+
\begin{split}
|
|
634
|
+
g(\mathbf{x},t) = 1
|
|
635
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,1}(t) \bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
636
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,2}(t) \bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}}
|
|
637
|
+
\end{split}
|
|
638
|
+
\end{equation*}
|
|
639
|
+
|
|
640
|
+
where $p \geq 1$, $\mathbf{x}_I = (x_1)$, $\mathbf{x}_{II,1} = (x_2, \cdots, x_{\lfloor\frac{D}{2}\rfloor})$ and $\mathbf{x}_{II,2} = (x_{\lfloor\frac{D}{2}\rfloor + 1}, \cdots, x_D)$,
|
|
641
|
+
$h_1(\mathbf{x}_I, t) = \cos(0.5\pi t)$ and $h_2(\mathbf{x}_I, t) = G(t) + x_1^{H(t)}$,
|
|
642
|
+
$\mathbf{R}_{II,1}(t)$ and $\mathbf{R}_{II,2}(t)$ are symmetric positive semidefinite matrices in the $t$-th environment,
|
|
643
|
+
the search space is $[0,1] \times [-1,1]^{\lfloor\frac{D}{2}\rfloor -1} \times [-1, 2]^{\lceil\frac{D}{2}\rceil}$.
|
|
644
|
+
|
|
645
|
+
- Pareto set (PS)
|
|
646
|
+
|
|
647
|
+
{: width="400px" height="300px"}
|
|
648
|
+
|
|
649
|
+
- Pareto front (PF)
|
|
650
|
+
|
|
651
|
+
{: width="400px" height="300px"}
|
|
652
|
+
"""
|
|
389
653
|
def __init__(self, **kwargs):
|
|
390
654
|
super().__init__(part_idx=1, bounds=((0, 1), (-1, 1), (-1, 2)), **kwargs)
|
|
391
655
|
|
|
392
656
|
def _evaluate(self, x, out, *args, **kwargs):
|
|
657
|
+
"""Evaluate."""
|
|
393
658
|
xi = self.time_linkage * np.cos(0.5 * np.pi * self.time)
|
|
394
659
|
xj = self.time_linkage * (G_t(self.time) + np.power(x[:, 0], H_t(self.time)))
|
|
395
660
|
|
|
396
661
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
397
662
|
|
|
398
663
|
# quadratic form
|
|
399
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
400
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
664
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
665
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
401
666
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
402
667
|
|
|
403
668
|
f1 = x[:, 0]
|
|
@@ -406,11 +671,13 @@ class GTS6(GTS):
|
|
|
406
671
|
out["F"] = np.column_stack([f1, f2])
|
|
407
672
|
|
|
408
673
|
def _calc_pareto_front(self, *args, n_pareto_points=100, **kwargs):
|
|
674
|
+
"""Pareto front."""
|
|
409
675
|
f1 = np.linspace(0, 1, n_pareto_points)
|
|
410
676
|
f2 = 1 - np.power(f1, H_t(self.time))
|
|
411
677
|
return np.array([f1, f2]).T
|
|
412
678
|
|
|
413
679
|
def _calc_pareto_set(self, *args, n_pareto_points=100, **kwargs):
|
|
680
|
+
"""Pareto set."""
|
|
414
681
|
x_vec1 = np.linspace(0, 1, n_pareto_points)
|
|
415
682
|
x_vec2 = np.full(len(x_vec1), np.cos(0.5 * np.pi * self.time))
|
|
416
683
|
x_vec3 = G_t(self.time) + np.power(x_vec1, H_t(self.time))
|
|
@@ -419,18 +686,69 @@ class GTS6(GTS):
|
|
|
419
686
|
|
|
420
687
|
|
|
421
688
|
class GTS7(GTS):
|
|
689
|
+
r"""GTS7 test problem.
|
|
690
|
+
|
|
691
|
+
- Inherits all parameters from parent class GTS.
|
|
692
|
+
|
|
693
|
+
Attributes
|
|
694
|
+
----------
|
|
695
|
+
name : str
|
|
696
|
+
Problem name, default is 'GTS1'
|
|
697
|
+
n_var : int
|
|
698
|
+
Number of decision variables
|
|
699
|
+
n_obj : int
|
|
700
|
+
Number of objective functions
|
|
701
|
+
time_linkage : bool
|
|
702
|
+
Whether the problem has time linkage
|
|
703
|
+
|
|
704
|
+
Notes
|
|
705
|
+
-----
|
|
706
|
+
- Mathematical Formulation:
|
|
707
|
+
|
|
708
|
+
\begin{equation}
|
|
709
|
+
\text{min}
|
|
710
|
+
\begin{cases}
|
|
711
|
+
f_1(\mathbf{x},t) = g(\mathbf{x},t)\left\vert{x_1-a_t}\right\vert^{H(t)} \\
|
|
712
|
+
f_2(\mathbf{x},t) = g(\mathbf{x},t)\left\vert{x_1-a_t-b_t}\right\vert^{H(t)}
|
|
713
|
+
\end{cases}
|
|
714
|
+
\end{equation}
|
|
715
|
+
|
|
716
|
+
with
|
|
717
|
+
|
|
718
|
+
\begin{equation*}
|
|
719
|
+
\begin{split}
|
|
720
|
+
g(\mathbf{x},t) = 1
|
|
721
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,1}(t) \bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
722
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,2}(t) \bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}}
|
|
723
|
+
\end{split}
|
|
724
|
+
\end{equation*}
|
|
725
|
+
|
|
726
|
+
where $p \geq 1$, $\mathbf{x}_I = (x_1)$, $\mathbf{x}_{II,1} = (x_2, \cdots, x_{\lfloor\frac{D}{2}\rfloor})$ and $\mathbf{x}_{II,2} = (x_{\lfloor\frac{D}{2}\rfloor + 1}, \cdots, x_D)$,
|
|
727
|
+
$h_1(\mathbf{x}_I, t) = \cos(0.5\pi t)$ and $h_2(\mathbf{x}_I, t) = \frac{1}{1 + e^{\alpha_t(x_1 - 0.5)}}$,
|
|
728
|
+
$\mathbf{R}_{II,1}(t)$ and $\mathbf{R}_{II,2}(t)$ are symmetric positive semidefinite matrices in the $t$-th environment,
|
|
729
|
+
the search space is $[-1,2.5] \times [-1,1]^{\lfloor\frac{D}{2}\rfloor - 1} \times [0, 1]^{\lceil\frac{D}{2}\rceil}$.
|
|
730
|
+
|
|
731
|
+
- Pareto set (PS)
|
|
732
|
+
|
|
733
|
+
{: width="400px" height="300px"}
|
|
734
|
+
|
|
735
|
+
- Pareto front (PF)
|
|
736
|
+
|
|
737
|
+
{: width="400px" height="300px"}
|
|
738
|
+
"""
|
|
422
739
|
def __init__(self, **kwargs):
|
|
423
740
|
super().__init__(part_idx=1, bounds=((-1, 2.5), (-1, 1), (0, 1)), **kwargs)
|
|
424
741
|
|
|
425
742
|
def _evaluate(self, x, out, *args, **kwargs):
|
|
743
|
+
"""Evaluate."""
|
|
426
744
|
xi = self.time_linkage * np.cos(0.5 * np.pi * self.time)
|
|
427
745
|
xj = self.time_linkage * 1 / (1 + np.exp(alpha_t(self.time) * (x[:, 0] - 0.5)))
|
|
428
746
|
|
|
429
747
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
430
748
|
|
|
431
749
|
# quadratic form
|
|
432
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
433
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
750
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
751
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
434
752
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
435
753
|
|
|
436
754
|
f1 = g * np.power(np.abs(x[:, 0] - a_t(self.time)), H_t(self.time))
|
|
@@ -439,6 +757,7 @@ class GTS7(GTS):
|
|
|
439
757
|
out["F"] = np.column_stack([f1, f2])
|
|
440
758
|
|
|
441
759
|
def _calc_pareto_front(self, *args, n_pareto_points=100, **kwargs):
|
|
760
|
+
"""Pareto front."""
|
|
442
761
|
x = np.linspace(a_t(self.time), a_t(self.time) + b_t(self.time), n_pareto_points)
|
|
443
762
|
|
|
444
763
|
f1 = np.power(np.abs(x - a_t(self.time)), H_t(self.time))
|
|
@@ -447,6 +766,7 @@ class GTS7(GTS):
|
|
|
447
766
|
return np.array([f1, f2]).T
|
|
448
767
|
|
|
449
768
|
def _calc_pareto_set(self, *args, n_pareto_points=100, **kwargs):
|
|
769
|
+
"""Pareto set."""
|
|
450
770
|
x_vec1 = np.linspace(a_t(self.time), a_t(self.time) + b_t(self.time), n_pareto_points)
|
|
451
771
|
x_vec2 = np.full(len(x_vec1), np.cos(0.5 * np.pi * self.time))
|
|
452
772
|
x_vec3 = 1 / (1 + np.exp(alpha_t(self.time) * (x_vec1 - 0.5)))
|
|
@@ -455,18 +775,70 @@ class GTS7(GTS):
|
|
|
455
775
|
|
|
456
776
|
|
|
457
777
|
class GTS8(GTS):
|
|
778
|
+
r"""GTS8 test problem.
|
|
779
|
+
|
|
780
|
+
- Inherits all parameters from parent class GTS.
|
|
781
|
+
|
|
782
|
+
Attributes
|
|
783
|
+
----------
|
|
784
|
+
name : str
|
|
785
|
+
Problem name, default is 'GTS1'
|
|
786
|
+
n_var : int
|
|
787
|
+
Number of decision variables
|
|
788
|
+
n_obj : int
|
|
789
|
+
Number of objective functions
|
|
790
|
+
time_linkage : bool
|
|
791
|
+
Whether the problem has time linkage
|
|
792
|
+
|
|
793
|
+
Notes
|
|
794
|
+
-----
|
|
795
|
+
- Mathematical Formulation:
|
|
796
|
+
|
|
797
|
+
\begin{equation}
|
|
798
|
+
\text{min}
|
|
799
|
+
\begin{cases}
|
|
800
|
+
f_1(\mathbf{x},t) = (0.5x_1+x_2) \\
|
|
801
|
+
f_2(\mathbf{x},t) = g(\mathbf{x},t)(2.8 - (\frac{(0.5x_1+x_2)}{g(\mathbf{x},t)})^{H(t)}) \\
|
|
802
|
+
\end{cases}
|
|
803
|
+
\end{equation}
|
|
804
|
+
|
|
805
|
+
with
|
|
806
|
+
|
|
807
|
+
\begin{equation*}
|
|
808
|
+
\begin{split}
|
|
809
|
+
g(\mathbf{x},t) = 1
|
|
810
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,1}(t) \bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
811
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,2}(t) \bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
812
|
+
& + 0.25\left\vert{\cos(0.3 \pi t)}\right\vert
|
|
813
|
+
\end{split}
|
|
814
|
+
\end{equation*}
|
|
815
|
+
|
|
816
|
+
where $p \geq 1$, $\mathbf{x}_I = (x_1, x_2)$, $\mathbf{x}_{II,1} = (x_3, \cdots, x_{\lfloor\frac{D}{2}\rfloor + 1})$ and $\mathbf{x}_{II,2} = (x_{\lfloor\frac{D}{2}\rfloor + 2}, \cdots, x_D)$,
|
|
817
|
+
$h_1(\mathbf{x}_I, t) = \frac{1}{1 + e^{\alpha _t(x_1 - 0.5)}}$ and $h_2(\mathbf{x}_I, t) = G(t) + x_1^{H(t)}$,
|
|
818
|
+
$\mathbf{R}_{II,1}(t)$ and $\mathbf{R}_{II,2}(t)$ are symmetric positive semidefinite matrices in the $t$-th environment,
|
|
819
|
+
the search space is $[0,1]^2 \times [0,1]^{\lfloor\frac{D}{2}\rfloor -1} \times [-1, 2]^{\lceil\frac{D}{2}\rceil-1}$.
|
|
820
|
+
|
|
821
|
+
- Pareto set (PS)
|
|
822
|
+
|
|
823
|
+
{: width="400px" height="300px"}
|
|
824
|
+
|
|
825
|
+
- Pareto front (PF)
|
|
826
|
+
|
|
827
|
+
{: width="400px" height="300px"}
|
|
828
|
+
"""
|
|
458
829
|
def __init__(self, **kwargs):
|
|
459
830
|
super().__init__(part_idx=2, bounds=((0, 1), (0, 1), (-1, 2)), **kwargs)
|
|
460
831
|
|
|
461
832
|
def _evaluate(self, x, out, *args, **kwargs):
|
|
833
|
+
"""Evaluate."""
|
|
462
834
|
xi = self.time_linkage * 1 / (1 + np.exp(alpha_t(self.time) * (x[:, 0] - 0.5)))
|
|
463
835
|
xj = self.time_linkage * (G_t(self.time) + np.power(x[:, 0], H_t(self.time)))
|
|
464
836
|
|
|
465
837
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
466
838
|
|
|
467
839
|
# quadratic form
|
|
468
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
469
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
840
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
841
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
470
842
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
471
843
|
|
|
472
844
|
g += 0.25 * np.abs(np.cos(0.3 * np.pi * self.time))
|
|
@@ -477,6 +849,7 @@ class GTS8(GTS):
|
|
|
477
849
|
out["F"] = np.column_stack([f1, f2])
|
|
478
850
|
|
|
479
851
|
def _calc_pareto_front(self, *args, n_pareto_points=100, **kwargs):
|
|
852
|
+
"""Pareto front."""
|
|
480
853
|
H = 20
|
|
481
854
|
x1, x2 = np.meshgrid(np.linspace(0, 1, H), np.linspace(0, 1, H), indexing='xy')
|
|
482
855
|
|
|
@@ -486,6 +859,7 @@ class GTS8(GTS):
|
|
|
486
859
|
return get_PF(np.array([f1, f2]), False)
|
|
487
860
|
|
|
488
861
|
def _calc_pareto_set(self, *args, n_pareto_points=100, **kwargs):
|
|
862
|
+
"""Pareto set."""
|
|
489
863
|
x_vec1 = np.linspace(0, 1, n_pareto_points)
|
|
490
864
|
x_vec2 = 1 / (1 + np.exp(alpha_t(self.time) * (x_vec1 - 0.5)))
|
|
491
865
|
x_vec3 = G_t(self.time) + np.power(x_vec1, H_t(self.time))
|
|
@@ -495,19 +869,72 @@ class GTS8(GTS):
|
|
|
495
869
|
|
|
496
870
|
# modified DF12
|
|
497
871
|
class GTS9(GTS):
|
|
872
|
+
r"""GTS9 test problem.
|
|
873
|
+
|
|
874
|
+
- Inherits all parameters from parent class GTS.
|
|
875
|
+
|
|
876
|
+
Attributes
|
|
877
|
+
----------
|
|
878
|
+
name : str
|
|
879
|
+
Problem name, default is 'GTS1'
|
|
880
|
+
n_var : int
|
|
881
|
+
Number of decision variables
|
|
882
|
+
n_obj : int
|
|
883
|
+
Number of objective functions
|
|
884
|
+
time_linkage : bool
|
|
885
|
+
Whether the problem has time linkage
|
|
886
|
+
|
|
887
|
+
Notes
|
|
888
|
+
-----
|
|
889
|
+
- Mathematical Formulation:
|
|
890
|
+
|
|
891
|
+
\begin{equation}
|
|
892
|
+
\text{min}
|
|
893
|
+
\begin{cases}
|
|
894
|
+
f_1(\mathbf{x},t) = g(\mathbf{x},t)\cos(0.5\pi x_1)\cos(0.5\pi x_2) \\
|
|
895
|
+
f_2(\mathbf{x},t) = g(\mathbf{x},t)\cos(0.5\pi x_1)\sin(0.5\pi x_2) \\
|
|
896
|
+
f_3(\mathbf{x},t) = g(\mathbf{x},t)\sin(0.5\pi x_1)
|
|
897
|
+
\end{cases}
|
|
898
|
+
\end{equation}
|
|
899
|
+
|
|
900
|
+
with
|
|
901
|
+
|
|
902
|
+
\begin{equation*}
|
|
903
|
+
\begin{split}
|
|
904
|
+
g(\mathbf{x},t) = 1
|
|
905
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,1}(t) \bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
906
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,2}(t) \bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
907
|
+
& + \left\vert{\cos(0.27\pi t)}\right\vert
|
|
908
|
+
\end{split}
|
|
909
|
+
\end{equation*}
|
|
910
|
+
|
|
911
|
+
where $p \geq 1$, $\mathbf{x}_I = (x_1, x_2)$, $\mathbf{x}_{II,1} = (x_3, \cdots, x_{\lfloor\frac{D}{2}\rfloor + 1})$ and $\mathbf{x}_{II,2} = (x_{\lfloor\frac{D}{2}\rfloor + 2}, \cdots, x_D)$,
|
|
912
|
+
$h_1(\mathbf{x}_I, t) = \frac{1}{1+e^{\alpha_t(x_1 - 0.5)}}$ and $h_2(\mathbf{x}_I, t) = \sin(tx_1)$,
|
|
913
|
+
$\mathbf{R}_{II,1}(t)$ and $\mathbf{R}_{II,2}(t)$ are symmetric positive semidefinite matrices in the $t$-th environment,
|
|
914
|
+
the search space is $[0,1]^2 \times [0,1]^{\lfloor\frac{D}{2}\rfloor - 1} \times [-1, 1]^{\lceil\frac{D}{2}\rceil - 1}$.
|
|
915
|
+
|
|
916
|
+
- Pareto set (PS)
|
|
917
|
+
|
|
918
|
+
{: width="400px" height="300px"}
|
|
919
|
+
|
|
920
|
+
- Pareto front (PF)
|
|
921
|
+
|
|
922
|
+
{: width="400px" height="300px"}
|
|
923
|
+
"""
|
|
498
924
|
def __init__(self, **kwargs):
|
|
499
925
|
super().__init__(part_idx=2, bounds=((0, 1), (0, 1), (-1, 1)), **kwargs)
|
|
500
926
|
self.n_obj = 3
|
|
501
927
|
|
|
502
928
|
def _evaluate(self, x, out, *args, **kwargs):
|
|
929
|
+
"""Evaluate."""
|
|
503
930
|
xi = 1 / (1 + np.exp(alpha_t(self.time) * (x[:, 0] - 0.5)))
|
|
504
931
|
xj = np.sin(self.time * x[:, 0])
|
|
505
932
|
|
|
506
933
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
507
934
|
|
|
508
935
|
# quadratic form
|
|
509
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
510
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
936
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
937
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
511
938
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
512
939
|
|
|
513
940
|
g += np.abs(np.cos(0.27 * np.pi * self.time))
|
|
@@ -519,6 +946,7 @@ class GTS9(GTS):
|
|
|
519
946
|
out["F"] = np.column_stack([f1, f2, f3])
|
|
520
947
|
|
|
521
948
|
def _calc_pareto_front(self, *args, n_pareto_points=100, **kwargs):
|
|
949
|
+
"""Pareto front."""
|
|
522
950
|
H = 20
|
|
523
951
|
x1, x2 = np.meshgrid(np.linspace(0, 1, H), np.linspace(0, 1, H), indexing='xy')
|
|
524
952
|
|
|
@@ -532,6 +960,7 @@ class GTS9(GTS):
|
|
|
532
960
|
return get_PF(np.array([f1, f2, f3]), True)
|
|
533
961
|
|
|
534
962
|
def _calc_pareto_set(self, *args, n_pareto_points=100, **kwargs):
|
|
963
|
+
"""Pareto set."""
|
|
535
964
|
x_vec1 = np.linspace(0, 1, n_pareto_points)
|
|
536
965
|
x_vec2 = 1 / (1 + np.exp(alpha_t(self.time) * (x_vec1 - 0.5)))
|
|
537
966
|
x_vec3 = np.sin(self.time * x_vec1)
|
|
@@ -541,19 +970,71 @@ class GTS9(GTS):
|
|
|
541
970
|
|
|
542
971
|
# modified DF13
|
|
543
972
|
class GTS10(GTS):
|
|
973
|
+
r"""GTS10 test problem.
|
|
974
|
+
|
|
975
|
+
- Inherits all parameters from parent class GTS.
|
|
976
|
+
|
|
977
|
+
Attributes
|
|
978
|
+
----------
|
|
979
|
+
name : str
|
|
980
|
+
Problem name, default is 'GTS1'
|
|
981
|
+
n_var : int
|
|
982
|
+
Number of decision variables
|
|
983
|
+
n_obj : int
|
|
984
|
+
Number of objective functions
|
|
985
|
+
time_linkage : bool
|
|
986
|
+
Whether the problem has time linkage
|
|
987
|
+
|
|
988
|
+
Notes
|
|
989
|
+
-----
|
|
990
|
+
- Mathematical Formulation:
|
|
991
|
+
|
|
992
|
+
\begin{equation}
|
|
993
|
+
\text{min}
|
|
994
|
+
\begin{cases}
|
|
995
|
+
f_1(\mathbf{x},t) = g(\mathbf{x},t)\cos^2(0.5\pi x_1) \\
|
|
996
|
+
f_2(\mathbf{x},t) = g(\mathbf{x},t)\cos^2(0.5\pi x_2) \\
|
|
997
|
+
f_3(\mathbf{x},t) = g(\mathbf{x},t)\sum_{j = 1}^{2}(\sin^2(0.5\pi x_j) + \sin(0.5\pi x_j)\cos^2(\lfloor6G(t)\rfloor \pi x_j))
|
|
998
|
+
\end{cases}
|
|
999
|
+
\end{equation}
|
|
1000
|
+
|
|
1001
|
+
with
|
|
1002
|
+
|
|
1003
|
+
\begin{equation*}
|
|
1004
|
+
\begin{split}
|
|
1005
|
+
g(\mathbf{x},t) = 1
|
|
1006
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,1}(t) \bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
1007
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,2}(t) \bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}}
|
|
1008
|
+
\end{split}
|
|
1009
|
+
\end{equation*}
|
|
1010
|
+
|
|
1011
|
+
where $p \geq 1$, $\mathbf{x}_I = (x_1, x_2)$, $\mathbf{x}_{II,1} = (x_3, \cdots, x_{\lfloor\frac{D}{2}\rfloor + 1})$ and $\mathbf{x}_{II,2} = (x_{\lfloor\frac{D}{2}\rfloor + 2}, \cdots, x_D)$,
|
|
1012
|
+
$h_1(\mathbf{x}_I, t) = \left\vert{G(t)}\right\vert$ and $h_2(\mathbf{x}_I, t) = -0.5 + \frac{\left\vert{G(t)\sin(4\pi x_1)}\right\vert}{0.5(1+\left\vert{G(t)}\right\vert)}$,
|
|
1013
|
+
$\mathbf{R}_{II,1}(t)$ and $\mathbf{R}_{II,2}(t)$ are symmetric positive semidefinite matrices in the $t$-th environment,%
|
|
1014
|
+
the search space is $[0,1]^2 \times [0,1]^{\lfloor\frac{D}{2}\rfloor - 1} \times [-1, 1]^{\lceil\frac{D}{2}\rceil - 1}$.
|
|
1015
|
+
|
|
1016
|
+
- Pareto set (PS)
|
|
1017
|
+
|
|
1018
|
+
{: width="400px" height="300px"}
|
|
1019
|
+
|
|
1020
|
+
- Pareto front (PF)
|
|
1021
|
+
|
|
1022
|
+
{: width="400px" height="300px"}
|
|
1023
|
+
"""
|
|
544
1024
|
def __init__(self, **kwargs):
|
|
545
1025
|
super().__init__(part_idx=2, bounds=((0, 1), (0, 1), (-1, 1)), **kwargs)
|
|
546
1026
|
self.n_obj = 3
|
|
547
1027
|
|
|
548
1028
|
def _evaluate(self, x, out, *args, **kwargs):
|
|
1029
|
+
"""Evaluate."""
|
|
549
1030
|
xi = np.abs(G_t(self.time))
|
|
550
1031
|
xj = -0.5 + np.abs(G_t(self.time) * np.sin(4 * np.pi * x[:, 1])) / (0.5 * (1 + np.abs(G_t(self.time))))
|
|
551
1032
|
|
|
552
1033
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
553
1034
|
|
|
554
1035
|
# quadratic form
|
|
555
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
556
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
1036
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
1037
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
557
1038
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
558
1039
|
|
|
559
1040
|
f1 = g * np.cos(0.5 * np.pi * x[:, 0]) ** 2
|
|
@@ -568,6 +1049,7 @@ class GTS10(GTS):
|
|
|
568
1049
|
out["F"] = np.column_stack([f1, f2, f3])
|
|
569
1050
|
|
|
570
1051
|
def _calc_pareto_front(self, *args, n_pareto_points=100, **kwargs):
|
|
1052
|
+
"""Pareto front."""
|
|
571
1053
|
H = 20
|
|
572
1054
|
x1, x2 = np.meshgrid(np.linspace(0, 1, H), np.linspace(0, 1, H), indexing='xy')
|
|
573
1055
|
G = np.sin(0.5 * np.pi * self.time)
|
|
@@ -581,6 +1063,7 @@ class GTS10(GTS):
|
|
|
581
1063
|
return get_PF(np.array([f1, f2, f3]), True)
|
|
582
1064
|
|
|
583
1065
|
def _calc_pareto_set(self, *args, n_pareto_points=100, **kwargs):
|
|
1066
|
+
"""Pareto set."""
|
|
584
1067
|
x_vec1 = np.linspace(0, 1, n_pareto_points)
|
|
585
1068
|
x_vec2 = np.full(len(x_vec1), np.abs(G_t(self.time)))
|
|
586
1069
|
x_vec3 = -0.5 + np.abs(G_t(self.time) * np.sin(4 * np.pi * x_vec1)) / (0.5 * (1 + np.abs(G_t(self.time))))
|
|
@@ -590,19 +1073,71 @@ class GTS10(GTS):
|
|
|
590
1073
|
|
|
591
1074
|
# modified DF14
|
|
592
1075
|
class GTS11(GTS):
|
|
1076
|
+
r"""GTS11 test problem.
|
|
1077
|
+
|
|
1078
|
+
- Inherits all parameters from parent class GTS.
|
|
1079
|
+
|
|
1080
|
+
Attributes
|
|
1081
|
+
----------
|
|
1082
|
+
name : str
|
|
1083
|
+
Problem name, default is 'GTS1'
|
|
1084
|
+
n_var : int
|
|
1085
|
+
Number of decision variables
|
|
1086
|
+
n_obj : int
|
|
1087
|
+
Number of objective functions
|
|
1088
|
+
time_linkage : bool
|
|
1089
|
+
Whether the problem has time linkage
|
|
1090
|
+
|
|
1091
|
+
Notes
|
|
1092
|
+
-----
|
|
1093
|
+
- Mathematical Formulation:
|
|
1094
|
+
|
|
1095
|
+
\begin{equation}
|
|
1096
|
+
\text{min}
|
|
1097
|
+
\begin{cases}
|
|
1098
|
+
f_1(\mathbf{x},t) = g(\mathbf{x},t)(1.05 - y + 0.05\sin(6\pi y)) \\
|
|
1099
|
+
f_2(\mathbf{x},t) = g(\mathbf{x},t)(1.05 - x_2 + 0.05\sin(6\pi x_2))(y + 0.05\sin(6\pi y)) \\
|
|
1100
|
+
f_3(\mathbf{x},t) = g(\mathbf{x},t)(x_2 + 0.05\sin(6\pi x_2))(y + 0.05\sin(6\pi y))
|
|
1101
|
+
\end{cases}
|
|
1102
|
+
\end{equation}
|
|
1103
|
+
|
|
1104
|
+
with
|
|
1105
|
+
|
|
1106
|
+
\begin{equation*}
|
|
1107
|
+
\begin{split}
|
|
1108
|
+
g(\mathbf{x},t) = 1
|
|
1109
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,1}(t) \bigl(\mathbf{x}_{II,1} - h_1(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}} \\
|
|
1110
|
+
& + \Bigl(\bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)^T \mathbf{R}_{II,2}(t) \bigl(\mathbf{x}_{II,2} - h_2(\mathbf{x}_I)\bigr)\Bigr)^{\frac{1}{p}}
|
|
1111
|
+
\end{split}
|
|
1112
|
+
\end{equation*}
|
|
1113
|
+
|
|
1114
|
+
where $p \geq 1$, $\mathbf{x}_I = (x_1, x_2)$, $\mathbf{x}_{II,1} = (x_3, \cdots, x_{\lfloor\frac{D}{2}\rfloor + 1})$ and $\mathbf{x}_{II,2} = (x_{\lfloor\frac{D}{2}\rfloor + 2}, \cdots, x_D)$,
|
|
1115
|
+
$h_1(\mathbf{x}_I, t) = \left\vert{G(t)}\right\vert$ and $h_2(\mathbf{x}_I, t) = G(t) + x_1^{H(t)}$,
|
|
1116
|
+
$\mathbf{R}_{II,1}(t)$ and $\mathbf{R}_{II,2}(t)$ are symmetric positive semidefinite matrices in the $t$-th environment,
|
|
1117
|
+
the search space is $[0,1]^2 \times [0,1]^{\lfloor\frac{D}{2}\rfloor - 1} \times [-1, 2]^{\lceil\frac{D}{2}\rceil - 1}$.
|
|
1118
|
+
|
|
1119
|
+
- Pareto set (PS)
|
|
1120
|
+
|
|
1121
|
+
{: width="400px" height="300px"}
|
|
1122
|
+
|
|
1123
|
+
- Pareto front (PF)
|
|
1124
|
+
|
|
1125
|
+
{: width="400px" height="300px"}
|
|
1126
|
+
"""
|
|
593
1127
|
def __init__(self, **kwargs):
|
|
594
1128
|
super().__init__(part_idx=2, bounds=((0, 1), (0, 1), (-1, 2)), **kwargs)
|
|
595
1129
|
self.n_obj = 3
|
|
596
1130
|
|
|
597
1131
|
def _evaluate(self, x, out, *args, **kwargs):
|
|
1132
|
+
"""Evaluate."""
|
|
598
1133
|
xi = np.abs(G_t(self.time))
|
|
599
1134
|
xj = G_t(self.time) + np.power(x[:, 0], H_t(self.time))
|
|
600
1135
|
|
|
601
1136
|
x2, x3 = (x[:, self.sub_vec_2] - xi.reshape(-1, 1)), (x[:, self.sub_vec_3] - xj.reshape(-1, 1))
|
|
602
1137
|
|
|
603
1138
|
# quadratic form
|
|
604
|
-
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.
|
|
605
|
-
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.
|
|
1139
|
+
diag_x2_R2_x2T = np.einsum('ij,jk,ik->i', x2, self.matrix_2, x2)
|
|
1140
|
+
diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.matrix_3, x3)
|
|
606
1141
|
g = 1 + np.power(diag_x2_R2_x2T, self.p) + np.power(diag_x3_R3_x3T, self.p)
|
|
607
1142
|
|
|
608
1143
|
y = y_t(x[:, 0], self.time)
|
|
@@ -613,6 +1148,7 @@ class GTS11(GTS):
|
|
|
613
1148
|
out["F"] = np.column_stack([f1, f2, f3])
|
|
614
1149
|
|
|
615
1150
|
def _calc_pareto_front(self, *args, n_pareto_points=100, **kwargs):
|
|
1151
|
+
"""Pareto front."""
|
|
616
1152
|
H = 20
|
|
617
1153
|
x1, x2 = np.meshgrid(np.linspace(0, 1, H), np.linspace(0, 1, H), indexing='xy')
|
|
618
1154
|
|
|
@@ -624,6 +1160,7 @@ class GTS11(GTS):
|
|
|
624
1160
|
return get_PF(np.array([f1, f2, f3]), False)
|
|
625
1161
|
|
|
626
1162
|
def _calc_pareto_set(self, *args, n_pareto_points=100, **kwargs):
|
|
1163
|
+
"""Pareto set."""
|
|
627
1164
|
x_vec1 = np.linspace(0, 1, n_pareto_points)
|
|
628
1165
|
x_vec2 = np.full(len(x_vec1), np.abs(G_t(self.time)))
|
|
629
1166
|
x_vec3 = G_t(self.time) + np.power(x_vec1, H_t(self.time))
|
|
@@ -632,110 +1169,132 @@ class GTS11(GTS):
|
|
|
632
1169
|
|
|
633
1170
|
|
|
634
1171
|
class GTS1_2(GTS1):
|
|
635
|
-
|
|
636
|
-
|
|
1172
|
+
"""GTS1_2 test problem."""
|
|
1173
|
+
def __init__(self, matrix_case="two", **kwargs):
|
|
1174
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
637
1175
|
|
|
638
1176
|
|
|
639
1177
|
class GTS2_2(GTS1):
|
|
640
|
-
|
|
641
|
-
|
|
1178
|
+
"""GTS2_2 test problem."""
|
|
1179
|
+
def __init__(self, matrix_case="two", **kwargs):
|
|
1180
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
642
1181
|
|
|
643
1182
|
|
|
644
1183
|
class GTS3_2(GTS1):
|
|
645
|
-
|
|
646
|
-
|
|
1184
|
+
"""GTS3_2 test problem."""
|
|
1185
|
+
def __init__(self, matrix_case="two", **kwargs):
|
|
1186
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
647
1187
|
|
|
648
1188
|
|
|
649
1189
|
class GTS4_2(GTS1):
|
|
650
|
-
|
|
651
|
-
|
|
1190
|
+
"""GTS4_2 test problem."""
|
|
1191
|
+
def __init__(self, matrix_case="two", **kwargs):
|
|
1192
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
652
1193
|
|
|
653
1194
|
|
|
654
1195
|
class GTS5_2(GTS1):
|
|
655
|
-
|
|
656
|
-
|
|
1196
|
+
"""GTS5_2 test problem."""
|
|
1197
|
+
def __init__(self, matrix_case="two", **kwargs):
|
|
1198
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
657
1199
|
|
|
658
1200
|
|
|
659
1201
|
class GTS6_2(GTS1):
|
|
660
|
-
|
|
661
|
-
|
|
1202
|
+
"""GTS6_2 test problem."""
|
|
1203
|
+
def __init__(self, matrix_case="two", **kwargs):
|
|
1204
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
662
1205
|
|
|
663
1206
|
|
|
664
1207
|
class GTS7_2(GTS1):
|
|
665
|
-
|
|
666
|
-
|
|
1208
|
+
"""GTS7_2 test problem."""
|
|
1209
|
+
def __init__(self, matrix_case="two", **kwargs):
|
|
1210
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
667
1211
|
|
|
668
1212
|
|
|
669
1213
|
class GTS8_2(GTS1):
|
|
670
|
-
|
|
671
|
-
|
|
1214
|
+
"""GTS8_2 test problem."""
|
|
1215
|
+
def __init__(self, matrix_case="two", **kwargs):
|
|
1216
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
672
1217
|
|
|
673
1218
|
|
|
674
1219
|
class GTS9_2(GTS1):
|
|
675
|
-
|
|
676
|
-
|
|
1220
|
+
"""GTS9_2 test problem."""
|
|
1221
|
+
def __init__(self, matix_case="two", **kwargs):
|
|
1222
|
+
super().__init__(matrix_case=matix_case, **kwargs)
|
|
677
1223
|
|
|
678
1224
|
|
|
679
1225
|
class GTS10_2(GTS1):
|
|
680
|
-
|
|
681
|
-
|
|
1226
|
+
"""GTS10_2 test problem."""
|
|
1227
|
+
def __init__(self, matrix_case="two", **kwargs):
|
|
1228
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
682
1229
|
|
|
683
1230
|
|
|
684
1231
|
class GTS11_2(GTS1):
|
|
685
|
-
|
|
686
|
-
|
|
1232
|
+
"""GTS11_2 test problem."""
|
|
1233
|
+
def __init__(self, matrix_case="two", **kwargs):
|
|
1234
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
687
1235
|
|
|
688
1236
|
|
|
689
1237
|
class GTS1_3(GTS1):
|
|
690
|
-
|
|
691
|
-
|
|
1238
|
+
"""GTS1_3 test problem."""
|
|
1239
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1240
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
692
1241
|
|
|
693
1242
|
|
|
694
1243
|
class GTS2_3(GTS1):
|
|
695
|
-
|
|
696
|
-
|
|
1244
|
+
"""GTS2_3 test problem."""
|
|
1245
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1246
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
697
1247
|
|
|
698
1248
|
|
|
699
1249
|
class GTS3_3(GTS1):
|
|
700
|
-
|
|
701
|
-
|
|
1250
|
+
"""GTS3_3 test problem."""
|
|
1251
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1252
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
702
1253
|
|
|
703
1254
|
|
|
704
1255
|
class GTS4_3(GTS1):
|
|
705
|
-
|
|
706
|
-
|
|
1256
|
+
"""GTS4_3 test problem."""
|
|
1257
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1258
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
707
1259
|
|
|
708
1260
|
|
|
709
1261
|
class GTS5_3(GTS1):
|
|
710
|
-
|
|
711
|
-
|
|
1262
|
+
"""GTS5_3 test problem."""
|
|
1263
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1264
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
712
1265
|
|
|
713
1266
|
|
|
714
1267
|
class GTS6_3(GTS1):
|
|
715
|
-
|
|
716
|
-
|
|
1268
|
+
"""GTS6_3 test problem."""
|
|
1269
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1270
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
717
1271
|
|
|
718
1272
|
|
|
719
1273
|
class GTS7_3(GTS1):
|
|
720
|
-
|
|
721
|
-
|
|
1274
|
+
"""GTS7_3 test problem."""
|
|
1275
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1276
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
722
1277
|
|
|
723
1278
|
|
|
724
1279
|
class GTS8_3(GTS1):
|
|
725
|
-
|
|
726
|
-
|
|
1280
|
+
"""GTS8_3 test problem."""
|
|
1281
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1282
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
727
1283
|
|
|
728
1284
|
|
|
729
1285
|
class GTS9_3(GTS1):
|
|
730
|
-
|
|
731
|
-
|
|
1286
|
+
"""GTS9_3 test problem."""
|
|
1287
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1288
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
732
1289
|
|
|
733
1290
|
|
|
734
1291
|
class GTS10_3(GTS1):
|
|
735
|
-
|
|
736
|
-
|
|
1292
|
+
"""GTS10_3 test problem."""
|
|
1293
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1294
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|
|
737
1295
|
|
|
738
1296
|
|
|
739
1297
|
class GTS11_3(GTS1):
|
|
740
|
-
|
|
741
|
-
|
|
1298
|
+
"""GTS11_3 test problem."""
|
|
1299
|
+
def __init__(self, matrix_case="three", **kwargs):
|
|
1300
|
+
super().__init__(matrix_case=matrix_case, **kwargs)
|