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.
Files changed (46) hide show
  1. pydmoo/algorithms/base/core/genetic.py +2 -2
  2. pydmoo/algorithms/base/dmoo/dmoead.py +8 -5
  3. pydmoo/algorithms/base/dmoo/dmoeadde.py +8 -5
  4. pydmoo/algorithms/base/dmoo/dnsga2.py +8 -5
  5. pydmoo/algorithms/base/moo/moead.py +2 -1
  6. pydmoo/algorithms/classic/__init__.py +0 -0
  7. pydmoo/algorithms/classic/moead_ae.py +77 -0
  8. pydmoo/algorithms/classic/moead_pps.py +94 -0
  9. pydmoo/algorithms/classic/moeadde_ae.py +77 -0
  10. pydmoo/algorithms/classic/moeadde_pps.py +94 -0
  11. pydmoo/algorithms/classic/nsga2_ae.py +76 -0
  12. pydmoo/algorithms/classic/nsga2_pps.py +94 -0
  13. pydmoo/algorithms/modern/moead_imkt.py +2 -1
  14. pydmoo/algorithms/modern/moead_imkt_igp.py +2 -1
  15. pydmoo/algorithms/modern/moead_imkt_lstm.py +2 -1
  16. pydmoo/algorithms/modern/moead_imkt_n.py +2 -1
  17. pydmoo/algorithms/modern/moead_imkt_n_igp.py +2 -1
  18. pydmoo/algorithms/modern/moead_imkt_n_lstm.py +2 -1
  19. pydmoo/algorithms/modern/moead_ktmm.py +2 -1
  20. pydmoo/algorithms/modern/moeadde_imkt.py +2 -1
  21. pydmoo/algorithms/modern/moeadde_imkt_clstm.py +2 -1
  22. pydmoo/algorithms/modern/moeadde_imkt_igp.py +2 -1
  23. pydmoo/algorithms/modern/moeadde_imkt_lstm.py +2 -1
  24. pydmoo/algorithms/modern/moeadde_imkt_n.py +2 -1
  25. pydmoo/algorithms/modern/moeadde_imkt_n_clstm.py +2 -1
  26. pydmoo/algorithms/modern/moeadde_imkt_n_igp.py +2 -1
  27. pydmoo/algorithms/modern/moeadde_imkt_n_lstm.py +2 -1
  28. pydmoo/algorithms/modern/moeadde_ktmm.py +2 -1
  29. pydmoo/algorithms/modern/nsga2_imkt.py +2 -1
  30. pydmoo/algorithms/modern/nsga2_imkt_clstm.py +2 -1
  31. pydmoo/algorithms/modern/nsga2_imkt_igp.py +2 -1
  32. pydmoo/algorithms/modern/nsga2_imkt_lstm.py +2 -1
  33. pydmoo/algorithms/modern/nsga2_imkt_n.py +2 -1
  34. pydmoo/algorithms/modern/nsga2_imkt_n_clstm.py +2 -1
  35. pydmoo/algorithms/modern/nsga2_imkt_n_igp.py +2 -1
  36. pydmoo/algorithms/modern/nsga2_imkt_n_lstm.py +2 -1
  37. pydmoo/algorithms/modern/nsga2_ktmm.py +2 -1
  38. pydmoo/problems/dyn.py +110 -15
  39. pydmoo/problems/dynamic/cec2015.py +2 -1
  40. pydmoo/problems/dynamic/df.py +2 -1
  41. pydmoo/problems/dynamic/gts.py +641 -82
  42. {pydmoo-0.1.0.dist-info → pydmoo-0.1.2.dist-info}/METADATA +1 -1
  43. pydmoo-0.1.2.dist-info/RECORD +77 -0
  44. pydmoo-0.1.0.dist-info/RECORD +0 -70
  45. {pydmoo-0.1.0.dist-info → pydmoo-0.1.2.dist-info}/WHEEL +0 -0
  46. {pydmoo-0.1.0.dist-info → pydmoo-0.1.2.dist-info}/licenses/LICENSE +0 -0
