|
2 | 2 |
|
3 | 3 | import numpy as np |
4 | 4 |
|
5 | | -from pymoo.algorithms.nsga2 import NSGA2 |
6 | | -from pymoo.factory import get_problem, Problem, ZDT |
| 5 | +from pymoo.algorithms.so_genetic_algorithm import GA |
| 6 | +from pymoo.algorithms.so_nelder_mead import NelderMead |
| 7 | +from pymoo.algorithms.so_pattern_search import PatternSearch |
| 8 | +from pymoo.algorithms.so_pso import PSO |
| 9 | +from pymoo.factory import Sphere, Problem |
7 | 10 | from pymoo.optimize import minimize |
8 | 11 |
|
9 | | -class MyThreadedProblem(Problem): |
10 | 12 |
|
11 | | - def __init__(self): |
12 | | - super().__init__(n_var=2, |
13 | | - n_obj=1, |
14 | | - n_constr=0, |
15 | | - elementwise_evaluation=True, |
16 | | - parallelization=("threads", 4), |
17 | | - xl=np.array([0, 0]), |
18 | | - xu=np.array([100, 100])) |
| 13 | +class SphereNoBounds(Sphere): |
19 | 14 |
|
20 | | - def _evaluate(self, x, out, *args, **kwargs): |
21 | | - out["F"] = x[0] + x[1] |
22 | | - |
23 | | - |
24 | | -class AlgorithmTest(unittest.TestCase): |
| 15 | + def __init__(self, n_var=10, **kwargs): |
| 16 | + super().__init__(n_var=n_var, **kwargs) |
| 17 | + self.xl = None |
| 18 | + self.xu = None |
25 | 19 |
|
26 | | - def test_same_seed_same_result(self): |
27 | | - problem = get_problem("zdt3") |
28 | | - algorithm = NSGA2(pop_size=100, eliminate_duplicates=True) |
29 | 20 |
|
30 | | - res1 = minimize(problem, algorithm, ('n_gen', 20), seed=1) |
31 | | - np.random.seed(200) |
32 | | - res2 = minimize(problem, algorithm, ('n_gen', 20), seed=1) |
| 21 | +class SphereWithConstraints(Problem): |
33 | 22 |
|
34 | | - self.assertEqual(res1.X.shape, res2.X.shape) |
35 | | - self.assertTrue(np.all(np.allclose(res1.X, res2.X))) |
| 23 | + def __init__(self, n_var=10): |
| 24 | + super().__init__(n_var=n_var, n_obj=1, n_constr=1, xl=-0, xu=1, type_var=np.double) |
36 | 25 |
|
37 | | - def test_no_pareto_front_given(self): |
38 | | - class ZDT1NoPF(ZDT): |
39 | | - def _evaluate(self, x, out, *args, **kwargs): |
40 | | - f1 = x[:, 0] |
41 | | - g = 1 + 9.0 / (self.n_var - 1) * np.sum(x[:, 1:], axis=1) |
42 | | - f2 = g * (1 - np.power((f1 / g), 0.5)) |
43 | | - out["F"] = np.column_stack([f1, f2]) |
44 | | - |
45 | | - algorithm = NSGA2(pop_size=100, eliminate_duplicates=True) |
46 | | - minimize(ZDT1NoPF(), algorithm, ('n_gen', 20), seed=1, verbose=True) |
| 26 | + def _evaluate(self, x, out, *args, **kwargs): |
| 27 | + out["F"] = np.sum(np.square(x - 0.5), axis=1) |
| 28 | + out["G"] = 0.1 - out["F"] |
47 | 29 |
|
48 | | - def test_no_feasible_solution_found(self): |
49 | | - class MyProblem(Problem): |
| 30 | + def _calc_pareto_front(self): |
| 31 | + return 0.1 |
50 | 32 |
|
51 | | - def __init__(self): |
52 | | - super().__init__(n_var=2, |
53 | | - n_obj=1, |
54 | | - n_constr=36, |
55 | | - xl=np.array([0, 0]), |
56 | | - xu=np.array([100, 100])) |
57 | 33 |
|
58 | | - def _evaluate(self, x, out, *args, **kwargs): |
59 | | - f1 = x[:, 0] + x[:, 1] |
60 | | - out["F"] = np.column_stack([f1]) |
61 | | - out["G"] = np.ones(len(x)) |
| 34 | +def test(problem, algorithm): |
| 35 | + res = minimize(problem, algorithm, seed=1) |
| 36 | + f = res.F[0] |
| 37 | + print(res.CV) |
| 38 | + f_opt = problem.pareto_front()[0, 0] |
| 39 | + return f, f_opt |
62 | 40 |
|
63 | | - res = minimize(MyProblem(), |
64 | | - NSGA2(), |
65 | | - ("n_gen", 10), |
66 | | - seed=1) |
67 | 41 |
|
68 | | - self.assertEqual(res.X, None) |
69 | | - self.assertEqual(res.F, None) |
70 | | - self.assertEqual(res.G, None) |
| 42 | +class SingleObjectiveAlgorithmTest(unittest.TestCase): |
71 | 43 |
|
72 | | - res = minimize(MyProblem(), |
73 | | - NSGA2(return_least_infeasible=True), |
74 | | - ("n_gen", 10), |
75 | | - seed=1, |
76 | | - verbose=True, |
77 | | - save_history=True) |
| 44 | + def test_sphere(self): |
| 45 | + problem = Sphere() |
| 46 | + for algorithm in [NelderMead(), PatternSearch(), PSO(), GA()]: |
| 47 | + f, f_opt = test(problem, algorithm) |
| 48 | + self.assertAlmostEqual(f, f_opt, places=5) |
| 49 | + print(problem.__class__.__name__, algorithm.__class__.__name__, "Yes") |
78 | 50 |
|
79 | | - self.assertEqual(res.CV, 1) |
| 51 | + def test_sphere_with_constraints(self): |
| 52 | + problem = SphereWithConstraints() |
| 53 | + for algorithm in [GA(), NelderMead(), PatternSearch()]: |
| 54 | + f, f_opt = test(problem, algorithm) |
| 55 | + self.assertAlmostEqual(f, f_opt, places=3) |
| 56 | + print(problem.__class__.__name__, algorithm.__class__.__name__, "Yes") |
80 | 57 |
|
| 58 | + def test_sphere_no_bounds(self): |
| 59 | + problem = SphereNoBounds() |
| 60 | + x0 = np.random.random(problem.n_var) |
81 | 61 |
|
82 | | - def test_thread_pool(self): |
83 | | - minimize(MyThreadedProblem(), |
84 | | - NSGA2(), |
85 | | - ("n_gen", 10), |
86 | | - seed=1, |
87 | | - save_history=False) |
| 62 | + for algorithm in [NelderMead(x0=x0), PatternSearch(x0=x0)]: |
| 63 | + f, f_opt = test(problem, algorithm) |
| 64 | + self.assertAlmostEqual(f, f_opt, places=5) |
| 65 | + print(problem.__class__.__name__, algorithm.__class__.__name__, "Yes") |
88 | 66 |
|
89 | 67 |
|
90 | 68 | if __name__ == '__main__': |
|
0 commit comments