pydmoo 0.1.1__py3-none-any.whl → 0.1.3__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 +55 -8
- pydmoo/algorithms/base/dmoo/dmoeadde.py +55 -7
- pydmoo/algorithms/base/dmoo/dnsga2.py +81 -15
- pydmoo/algorithms/base/moo/moead.py +2 -1
- pydmoo/algorithms/base/moo/moeadde.py +12 -7
- pydmoo/algorithms/classic/moead_ae.py +2 -2
- pydmoo/algorithms/classic/moead_pps.py +2 -2
- pydmoo/algorithms/classic/moead_svr.py +86 -0
- pydmoo/algorithms/classic/moeadde_ae.py +2 -2
- pydmoo/algorithms/classic/moeadde_pps.py +2 -2
- pydmoo/algorithms/classic/moeadde_svr.py +86 -0
- pydmoo/algorithms/classic/nsga2_ae.py +2 -2
- pydmoo/algorithms/classic/nsga2_pps.py +2 -2
- pydmoo/algorithms/learning/moead_tr.py +98 -0
- pydmoo/algorithms/learning/moeadde_tr.py +98 -0
- pydmoo/algorithms/learning/nsga2_tr.py +98 -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 +28 -0
- {pydmoo-0.1.1.dist-info → pydmoo-0.1.3.dist-info}/METADATA +1 -1
- pydmoo-0.1.3.dist-info/RECORD +82 -0
- pydmoo-0.1.1.dist-info/RECORD +0 -77
- {pydmoo-0.1.1.dist-info → pydmoo-0.1.3.dist-info}/WHEEL +0 -0
- {pydmoo-0.1.1.dist-info → pydmoo-0.1.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -25,8 +25,8 @@ class NSGA2PPS(DNSGA2):
|
|
|
25
25
|
self.p = 3 # the order of the AR model
|
|
26
26
|
self.M = 23 # the length of history mean point series
|
|
27
27
|
|
|
28
|
-
def
|
|
29
|
-
"""Response."""
|
|
28
|
+
def _response_mechanism(self):
|
|
29
|
+
"""Response mechanism."""
|
|
30
30
|
pop = self.pop
|
|
31
31
|
X = pop.get("X")
|
|
32
32
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from pymoo.core.population import Population
|
|
5
|
+
from scipy.optimize import Bounds, minimize
|
|
6
|
+
|
|
7
|
+
from pydmoo.algorithms.base.dmoo.dmoead import DMOEAD
|
|
8
|
+
from pydmoo.core.transfer import TCA
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class MOEADTr(DMOEAD):
|
|
12
|
+
"""Transfer learning (Tr).
|
|
13
|
+
|
|
14
|
+
Transfer Learning-based Initial Population Generator (Tr-IPG)
|
|
15
|
+
|
|
16
|
+
References
|
|
17
|
+
----------
|
|
18
|
+
Jiang, M., Huang, Z., Qiu, L., Huang, W., and Yen, G. G. (2018).
|
|
19
|
+
Transfer learning-based dynamic multiobjective optimization algorithms.
|
|
20
|
+
IEEE Transactions on Evolutionary Computation, 22(4), 501–514.
|
|
21
|
+
https://doi.org/10.1109/TEVC.2017.2771451
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, **kwargs):
|
|
25
|
+
super().__init__(**kwargs)
|
|
26
|
+
|
|
27
|
+
self.ndim_ls = 20 # the dimension of latent space
|
|
28
|
+
self.mu = 0.5
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
self._maxiter = max(self.pop_size, 100) # default is 1000
|
|
32
|
+
|
|
33
|
+
def _response_mechanism(self):
|
|
34
|
+
"""Response mechanism."""
|
|
35
|
+
pop = self.pop
|
|
36
|
+
X, F = pop.get("X", "F")
|
|
37
|
+
|
|
38
|
+
last_time = self.data.get("last_time", 0)
|
|
39
|
+
self.data["last_time"] = self.problem.time
|
|
40
|
+
|
|
41
|
+
# source domain
|
|
42
|
+
problem_ = copy.deepcopy(self.problem)
|
|
43
|
+
problem_.time = last_time
|
|
44
|
+
pop_s = self.initialization.sampling(problem_, self.pop_size, random_state=self.random_state)
|
|
45
|
+
pop_s = self.evaluator.eval(problem_, pop_s)
|
|
46
|
+
|
|
47
|
+
# target domain
|
|
48
|
+
pop_t = self.initialization.sampling(self.problem, self.pop_size, random_state=self.random_state)
|
|
49
|
+
pop_t = self.evaluator.eval(self.problem, pop_t)
|
|
50
|
+
|
|
51
|
+
# Algorithm 1: TCA
|
|
52
|
+
model = TCA(dim=self.ndim_ls, mu=self.mu)
|
|
53
|
+
model.fit(pop_s.get("F"), pop_t.get("F"))
|
|
54
|
+
|
|
55
|
+
# Remark3
|
|
56
|
+
particles_latent_saace = model.transform(self.opt.get("F"))
|
|
57
|
+
|
|
58
|
+
def dist_px(p, x, xl, xu):
|
|
59
|
+
x = np.clip(x, xl, xu)
|
|
60
|
+
pop_temp = Population.new(X=[x])
|
|
61
|
+
pop_temp = self.evaluator.eval(self.problem, pop_temp)
|
|
62
|
+
F = pop_temp.get("F")
|
|
63
|
+
return np.sum((model.transform(F) - p) ** 2)
|
|
64
|
+
|
|
65
|
+
X_ = []
|
|
66
|
+
xl, xu = self.problem.bounds()
|
|
67
|
+
for particle in particles_latent_saace:
|
|
68
|
+
start = self.initialization.sampling(self.problem, 1, random_state=self.random_state).get("X")[0]
|
|
69
|
+
start = np.clip(start, xl, xu)
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
res = minimize(
|
|
73
|
+
lambda x: dist_px(particle, x, xl, xu),
|
|
74
|
+
start,
|
|
75
|
+
bounds=Bounds(xl, xu),
|
|
76
|
+
method="trust-constr", # SLSQP, trust-constr, L-BFGS-B; In this paper, we use the interior point algorithm to solve the problem.
|
|
77
|
+
options={
|
|
78
|
+
"maxiter": self._maxiter,
|
|
79
|
+
},
|
|
80
|
+
)
|
|
81
|
+
x_opt = np.clip(res.x, xl, xu)
|
|
82
|
+
X_.append(x_opt)
|
|
83
|
+
|
|
84
|
+
except Exception as e:
|
|
85
|
+
random_point = self.initialization.sampling(self.problem, 1, random_state=self.random_state).get("X")[0]
|
|
86
|
+
X_.append(np.clip(random_point, xl, xu))
|
|
87
|
+
|
|
88
|
+
# bounds
|
|
89
|
+
X_ = np.array(X_)
|
|
90
|
+
if self.problem.has_bounds():
|
|
91
|
+
xl, xu = self.problem.bounds()
|
|
92
|
+
X_ = np.clip(X_, xl, xu) # not provided in the original reference literature
|
|
93
|
+
|
|
94
|
+
# recreate the current population without being evaluated
|
|
95
|
+
# merge
|
|
96
|
+
pop = Population.merge(pop_t, Population.new(X=X_))
|
|
97
|
+
|
|
98
|
+
return pop
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from pymoo.core.population import Population
|
|
5
|
+
from scipy.optimize import Bounds, minimize
|
|
6
|
+
|
|
7
|
+
from pydmoo.algorithms.base.dmoo.dmoeadde import DMOEADDE
|
|
8
|
+
from pydmoo.core.transfer import TCA
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class MOEADDETr(DMOEADDE):
|
|
12
|
+
"""Transfer learning (Tr).
|
|
13
|
+
|
|
14
|
+
Transfer Learning-based Initial Population Generator (Tr-IPG)
|
|
15
|
+
|
|
16
|
+
References
|
|
17
|
+
----------
|
|
18
|
+
Jiang, M., Huang, Z., Qiu, L., Huang, W., and Yen, G. G. (2018).
|
|
19
|
+
Transfer learning-based dynamic multiobjective optimization algorithms.
|
|
20
|
+
IEEE Transactions on Evolutionary Computation, 22(4), 501–514.
|
|
21
|
+
https://doi.org/10.1109/TEVC.2017.2771451
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, **kwargs):
|
|
25
|
+
super().__init__(**kwargs)
|
|
26
|
+
|
|
27
|
+
self.ndim_ls = 20 # the dimension of latent space
|
|
28
|
+
self.mu = 0.5
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
self._maxiter = max(self.pop_size, 100) # default is 1000
|
|
32
|
+
|
|
33
|
+
def _response_mechanism(self):
|
|
34
|
+
"""Response mechanism."""
|
|
35
|
+
pop = self.pop
|
|
36
|
+
X, F = pop.get("X", "F")
|
|
37
|
+
|
|
38
|
+
last_time = self.data.get("last_time", 0)
|
|
39
|
+
self.data["last_time"] = self.problem.time
|
|
40
|
+
|
|
41
|
+
# source domain
|
|
42
|
+
problem_ = copy.deepcopy(self.problem)
|
|
43
|
+
problem_.time = last_time
|
|
44
|
+
pop_s = self.initialization.sampling(problem_, self.pop_size, random_state=self.random_state)
|
|
45
|
+
pop_s = self.evaluator.eval(problem_, pop_s)
|
|
46
|
+
|
|
47
|
+
# target domain
|
|
48
|
+
pop_t = self.initialization.sampling(self.problem, self.pop_size, random_state=self.random_state)
|
|
49
|
+
pop_t = self.evaluator.eval(self.problem, pop_t)
|
|
50
|
+
|
|
51
|
+
# Algorithm 1: TCA
|
|
52
|
+
model = TCA(dim=self.ndim_ls, mu=self.mu)
|
|
53
|
+
model.fit(pop_s.get("F"), pop_t.get("F"))
|
|
54
|
+
|
|
55
|
+
# Remark3
|
|
56
|
+
particles_latent_saace = model.transform(self.opt.get("F"))
|
|
57
|
+
|
|
58
|
+
def dist_px(p, x, xl, xu):
|
|
59
|
+
x = np.clip(x, xl, xu)
|
|
60
|
+
pop_temp = Population.new(X=[x])
|
|
61
|
+
pop_temp = self.evaluator.eval(self.problem, pop_temp)
|
|
62
|
+
F = pop_temp.get("F")
|
|
63
|
+
return np.sum((model.transform(F) - p) ** 2)
|
|
64
|
+
|
|
65
|
+
X_ = []
|
|
66
|
+
xl, xu = self.problem.bounds()
|
|
67
|
+
for particle in particles_latent_saace:
|
|
68
|
+
start = self.initialization.sampling(self.problem, 1, random_state=self.random_state).get("X")[0]
|
|
69
|
+
start = np.clip(start, xl, xu)
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
res = minimize(
|
|
73
|
+
lambda x: dist_px(particle, x, xl, xu),
|
|
74
|
+
start,
|
|
75
|
+
bounds=Bounds(xl, xu),
|
|
76
|
+
method="trust-constr", # SLSQP, trust-constr, L-BFGS-B; In this paper, we use the interior point algorithm to solve the problem.
|
|
77
|
+
options={
|
|
78
|
+
"maxiter": self._maxiter,
|
|
79
|
+
},
|
|
80
|
+
)
|
|
81
|
+
x_opt = np.clip(res.x, xl, xu)
|
|
82
|
+
X_.append(x_opt)
|
|
83
|
+
|
|
84
|
+
except Exception as e:
|
|
85
|
+
random_point = self.initialization.sampling(self.problem, 1, random_state=self.random_state).get("X")[0]
|
|
86
|
+
X_.append(np.clip(random_point, xl, xu))
|
|
87
|
+
|
|
88
|
+
# bounds
|
|
89
|
+
X_ = np.array(X_)
|
|
90
|
+
if self.problem.has_bounds():
|
|
91
|
+
xl, xu = self.problem.bounds()
|
|
92
|
+
X_ = np.clip(X_, xl, xu) # not provided in the original reference literature
|
|
93
|
+
|
|
94
|
+
# recreate the current population without being evaluated
|
|
95
|
+
# merge
|
|
96
|
+
pop = Population.merge(pop_t, Population.new(X=X_))
|
|
97
|
+
|
|
98
|
+
return pop
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from pymoo.core.population import Population
|
|
5
|
+
from scipy.optimize import Bounds, minimize
|
|
6
|
+
|
|
7
|
+
from pydmoo.algorithms.base.dmoo.dnsga2 import DNSGA2
|
|
8
|
+
from pydmoo.core.transfer import TCA
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class NSGA2Tr(DNSGA2):
|
|
12
|
+
"""Transfer learning (Tr).
|
|
13
|
+
|
|
14
|
+
Transfer Learning-based Initial Population Generator (Tr-IPG)
|
|
15
|
+
|
|
16
|
+
References
|
|
17
|
+
----------
|
|
18
|
+
Jiang, M., Huang, Z., Qiu, L., Huang, W., and Yen, G. G. (2018).
|
|
19
|
+
Transfer learning-based dynamic multiobjective optimization algorithms.
|
|
20
|
+
IEEE Transactions on Evolutionary Computation, 22(4), 501–514.
|
|
21
|
+
https://doi.org/10.1109/TEVC.2017.2771451
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
def __init__(self, **kwargs):
|
|
25
|
+
super().__init__(**kwargs)
|
|
26
|
+
|
|
27
|
+
self.ndim_ls = 20 # the dimension of latent space
|
|
28
|
+
self.mu = 0.5
|
|
29
|
+
|
|
30
|
+
#
|
|
31
|
+
self._maxiter = max(self.pop_size, 100) # default is 1000
|
|
32
|
+
|
|
33
|
+
def _response_mechanism(self):
|
|
34
|
+
"""Response mechanism."""
|
|
35
|
+
pop = self.pop
|
|
36
|
+
X, F = pop.get("X", "F")
|
|
37
|
+
|
|
38
|
+
last_time = self.data.get("last_time", 0)
|
|
39
|
+
self.data["last_time"] = self.problem.time
|
|
40
|
+
|
|
41
|
+
# source domain
|
|
42
|
+
problem_ = copy.deepcopy(self.problem)
|
|
43
|
+
problem_.time = last_time
|
|
44
|
+
pop_s = self.initialization.sampling(problem_, self.pop_size, random_state=self.random_state)
|
|
45
|
+
pop_s = self.evaluator.eval(problem_, pop_s)
|
|
46
|
+
|
|
47
|
+
# target domain
|
|
48
|
+
pop_t = self.initialization.sampling(self.problem, self.pop_size, random_state=self.random_state)
|
|
49
|
+
pop_t = self.evaluator.eval(self.problem, pop_t)
|
|
50
|
+
|
|
51
|
+
# Algorithm 1: TCA
|
|
52
|
+
model = TCA(dim=self.ndim_ls, mu=self.mu)
|
|
53
|
+
model.fit(pop_s.get("F"), pop_t.get("F"))
|
|
54
|
+
|
|
55
|
+
# Remark3
|
|
56
|
+
particles_latent_saace = model.transform(self.opt.get("F"))
|
|
57
|
+
|
|
58
|
+
def dist_px(p, x, xl, xu):
|
|
59
|
+
x = np.clip(x, xl, xu)
|
|
60
|
+
pop_temp = Population.new(X=[x])
|
|
61
|
+
pop_temp = self.evaluator.eval(self.problem, pop_temp)
|
|
62
|
+
F = pop_temp.get("F")
|
|
63
|
+
return np.sum((model.transform(F) - p) ** 2)
|
|
64
|
+
|
|
65
|
+
X_ = []
|
|
66
|
+
xl, xu = self.problem.bounds()
|
|
67
|
+
for particle in particles_latent_saace:
|
|
68
|
+
start = self.initialization.sampling(self.problem, 1, random_state=self.random_state).get("X")[0]
|
|
69
|
+
start = np.clip(start, xl, xu)
|
|
70
|
+
|
|
71
|
+
try:
|
|
72
|
+
res = minimize(
|
|
73
|
+
lambda x: dist_px(particle, x, xl, xu),
|
|
74
|
+
start,
|
|
75
|
+
bounds=Bounds(xl, xu),
|
|
76
|
+
method="trust-constr", # SLSQP, trust-constr, L-BFGS-B; In this paper, we use the interior point algorithm to solve the problem.
|
|
77
|
+
options={
|
|
78
|
+
"maxiter": self._maxiter,
|
|
79
|
+
},
|
|
80
|
+
)
|
|
81
|
+
x_opt = np.clip(res.x, xl, xu)
|
|
82
|
+
X_.append(x_opt)
|
|
83
|
+
|
|
84
|
+
except Exception as e:
|
|
85
|
+
random_point = self.initialization.sampling(self.problem, 1, random_state=self.random_state).get("X")[0]
|
|
86
|
+
X_.append(np.clip(random_point, xl, xu))
|
|
87
|
+
|
|
88
|
+
# bounds
|
|
89
|
+
X_ = np.array(X_)
|
|
90
|
+
if self.problem.has_bounds():
|
|
91
|
+
xl, xu = self.problem.bounds()
|
|
92
|
+
X_ = np.clip(X_, xl, xu) # not provided in the original reference literature
|
|
93
|
+
|
|
94
|
+
# recreate the current population without being evaluated
|
|
95
|
+
# merge
|
|
96
|
+
pop = Population.merge(pop_t, Population.new(X=X_))
|
|
97
|
+
|
|
98
|
+
return pop
|
|
@@ -19,7 +19,8 @@ class NSGA2IMKT(NSGA2KTMM):
|
|
|
19
19
|
self.size_pool = 10
|
|
20
20
|
self.denominator = 0.5
|
|
21
21
|
|
|
22
|
-
def
|
|
22
|
+
def _response_mechanism(self):
|
|
23
|
+
"""Response mechanism."""
|
|
23
24
|
"""Inverse Modeling with Knowledge Transfer."""
|
|
24
25
|
pop = self.pop
|
|
25
26
|
X = pop.get("X")
|
pydmoo/problems/dyn.py
CHANGED
|
@@ -193,6 +193,34 @@ class DynamicTestProblem(DynamicProblem):
|
|
|
193
193
|
|
|
194
194
|
@property
|
|
195
195
|
def time(self):
|
|
196
|
+
r"""Time.
|
|
197
|
+
|
|
198
|
+
Notes
|
|
199
|
+
-----
|
|
200
|
+
The discrete time $t$ is defined as follows:
|
|
201
|
+
|
|
202
|
+
\begin{equation}
|
|
203
|
+
t = \frac{1}{n_t} \left\lfloor \frac{\tau}{\tau_t} \right\rfloor + \frac{1}{n_t} \left(0.5 \times \frac{\pi_{\tau}}{9}\right), \ \tau = 0, 1, 2, \dots
|
|
204
|
+
\end{equation}
|
|
205
|
+
|
|
206
|
+
Here, $\pi_{\tau}$ is given by:
|
|
207
|
+
|
|
208
|
+
\begin{equation}
|
|
209
|
+
\pi_{\tau} =
|
|
210
|
+
\begin{cases}
|
|
211
|
+
0, & \text{if } \left\lfloor \frac{\tau}{\tau_t} \right\rfloor = 0, \\
|
|
212
|
+
\text{the } \left\lfloor \frac{\tau}{\tau_t} \right\rfloor\text{-th decimal digit of } \pi, & \text{otherwise.}
|
|
213
|
+
\end{cases}
|
|
214
|
+
\end{equation}
|
|
215
|
+
|
|
216
|
+
This formulation introduces a dynamic environment with an irregular change pattern. When $\pi_{\tau} = 0$, the time variation reduces to the commonly used form with a regular change pattern:
|
|
217
|
+
|
|
218
|
+
\begin{equation} \label{eq:time_regular}
|
|
219
|
+
t = \frac{1}{n_t} \left\lfloor \frac{\tau}{\tau_t} \right\rfloor, \ \tau = 0, 1, 2, \dots
|
|
220
|
+
\end{equation}
|
|
221
|
+
|
|
222
|
+
In the above expressions, $\tau$ denotes the generation counter, $n_t$ controls the severity of change, and $\tau_t$ represents the number of generations per time step.
|
|
223
|
+
"""
|
|
196
224
|
if self._time is not None:
|
|
197
225
|
return self._time
|
|
198
226
|
else:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pydmoo
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: Dynamic Multi-Objective Optimization in Python (pydmoo).
|
|
5
5
|
Project-URL: Homepage, https://github.com/dynoptimization/pydmoo
|
|
6
6
|
Project-URL: Repository, https://github.com/dynoptimization/pydmoo
|