@@ -65,7 +65,7 @@ class GTS(DynamicTestProblem):
65
65
  def __init__(self,
66
66
  part_idx,
67
67
  bounds,
68
- R_case="one",
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 R_case == "one":
89
- self.R_2 = np.eye(len(self.sub_vec_2))
90
- self.R_3 = np.eye(len(self.sub_vec_3))
91
- elif R_case == "two":
92
- self.R_2 = np.diag([i + 1 for i in range(len(self.sub_vec_2))])
93
- self.R_3 = np.diag([i + 1 for i in range(len(self.sub_vec_3))])
94
- elif R_case == "three":
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.R_2 = np.where(np.eye(len(self.sub_vec_2), dtype=bool), diag_matrix, ones_matrix)
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.R_3 = np.where(np.eye(len(self.sub_vec_3), dtype=bool), diag_matrix, ones_matrix)
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"{R_case} must be `one`, `two` or `three`.")
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"{str(self.__class__.__name__)}.pf")
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"{str(self.__class__.__name__)}.ps")
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 'GTS3'
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
- ![GTS1 PS](../../figs/PS/GTS1.png)
186
+ ![GTS1 PS](../../figs/PS/GTS1.png){: width="400px" height="300px"}
187
187
 
188
188
  - Pareto front (PF)
189
189
 
190
- ![GTS1 PF](../../figs/PF/GTS1.png)
190
+ ![GTS1 PF](../../figs/PF/GTS1.png){: 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.R_2, x2)
204
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
+ ![GTS2 PS](../../figs/PS/GTS2.png){: width="400px" height="300px"}
274
+
275
+ - Pareto front (PF)
276
+
277
+ ![GTS2 PF](../../figs/PF/GTS2.png){: 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.R_2, x2)
243
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
+ ![GTS3 PS](../../figs/PS/GTS3.png){: width="400px" height="300px"}
369
+
370
+ - Pareto front (PF)
371
+
372
+ ![GTS3 PF](../../figs/PF/GTS3.png){: 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.R_2, x2)
282
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
+ ![GTS4 PS](../../figs/PS/GTS4.png){: width="400px" height="300px"}
458
+
459
+ - Pareto front (PF)
460
+
461
+ ![GTS4 PF](../../figs/PF/GTS4.png){: 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.R_2, x2)
317
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
+ ![GTS5 PS](../../figs/PS/GTS5.png){: width="400px" height="300px"}
551
+
552
+ - Pareto front (PF)
553
+
554
+ ![GTS5 PF](../../figs/PF/GTS5.png){: 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.R_2, x2)
356
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
+ ![GTS6 PS](../../figs/PS/GTS6.png){: width="400px" height="300px"}
648
+
649
+ - Pareto front (PF)
650
+
651
+ ![GTS6 PF](../../figs/PF/GTS6.png){: 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.R_2, x2)
400
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
+ ![GTS7 PS](../../figs/PS/GTS7.png){: width="400px" height="300px"}
734
+
735
+ - Pareto front (PF)
736
+
737
+ ![GTS7 PF](../../figs/PF/GTS7.png){: 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.R_2, x2)
433
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
+ ![GTS8 PS](../../figs/PS/GTS8.png){: width="400px" height="300px"}
824
+
825
+ - Pareto front (PF)
826
+
827
+ ![GTS8 PF](../../figs/PF/GTS8.png){: 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.R_2, x2)
469
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
+ ![GTS9 PS](../../figs/PS/GTS9.png){: width="400px" height="300px"}
919
+
920
+ - Pareto front (PF)
921
+
922
+ ![GTS9 PF](../../figs/PF/GTS9.png){: 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.R_2, x2)
510
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
+ ![GTS10 PS](../../figs/PS/GTS10.png){: width="400px" height="300px"}
1019
+
1020
+ - Pareto front (PF)
1021
+
1022
+ ![GTS10 PF](../../figs/PF/GTS10.png){: 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.R_2, x2)
556
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
+ ![GTS11 PS](../../figs/PS/GTS11.png){: width="400px" height="300px"}
1122
+
1123
+ - Pareto front (PF)
1124
+
1125
+ ![GTS11 PF](../../figs/PF/GTS11.png){: 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.R_2, x2)
605
- diag_x3_R3_x3T = np.einsum('ij,jk,ik->i', x3, self.R_3, x3)
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
- def __init__(self, R_case="two", **kwargs):
636
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="two", **kwargs):
641
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="two", **kwargs):
646
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="two", **kwargs):
651
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="two", **kwargs):
656
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="two", **kwargs):
661
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="two", **kwargs):
666
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="two", **kwargs):
671
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="two", **kwargs):
676
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="two", **kwargs):
681
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="two", **kwargs):
686
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
691
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
696
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
701
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
706
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
711
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
716
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
721
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
726
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
731
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
736
- super().__init__(R_case=R_case, **kwargs)
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
- def __init__(self, R_case="three", **kwargs):
741
- super().__init__(R_case=R_case, **kwargs)
1298
+ """GTS11_3 test problem."""
1299
+ def __init__(self, matrix_case="three", **kwargs):
1300
+ super().__init__(matrix_case=matrix_case, **kwargs)