#!/usr/bin/env python """ A real-world multi-objective problem suite (the RE benchmark set) Reference: Ryoji Tanabe, Hisao Ishibuchi, "An Easy-to-use Real-world Multi-objective Problem Suite" Applied Soft Computing. 89: 106078 (2020) Copyright (c) 2020 Ryoji Tanabe I re-implemented the RE problem set by referring to its C source code (reproblem.c). While variables directly copied from the C source code are written in CamelCase, the other variables are written in snake_case. It is somewhat awkward. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ import numpy as np from pymoo.core.problem import ElementwiseProblem class RE21(): def __init__(self): self.problem_name = 'RE21' self.n_objectives = 2 self.n_variables = 4 self.n_constraints = 0 self.n_original_constraints = 0 F = 10.0 sigma = 10.0 tmp_val = F / sigma self.ubound = np.full(self.n_variables, 3 * tmp_val) self.lbound = np.zeros(self.n_variables) self.lbound[0] = tmp_val self.lbound[1] = np.sqrt(2.0) * tmp_val self.lbound[2] = np.sqrt(2.0) * tmp_val self.lbound[3] = tmp_val def evaluate(self, x): f = np.zeros(self.n_objectives) x1 = x[0] x2 = x[1] x3 = x[2] x4 = x[3] F = 10.0 sigma = 10.0 E = 2.0 * 1e5 L = 200.0 f[0] = L * ((2 * x1) + np.sqrt(2.0) * x2 + np.sqrt(x3) + x4) f[1] = ((F * L) / E) * ((2.0 / x1) + (2.0 * np.sqrt(2.0) / x2) - (2.0 * np.sqrt(2.0) / x3) + (2.0 / x4)) return f class RE22(): def __init__(self): self.problem_name = 'RE22' self.n_objectives = 2 self.n_variables = 3 self.n_constraints = 0 self.n_original_constraints = 2 self.ubound = np.zeros(self.n_variables) self.lbound = np.zeros(self.n_variables) self.lbound[0] = 0.2 self.lbound[1] = 0.0 self.lbound[2] = 0.0 self.ubound[0] = 15 self.ubound[1] = 20 self.ubound[2] = 40 self.feasible_vals = np.array([0.20, 0.31, 0.40, 0.44, 0.60, 0.62, 0.79, 0.80, 0.88, 0.93, 1.0, 1.20, 1.24, 1.32, 1.40, 1.55, 1.58, 1.60, 1.76, 1.80, 1.86, 2.0, 2.17, 2.20, 2.37, 2.40, 2.48, 2.60, 2.64, 2.79, 2.80, 3.0, 3.08, 3,10, 3.16, 3.41, 3.52, 3.60, 3.72, 3.95, 3.96, 4.0, 4.03, 4.20, 4.34, 4.40, 4.65, 4.74, 4.80, 4.84, 5.0, 5.28, 5.40, 5.53, 5.72, 6.0, 6.16, 6.32, 6.60, 7.11, 7.20, 7.80, 7.90, 8.0, 8.40, 8.69, 9.0, 9.48, 10.27, 11.0, 11.06, 11.85, 12.0, 13.0, 14.0, 15.0]) def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) #Reference: getNearestValue_sample2.py (https://gist.github.com/icchi-h/1d0bb1c52ebfdd31f14b3e811328390a) idx = np.abs(np.asarray(self.feasible_vals) - x[0]).argmin() x1 = self.feasible_vals[idx] x2 = x[1] x3 = x[2] #First original objective function f[0] = (29.4 * x1) + (0.6 * x2 * x3) # Original constraint functions g[0] = (x1 * x3) - 7.735 * ((x1 * x1) / x2) - 180.0 g[1] = 4.0 - (x3 / x2) g = np.where(g < 0, -g, 0) f[1] = g[0] + g[1] return f class RE23(): def __init__(self): self.problem_name = 'RE23' self.n_objectives = 2 self.n_variables = 4 self.n_constraints = 0 self.n_original_constraints = 3 self.ubound = np.zeros(self.n_variables) self.lbound = np.zeros(self.n_variables) self.lbound[0] = 1 self.lbound[1] = 1 self.lbound[2] = 10 self.lbound[3] = 10 self.ubound[0] = 100 self.ubound[1] = 100 self.ubound[2] = 200 self.ubound[3] = 240 def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) x1 = 0.0625 * int(np.round(x[0])) x2 = 0.0625 * int(np.round(x[1])) x3 = x[2] x4 = x[3] #First original objective function f[0] = (0.6224 * x1 * x3* x4) + (1.7781 * x2 * x3 * x3) + (3.1661 * x1 * x1 * x4) + (19.84 * x1 * x1 * x3) # Original constraint functions g[0] = x1 - (0.0193 * x3) g[1] = x2 - (0.00954 * x3) g[2] = (np.pi * x3 * x3 * x4) + ((4.0/3.0) * (np.pi * x3 * x3 * x3)) - 1296000 g = np.where(g < 0, -g, 0) f[1] = g[0] + g[1] + g[2] return f class RE24(): def __init__(self): self.problem_name = 'RE24' self.n_objectives = 2 self.n_variables = 2 self.n_constraints = 0 self.n_original_constraints = 4 self.ubound = np.zeros(self.n_variables) self.lbound = np.zeros(self.n_variables) self.lbound[0] = 0.5 self.lbound[1] = 0.5 self.ubound[0] = 4 self.ubound[1] = 50 def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) x1 = x[0] x2 = x[1] #First original objective function f[0] = x1 + (120 * x2) E = 700000 sigma_b_max = 700 tau_max = 450 delta_max = 1.5 sigma_k = (E * x1 * x1) / 100 sigma_b = 4500 / (x1 * x2) tau = 1800 / x2 delta = (56.2 * 10000) / (E * x1 * x2 * x2) g[0] = 1 - (sigma_b / sigma_b_max) g[1] = 1 - (tau / tau_max) g[2] = 1 - (delta / delta_max) g[3] = 1 - (sigma_b / sigma_k) g = np.where(g < 0, -g, 0) f[1] = g[0] + g[1] + g[2] + g[3] return f class RE25(): def __init__(self): self.problem_name = 'RE25' self.n_objectives = 2 self.n_variables = 3 self.n_constraints = 0 self.n_original_constraints = 6 self.ubound = np.zeros(self.n_variables) self.lbound = np.zeros(self.n_variables) self.lbound[0] = 1 self.lbound[1] = 0.6 self.lbound[2] = 0.09 self.ubound[0] = 70 self.ubound[1] = 3 self.ubound[2] = 0.5 self.feasible_vals = np.array([0.009, 0.0095, 0.0104, 0.0118, 0.0128, 0.0132, 0.014, 0.015, 0.0162, 0.0173, 0.018, 0.02, 0.023, 0.025, 0.028, 0.032, 0.035, 0.041, 0.047, 0.054, 0.063, 0.072, 0.08, 0.092, 0.105, 0.12, 0.135, 0.148, 0.162, 0.177, 0.192, 0.207, 0.225, 0.244, 0.263, 0.283, 0.307, 0.331, 0.362, 0.394, 0.4375, 0.5]) def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) x1 = np.round(x[0]) x2 = x[1] #Reference: getNearestValue_sample2.py (https://gist.github.com/icchi-h/1d0bb1c52ebfdd31f14b3e811328390a) idx = np.abs(np.asarray(self.feasible_vals) - x[2]).argmin() x3 = self.feasible_vals[idx] # first original objective function f[0] = (np.pi * np.pi * x2 * x3 * x3 * (x1 + 2)) / 4.0 # constraint functions Cf = ((4.0 * (x2 / x3) - 1) / (4.0 * (x2 / x3) - 4)) + (0.615 * x3 / x2) Fmax = 1000.0 S = 189000.0 G = 11.5 * 1e+6 K = (G * x3 * x3 * x3 * x3) / (8 * x1 * x2 * x2 * x2) lmax = 14.0 lf = (Fmax / K) + 1.05 * (x1 + 2) * x3 dmin = 0.2 Dmax = 3 Fp = 300.0 sigmaP = Fp / K sigmaPM = 6 sigmaW = 1.25 g[0] = -((8 * Cf * Fmax * x2) / (np.pi * x3 * x3 * x3)) + S g[1] = -lf + lmax g[2] = -3 + (x2 / x3) g[3] = -sigmaP + sigmaPM g[4] = -sigmaP - ((Fmax - Fp) / K) - 1.05 * (x1 + 2) * x3 + lf g[5] = sigmaW- ((Fmax - Fp) / K) g = np.where(g < 0, -g, 0) f[1] = g[0] + g[1] + g[2] + g[3] + g[4] + g[5] return f class RE31(): def __init__(self): self.problem_name = 'RE31' self.n_objectives = 3 self.n_variables = 3 self.n_constraints = 0 self.n_original_constraints = 3 self.ubound = np.zeros(self.n_variables) self.lbound = np.zeros(self.n_variables) self.lbound[0] = 0.00001 self.lbound[1] = 0.00001 self.lbound[2] = 1.0 self.ubound[0] = 100.0 self.ubound[1] = 100.0 self.ubound[2] = 3.0 def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) x1 = x[0] x2 = x[1] x3 = x[2] # First original objective function f[0] = x1 * np.sqrt(16.0 + (x3 * x3)) + x2 * np.sqrt(1.0 + x3 * x3) # Second original objective function f[1] = (20.0 * np.sqrt(16.0 + (x3 * x3))) / (x1 * x3) # Constraint functions g[0] = 0.1 - f[0] g[1] = 100000.0 - f[1] g[2] = 100000 - ((80.0 * np.sqrt(1.0 + x3 * x3)) / (x3 * x2)) g = np.where(g < 0, -g, 0) f[2] = g[0] + g[1] + g[2] return f class RE32(): def __init__(self): self.problem_name = 'RE32' self.n_objectives = 3 self.n_variables = 4 self.n_constraints = 0 self.n_original_constraints = 4 self.ubound = np.zeros(self.n_variables) self.lbound = np.zeros(self.n_variables) self.lbound[0] = 0.125 self.lbound[1] = 0.1 self.lbound[2] = 0.1 self.lbound[3] = 0.125 self.ubound[0] = 5.0 self.ubound[1] = 10.0 self.ubound[2] = 10.0 self.ubound[3] = 5.0 def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) x1 = x[0] x2 = x[1] x3 = x[2] x4 = x[3] P = 6000 L = 14 E = 30 * 1e6 # // deltaMax = 0.25 G = 12 * 1e6 tauMax = 13600 sigmaMax = 30000 # First original objective function f[0] = (1.10471 * x1 * x1 * x2) + (0.04811 * x3 * x4) * (14.0 + x2) # Second original objective function f[1] = (4 * P * L * L * L) / (E * x4 * x3 * x3 * x3) # Constraint functions M = P * (L + (x2 / 2)) tmpVar = ((x2 * x2) / 4.0) + np.power((x1 + x3) / 2.0, 2) R = np.sqrt(tmpVar) tmpVar = ((x2 * x2) / 12.0) + np.power((x1 + x3) / 2.0, 2) J = 2 * np.sqrt(2) * x1 * x2 * tmpVar tauDashDash = (M * R) / J tauDash = P / (np.sqrt(2) * x1 * x2) tmpVar = tauDash * tauDash + ((2 * tauDash * tauDashDash * x2) / (2 * R)) + (tauDashDash * tauDashDash) tau = np.sqrt(tmpVar) sigma = (6 * P * L) / (x4 * x3 * x3) tmpVar = 4.013 * E * np.sqrt((x3 * x3 * x4 * x4 * x4 * x4 * x4 * x4) / 36.0) / (L * L) tmpVar2 = (x3 / (2 * L)) * np.sqrt(E / (4 * G)) PC = tmpVar * (1 - tmpVar2) g[0] = tauMax - tau g[1] = sigmaMax - sigma g[2] = x4 - x1 g[3] = PC - P g = np.where(g < 0, -g, 0) f[2] = g[0] + g[1] + g[2] + g[3] return f class RE33(): def __init__(self): self.problem_name = 'RE33' self.n_objectives = 3 self.n_variables = 4 self.n_constraints = 0 self.n_original_constraints = 4 self.ubound = np.zeros(self.n_variables) self.lbound = np.zeros(self.n_variables) self.lbound[0] = 55 self.lbound[1] = 75 self.lbound[2] = 1000 self.lbound[3] = 11 self.ubound[0] = 80 self.ubound[1] = 110 self.ubound[2] = 3000 self.ubound[3] = 20 def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) x1 = x[0] x2 = x[1] x3 = x[2] x4 = x[3] # First original objective function f[0] = 4.9 * 1e-5 * (x2 * x2 - x1 * x1) * (x4 - 1.0) # Second original objective function f[1] = ((9.82 * 1e6) * (x2 * x2 - x1 * x1)) / (x3 * x4 * (x2 * x2 * x2 - x1 * x1 * x1)) # Reformulated objective functions g[0] = (x2 - x1) - 20.0 g[1] = 0.4 - (x3 / (3.14 * (x2 * x2 - x1 * x1))) g[2] = 1.0 - (2.22 * 1e-3 * x3 * (x2 * x2 * x2 - x1 * x1 * x1)) / np.power((x2 * x2 - x1 * x1), 2) g[3] = (2.66 * 1e-2 * x3 * x4 * (x2 * x2 * x2 - x1 * x1 * x1)) / (x2 * x2 - x1 * x1) - 900.0 g = np.where(g < 0, -g, 0) f[2] = g[0] + g[1] + g[2] + g[3] return f class RE34(): def __init__(self): self.problem_name = 'RE34' self.n_objectives = 3 self.n_variables = 5 self.n_constraints = 0 self.n_original_constraints = 0 self.lbound = np.full(self.n_variables, 1) self.ubound = np.full(self.n_variables, 3) def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) x1 = x[0] x2 = x[1] x3 = x[2] x4 = x[3] x5 = x[4] f[0] = 1640.2823 + (2.3573285 * x1) + (2.3220035 * x2) + (4.5688768 * x3) + (7.7213633 * x4) + (4.4559504 * x5) f[1] = 6.5856 + (1.15 * x1) - (1.0427 * x2) + (0.9738 * x3) + (0.8364 * x4) - (0.3695 * x1 * x4) + (0.0861 * x1 * x5) + (0.3628 * x2 * x4) - (0.1106 * x1 * x1) - (0.3437 * x3 * x3) + (0.1764 * x4 * x4) f[2] = -0.0551 + (0.0181 * x1) + (0.1024 * x2) + (0.0421 * x3) - (0.0073 * x1 * x2) + (0.024 * x2 * x3) - (0.0118 * x2 * x4) - (0.0204 * x3 * x4) - (0.008 * x3 * x5) - (0.0241 * x2 * x2) + (0.0109 * x4 * x4) return f class RE35(): def __init__(self): self.problem_name = 'RE35' self.n_objectives = 3 self.n_variables = 7 self.n_constraints = 0 self.n_original_constraints = 11 self.lbound = np.zeros(self.n_variables) self.ubound = np.zeros(self.n_variables) self.lbound[0] = 2.6 self.lbound[1] = 0.7 self.lbound[2] = 17 self.lbound[3] = 7.3 self.lbound[4] = 7.3 self.lbound[5] = 2.9 self.lbound[6] = 5.0 self.ubound[0] = 3.6 self.ubound[1] = 0.8 self.ubound[2] = 28 self.ubound[3] = 8.3 self.ubound[4] = 8.3 self.ubound[5] = 3.9 self.ubound[6] = 5.5 def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) x1 = x[0] x2 = x[1] x3 = np.round(x[2]) x4 = x[3] x5 = x[4] x6 = x[5] x7 = x[6] # First original objective function (weight) f[0] = 0.7854 * x1 * (x2 * x2) * (((10.0 * x3 * x3) / 3.0) + (14.933 * x3) - 43.0934) - 1.508 * x1 * (x6 * x6 + x7 * x7) + 7.477 * (x6 * x6 * x6 + x7 * x7 * x7) + 0.7854 * (x4 * x6 * x6 + x5 * x7 * x7) # Second original objective function (stress) tmpVar = np.power((745.0 * x4) / (x2 * x3), 2.0) + 1.69 * 1e7 f[1] = np.sqrt(tmpVar) / (0.1 * x6 * x6 * x6) # Constraint functions g[0] = -(1.0 / (x1 * x2 * x2 * x3)) + 1.0 / 27.0 g[1] = -(1.0 / (x1 * x2 * x2 * x3 * x3)) + 1.0 / 397.5 g[2] = -(x4 * x4 * x4) / (x2 * x3 * x6 * x6 * x6 * x6) + 1.0 / 1.93 g[3] = -(x5 * x5 * x5) / (x2 * x3 * x7 * x7 * x7 * x7) + 1.0 / 1.93 g[4] = -(x2 * x3) + 40.0 g[5] = -(x1 / x2) + 12.0 g[6] = -5.0 + (x1 / x2) g[7] = -1.9 + x4 - 1.5 * x6 g[8] = -1.9 + x5 - 1.1 * x7 g[9] = -f[1] + 1300.0 tmpVar = np.power((745.0 * x5) / (x2 * x3), 2.0) + 1.575 * 1e8 g[10] = -np.sqrt(tmpVar) / (0.1 * x7 * x7 * x7) + 1100.0 g = np.where(g < 0, -g, 0) f[2] = g[0] + g[1] + g[2] + g[3] + g[4] + g[5] + g[6] + g[7] + g[8] + g[9] + g[10] return f class RE36(): def __init__(self): self.problem_name = 'RE36' self.n_objectives = 3 self.n_variables = 4 self.n_constraints = 0 self.n_original_constraints = 1 self.lbound = np.full(self.n_variables, 12) self.ubound = np.full(self.n_variables, 60) def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) # all the four variables must be inverger values x1 = np.round(x[0]) x2 = np.round(x[1]) x3 = np.round(x[2]) x4 = np.round(x[3]) # First original objective function f[0] = np.abs(6.931 - ((x3 / x1) * (x4 / x2))) # Second original objective function (the maximum value among the four variables) l = [x1, x2, x3, x4] f[1] = max(l) g[0] = 0.5 - (f[0] / 6.931) g = np.where(g < 0, -g, 0) f[2] = g[0] return f class RE37(): def __init__(self): self.problem_name = 'RE37' self.n_objectives = 3 self.n_variables = 4 self.n_constraints = 0 self.n_original_constraints = 0 self.lbound = np.full(self.n_variables, 0) self.ubound = np.full(self.n_variables, 1) def evaluate(self, x): f = np.zeros(self.n_objectives) xAlpha = x[0] xHA = x[1] xOA = x[2] xOPTT = x[3] # f1 (TF_max) f[0] = 0.692 + (0.477 * xAlpha) - (0.687 * xHA) - (0.080 * xOA) - (0.0650 * xOPTT) - (0.167 * xAlpha * xAlpha) - (0.0129 * xHA * xAlpha) + (0.0796 * xHA * xHA) - (0.0634 * xOA * xAlpha) - (0.0257 * xOA * xHA) + (0.0877 * xOA * xOA) - (0.0521 * xOPTT * xAlpha) + (0.00156 * xOPTT * xHA) + (0.00198 * xOPTT * xOA) + (0.0184 * xOPTT * xOPTT) # f2 (X_cc) f[1] = 0.153 - (0.322 * xAlpha) + (0.396 * xHA) + (0.424 * xOA) + (0.0226 * xOPTT) + (0.175 * xAlpha * xAlpha) + (0.0185 * xHA * xAlpha) - (0.0701 * xHA * xHA) - (0.251 * xOA * xAlpha) + (0.179 * xOA * xHA) + (0.0150 * xOA * xOA) + (0.0134 * xOPTT * xAlpha) + (0.0296 * xOPTT * xHA) + (0.0752 * xOPTT * xOA) + (0.0192 * xOPTT * xOPTT) # f3 (TT_max) f[2] = 0.370 - (0.205 * xAlpha) + (0.0307 * xHA) + (0.108 * xOA) + (1.019 * xOPTT) - (0.135 * xAlpha * xAlpha) + (0.0141 * xHA * xAlpha) + (0.0998 * xHA * xHA) + (0.208 * xOA * xAlpha) - (0.0301 * xOA * xHA) - (0.226 * xOA * xOA) + (0.353 * xOPTT * xAlpha) - (0.0497 * xOPTT * xOA) - (0.423 * xOPTT * xOPTT) + (0.202 * xHA * xAlpha * xAlpha) - (0.281 * xOA * xAlpha * xAlpha) - (0.342 * xHA * xHA * xAlpha) - (0.245 * xHA * xHA * xOA) + (0.281 * xOA * xOA * xHA) - (0.184 * xOPTT * xOPTT * xAlpha) - (0.281 * xHA * xAlpha * xOA) return f class RE41(): def __init__(self): self.problem_name = 'RE41' self.n_objectives = 4 self.n_variables = 7 self.n_constraints = 0 self.n_original_constraints = 10 self.lbound = np.zeros(self.n_variables) self.ubound = np.zeros(self.n_variables) self.lbound[0] = 0.5 self.lbound[1] = 0.45 self.lbound[2] = 0.5 self.lbound[3] = 0.5 self.lbound[4] = 0.875 self.lbound[5] = 0.4 self.lbound[6] = 0.4 self.ubound[0] = 1.5 self.ubound[1] = 1.35 self.ubound[2] = 1.5 self.ubound[3] = 1.5 self.ubound[4] = 2.625 self.ubound[5] = 1.2 self.ubound[6] = 1.2 def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) x1 = x[0] x2 = x[1] x3 = x[2] x4 = x[3] x5 = x[4] x6 = x[5] x7 = x[6] # First original objective function f[0] = 1.98 + 4.9 * x1 + 6.67 * x2 + 6.98 * x3 + 4.01 * x4 + 1.78 * x5 + 0.00001 * x6 + 2.73 * x7 # Second original objective function f[1] = 4.72 - 0.5 * x4 - 0.19 * x2 * x3 # Third original objective function Vmbp = 10.58 - 0.674 * x1 * x2 - 0.67275 * x2 Vfd = 16.45 - 0.489 * x3 * x7 - 0.843 * x5 * x6 f[2] = 0.5 * (Vmbp + Vfd) # Constraint functions g[0] = 1 -(1.16 - 0.3717 * x2 * x4 - 0.0092928 * x3) g[1] = 0.32 -(0.261 - 0.0159 * x1 * x2 - 0.06486 * x1 - 0.019 * x2 * x7 + 0.0144 * x3 * x5 + 0.0154464 * x6) g[2] = 0.32 -(0.214 + 0.00817 * x5 - 0.045195 * x1 - 0.0135168 * x1 + 0.03099 * x2 * x6 - 0.018 * x2 * x7 + 0.007176 * x3 + 0.023232 * x3 - 0.00364 * x5 * x6 - 0.018 * x2 * x2) g[3] = 0.32 -(0.74 - 0.61 * x2 - 0.031296 * x3 - 0.031872 * x7 + 0.227 * x2 * x2) g[4] = 32 -(28.98 + 3.818 * x3 - 4.2 * x1 * x2 + 1.27296 * x6 - 2.68065 * x7) g[5] = 32 -(33.86 + 2.95 * x3 - 5.057 * x1 * x2 - 3.795 * x2 - 3.4431 * x7 + 1.45728) g[6] = 32 -(46.36 - 9.9 * x2 - 4.4505 * x1) g[7] = 4 - f[1] g[8] = 9.9 - Vmbp g[9] = 15.7 - Vfd g = np.where(g < 0, -g, 0) f[3] = g[0] + g[1] + g[2] + g[3] + g[4] + g[5] + g[6] + g[7] + g[8] + g[9] return f class RE42(): def __init__(self): self.problem_name = 'RE42' self.n_objectives = 4 self.n_variables = 6 self.n_constraints = 0 self.n_original_constraints = 9 self.lbound = np.zeros(self.n_variables) self.ubound = np.zeros(self.n_variables) self.lbound[0] = 150.0 self.lbound[1] = 20.0 self.lbound[2] = 13.0 self.lbound[3] = 10.0 self.lbound[4] = 14.0 self.lbound[5] = 0.63 self.ubound[0] = 274.32 self.ubound[1] = 32.31 self.ubound[2] = 25.0 self.ubound[3] = 11.71 self.ubound[4] = 18.0 self.ubound[5] = 0.75 def evaluate(self, x): f = np.zeros(self.n_objectives) # NOT g constraintFuncs = np.zeros(self.n_original_constraints) x_L = x[0] x_B = x[1] x_D = x[2] x_T = x[3] x_Vk = x[4] x_CB = x[5] displacement = 1.025 * x_L * x_B * x_T * x_CB V = 0.5144 * x_Vk g = 9.8065 Fn = V / np.power(g * x_L, 0.5) a = (4977.06 * x_CB * x_CB) - (8105.61 * x_CB) + 4456.51 b = (-10847.2 * x_CB * x_CB) + (12817.0 * x_CB) - 6960.32 power = (np.power(displacement, 2.0/3.0) * np.power(x_Vk, 3.0)) / (a + (b * Fn)) outfit_weight = 1.0 * np.power(x_L , 0.8) * np.power(x_B , 0.6) * np.power(x_D, 0.3) * np.power(x_CB, 0.1) steel_weight = 0.034 * np.power(x_L ,1.7) * np.power(x_B ,0.7) * np.power(x_D ,0.4) * np.power(x_CB ,0.5) machinery_weight = 0.17 * np.power(power, 0.9) light_ship_weight = steel_weight + outfit_weight + machinery_weight ship_cost = 1.3 * ((2000.0 * np.power(steel_weight, 0.85)) + (3500.0 * outfit_weight) + (2400.0 * np.power(power, 0.8))) capital_costs = 0.2 * ship_cost DWT = displacement - light_ship_weight running_costs = 40000.0 * np.power(DWT, 0.3) round_trip_miles = 5000.0 sea_days = (round_trip_miles / 24.0) * x_Vk handling_rate = 8000.0 daily_consumption = ((0.19 * power * 24.0) / 1000.0) + 0.2 fuel_price = 100.0 fuel_cost = 1.05 * daily_consumption * sea_days * fuel_price port_cost = 6.3 * np.power(DWT, 0.8) fuel_carried = daily_consumption * (sea_days + 5.0) miscellaneous_DWT = 2.0 * np.power(DWT, 0.5) cargo_DWT = DWT - fuel_carried - miscellaneous_DWT port_days = 2.0 * ((cargo_DWT / handling_rate) + 0.5) RTPA = 350.0 / (sea_days + port_days) voyage_costs = (fuel_cost + port_cost) * RTPA annual_costs = capital_costs + running_costs + voyage_costs annual_cargo = cargo_DWT * RTPA f[0] = annual_costs / annual_cargo f[1] = light_ship_weight # f_2 is dealt as a minimization problem f[2] = -annual_cargo # Reformulated objective functions constraintFuncs[0] = (x_L / x_B) - 6.0 constraintFuncs[1] = -(x_L / x_D) + 15.0 constraintFuncs[2] = -(x_L / x_T) + 19.0 constraintFuncs[3] = 0.45 * np.power(DWT, 0.31) - x_T constraintFuncs[4] = 0.7 * x_D + 0.7 - x_T constraintFuncs[5] = 500000.0 - DWT constraintFuncs[6] = DWT - 3000.0 constraintFuncs[7] = 0.32 - Fn KB = 0.53 * x_T BMT = ((0.085 * x_CB - 0.002) * x_B * x_B) / (x_T * x_CB) KG = 1.0 + 0.52 * x_D constraintFuncs[8] = (KB + BMT - KG) - (0.07 * x_B) constraintFuncs = np.where(constraintFuncs < 0, -constraintFuncs, 0) f[3] = constraintFuncs[0] + constraintFuncs[1] + constraintFuncs[2] + constraintFuncs[3] + constraintFuncs[4] + constraintFuncs[5] + constraintFuncs[6] + constraintFuncs[7] + constraintFuncs[8] return f class RE61(): def __init__(self): self.problem_name = 'RE61' self.n_objectives = 6 self.n_variables = 3 self.n_constraints = 0 self.n_original_constraints = 7 self.lbound = np.zeros(self.n_variables) self.ubound = np.zeros(self.n_variables) self.lbound[0] = 0.01 self.lbound[1] = 0.01 self.lbound[2] = 0.01 self.ubound[0] = 0.45 self.ubound[1] = 0.10 self.ubound[2] = 0.10 def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) # First original objective function f[0] = 106780.37 * (x[1] + x[2]) + 61704.67 #Second original objective function f[1] = 3000 * x[0] # Third original objective function f[2] = 305700 * 2289 * x[1] / np.power(0.06*2289, 0.65) # Fourth original objective function f[3] = 250 * 2289 * np.exp(-39.75*x[1]+9.9*x[2]+2.74) # Fifth original objective function f[4] = 25 * (1.39 /(x[0]*x[1]) + 4940*x[2] -80) # Constraint functions g[0] = 1 - (0.00139/(x[0]*x[1])+4.94*x[2]-0.08) g[1] = 1 - (0.000306/(x[0]*x[1])+1.082*x[2]-0.0986) g[2] = 50000 - (12.307/(x[0]*x[1]) + 49408.24*x[2]+4051.02) g[3] = 16000 - (2.098/(x[0]*x[1])+8046.33*x[2]-696.71) g[4] = 10000 - (2.138/(x[0]*x[1])+7883.39*x[2]-705.04) g[5] = 2000 - (0.417*x[0]*x[1] + 1721.26*x[2]-136.54) g[6] = 550 - (0.164/(x[0]*x[1])+631.13*x[2]-54.48) g = np.where(g < 0, -g, 0) f[5] = g[0] + g[1] + g[2] + g[3] + g[4] + g[5] + g[6] return f class RE91(): def __init__(self): self.problem_name = 'RE91' self.n_objectives = 9 self.n_variables = 7 self.n_constraints = 0 self.n_original_constraints = 0 self.lbound = np.zeros(self.n_variables) self.ubound = np.zeros(self.n_variables) self.lbound[0] = 0.5 self.lbound[1] = 0.45 self.lbound[2] = 0.5 self.lbound[3] = 0.5 self.lbound[4] = 0.875 self.lbound[5] = 0.4 self.lbound[6] = 0.4 self.ubound[0] = 1.5 self.ubound[1] = 1.35 self.ubound[2] = 1.5 self.ubound[3] = 1.5 self.ubound[4] = 2.625 self.ubound[5] = 1.2 self.ubound[6] = 1.2 def evaluate(self, x): f = np.zeros(self.n_objectives) g = np.zeros(self.n_original_constraints) x1 = x[0] x2 = x[1] x3 = x[2] x4 = x[3] x5 = x[4] x6 = x[5] x7 = x[6] # stochastic variables x8 = 0.006 * (np.random.normal(0, 1)) + 0.345 x9 = 0.006 * (np.random.normal(0, 1)) + 0.192 x10 = 10 * (np.random.normal(0, 1)) + 0.0 x11 = 10 * (np.random.normal(0, 1)) + 0.0 # First function f[0] = 1.98 + 4.9 * x1 + 6.67 * x2 + 6.98 * x3 + 4.01 * x4 + 1.75 * x5 + 0.00001 * x6 + 2.73 * x7 # Second function f[1] = max(0.0, (1.16 - 0.3717* x2 * x4 - 0.00931 * x2 * x10 - 0.484 * x3 * x9 + 0.01343 * x6 * x10 )/1.0) # Third function f[2] = max(0.0, (0.261 - 0.0159 * x1 * x2 - 0.188 * x1 * x8 - 0.019 * x2 * x7 + 0.0144 * x3 * x5 + 0.87570001 * x5 * x10 + 0.08045 * x6 * x9 + 0.00139 * x8 * x11 + 0.00001575 * x10 * x11)/0.32) # Fourth function f[3] = max(0.0, (0.214 + 0.00817 * x5 - 0.131 * x1 * x8 - 0.0704 * x1 * x9 + 0.03099 * x2 * x6 - 0.018 * x2 * x7 + 0.0208 * x3 * x8 + 0.121 * x3 * x9 - 0.00364 * x5 * x6 + 0.0007715 * x5 * x10 - 0.0005354 * x6 * x10 + 0.00121 * x8 * x11 + 0.00184 * x9 * x10 - 0.018 * x2 * x2)/0.32) # Fifth function f[4] = max(0.0, (0.74 - 0.61* x2 - 0.163 * x3 * x8 + 0.001232 * x3 * x10 - 0.166 * x7 * x9 + 0.227 * x2 * x2)/0.32) # Sixth function tmp = (( 28.98 + 3.818 * x3 - 4.2 * x1 * x2 + 0.0207 * x5 * x10 + 6.63 * x6 * x9 - 7.77 * x7 * x8 + 0.32 * x9 * x10) + (33.86 + 2.95 * x3 + 0.1792 * x10 - 5.057 * x1 * x2 - 11 * x2 * x8 - 0.0215 * x5 * x10 - 9.98 * x7 * x8 + 22 * x8 * x9) + (46.36 - 9.9 * x2 - 12.9 * x1 * x8 + 0.1107 * x3 * x10) )/3 f[5] = max(0.0, tmp/32) # Seventh function f[6] = max(0.0, (4.72 - 0.5 * x4 - 0.19 * x2 * x3 - 0.0122 * x4 * x10 + 0.009325 * x6 * x10 + 0.000191 * x11 * x11)/4.0) # EighthEighth function f[7] = max(0.0, (10.58 - 0.674 * x1 * x2 - 1.95 * x2 * x8 + 0.02054 * x3 * x10 - 0.0198 * x4 * x10 + 0.028 * x6 * x10)/9.9) # Ninth function f[8] = max(0.0, (16.45 - 0.489 * x3 * x7 - 0.843 * x5 * x6 + 0.0432 * x9 * x10 - 0.0556 * x9 * x11 - 0.000786 * x11 * x11)/15.7) return f class CRE21(ElementwiseProblem): def __init__(self): self.problem_name = 'CRE21' self.n_objectives = 2 self.n_variables = 3 self.n_constraints = 3 self.ubound = np.zeros(self.n_variables) self.lbound = np.zeros(self.n_variables) self.lbound[0] = 0.00001 self.lbound[1] = 0.00001 self.lbound[2] = 1.0 self.ubound[0] = 100.0 self.ubound[1] = 100.0 self.ubound[2] = 3.0 super().__init__(n_var=self.n_variables, n_obj=self.n_objectives, n_constr=self.n_constraints, xl=self.lbound, xu=self.ubound) def _evaluate(self, x, out, *args, **kwargs): f = np.zeros(self.n_objectives) g = np.zeros(self.n_constraints) x1 = x[0] x2 = x[1] x3 = x[2] # First original objective function f[0] = x1 * np.sqrt(16.0 + (x3 * x3)) + x2 * np.sqrt(1.0 + x3 * x3) # Second original objective function f[1] = (20.0 * np.sqrt(16.0 + (x3 * x3))) / (x1 * x3) # Constraint functions g[0] = 0.1 - f[0] g[1] = 100000.0 - f[1] g[2] = 100000 - ((80.0 * np.sqrt(1.0 + x3 * x3)) / (x3 * x2)) g = np.where(g < 0, -g, 0) out["F"] = f out["G"] = g return f, g class CRE22(ElementwiseProblem): def __init__(self): self.problem_name = 'CRE22' self.n_objectives = 2 self.n_variables = 4 self.n_constraints = 4 self.ubound = np.zeros(self.n_variables) self.lbound = np.zeros(self.n_variables) self.lbound[0] = 0.125 self.lbound[1] = 0.1 self.lbound[2] = 0.1 self.lbound[3] = 0.125 self.ubound[0] = 5.0 self.ubound[1] = 10.0 self.ubound[2] = 10.0 self.ubound[3] = 5.0 super().__init__(n_var=self.n_variables, n_obj=self.n_objectives, n_constr=self.n_constraints, xl=self.lbound, xu=self.ubound) def _evaluate(self, x, out, *args, **kwargs): f = np.zeros(self.n_objectives) g = np.zeros(self.n_constraints) x1 = x[0] x2 = x[1] x3 = x[2] x4 = x[3] P = 6000 L = 14 E = 30 * 1e6 # // deltaMax = 0.25 G = 12 * 1e6 tauMax = 13600 sigmaMax = 30000 # First original objective function f[0] = (1.10471 * x1 * x1 * x2) + (0.04811 * x3 * x4) * (14.0 + x2) # Second original objective function f[1] = (4 * P * L * L * L) / (E * x4 * x3 * x3 * x3) # Constraint functions M = P * (L + (x2 / 2)) tmpVar = ((x2 * x2) / 4.0) + np.power((x1 + x3) / 2.0, 2) R = np.sqrt(tmpVar) tmpVar = ((x2 * x2) / 12.0) + np.power((x1 + x3) / 2.0, 2) J = 2 * np.sqrt(2) * x1 * x2 * tmpVar tauDashDash = (M * R) / J tauDash = P / (np.sqrt(2) * x1 * x2) tmpVar = tauDash * tauDash + ((2 * tauDash * tauDashDash * x2) / (2 * R)) + (tauDashDash * tauDashDash) tau = np.sqrt(tmpVar) sigma = (6 * P * L) / (x4 * x3 * x3) tmpVar = 4.013 * E * np.sqrt((x3 * x3 * x4 * x4 * x4 * x4 * x4 * x4) / 36.0) / (L * L) tmpVar2 = (x3 / (2 * L)) * np.sqrt(E / (4 * G)) PC = tmpVar * (1 - tmpVar2) g[0] = tauMax - tau g[1] = sigmaMax - sigma g[2] = x4 - x1 g[3] = PC - P g = np.where(g < 0, -g, 0) out["F"] = f out["G"] = g return f, g class CRE23(ElementwiseProblem): def __init__(self): self.problem_name = 'CRE23' self.n_objectives = 2 self.n_variables = 4 self.n_constraints = 4 self.ubound = np.zeros(self.n_variables) self.lbound = np.zeros(self.n_variables) self.lbound[0] = 55 self.lbound[1] = 75 self.lbound[2] = 1000 self.lbound[3] = 11 self.ubound[0] = 80 self.ubound[1] = 110 self.ubound[2] = 3000 self.ubound[3] = 20 super().__init__(n_var=self.n_variables, n_obj=self.n_objectives, n_constr=self.n_constraints, xl=self.lbound, xu=self.ubound) def _evaluate(self, x, out, *args, **kwargs): f = np.zeros(self.n_objectives) g = np.zeros(self.n_constraints) x1 = x[0] x2 = x[1] x3 = x[2] x4 = x[3] # First original objective function f[0] = 4.9 * 1e-5 * (x2 * x2 - x1 * x1) * (x4 - 1.0) # Second original objective function f[1] = ((9.82 * 1e6) * (x2 * x2 - x1 * x1)) / (x3 * x4 * (x2 * x2 * x2 - x1 * x1 * x1)) # Reformulated objective functions g[0] = (x2 - x1) - 20.0 g[1] = 0.4 - (x3 / (3.14 * (x2 * x2 - x1 * x1))) g[2] = 1.0 - (2.22 * 1e-3 * x3 * (x2 * x2 * x2 - x1 * x1 * x1)) / np.power((x2 * x2 - x1 * x1), 2) g[3] = (2.66 * 1e-2 * x3 * x4 * (x2 * x2 * x2 - x1 * x1 * x1)) / (x2 * x2 - x1 * x1) - 900.0 g = np.where(g < 0, -g, 0) out["F"] = f out["G"] = g return f, g class CRE24(ElementwiseProblem): def __init__(self): self.problem_name = 'CRE24' self.n_objectives = 2 self.n_variables = 7 self.n_constraints = 11 self.lbound = np.zeros(self.n_variables) self.ubound = np.zeros(self.n_variables) self.lbound[0] = 2.6 self.lbound[1] = 0.7 self.lbound[2] = 17 self.lbound[3] = 7.3 self.lbound[4] = 7.3 self.lbound[5] = 2.9 self.lbound[6] = 5.0 self.ubound[0] = 3.6 self.ubound[1] = 0.8 self.ubound[2] = 28 self.ubound[3] = 8.3 self.ubound[4] = 8.3 self.ubound[5] = 3.9 self.ubound[6] = 5.5 super().__init__(n_var=self.n_variables, n_obj=self.n_objectives, n_constr=self.n_constraints, xl=self.lbound, xu=self.ubound) def _evaluate(self, x, out, *args, **kwargs): f = np.zeros(self.n_objectives) g = np.zeros(self.n_constraints) x1 = x[0] x2 = x[1] x3 = np.round(x[2]) x4 = x[3] x5 = x[4] x6 = x[5] x7 = x[6] # First original objective function (weight) f[0] = 0.7854 * x1 * (x2 * x2) * (((10.0 * x3 * x3) / 3.0) + (14.933 * x3) - 43.0934) - 1.508 * x1 * (x6 * x6 + x7 * x7) + 7.477 * (x6 * x6 * x6 + x7 * x7 * x7) + 0.7854 * (x4 * x6 * x6 + x5 * x7 * x7) # Second original objective function (stress) tmpVar = np.power((745.0 * x4) / (x2 * x3), 2.0) + 1.69 * 1e7 f[1] = np.sqrt(tmpVar) / (0.1 * x6 * x6 * x6) # Constraint functions g[0] = -(1.0 / (x1 * x2 * x2 * x3)) + 1.0 / 27.0 g[1] = -(1.0 / (x1 * x2 * x2 * x3 * x3)) + 1.0 / 397.5 g[2] = -(x4 * x4 * x4) / (x2 * x3 * x6 * x6 * x6 * x6) + 1.0 / 1.93 g[3] = -(x5 * x5 * x5) / (x2 * x3 * x7 * x7 * x7 * x7) + 1.0 / 1.93 g[4] = -(x2 * x3) + 40.0 g[5] = -(x1 / x2) + 12.0 g[6] = -5.0 + (x1 / x2) g[7] = -1.9 + x4 - 1.5 * x6 g[8] = -1.9 + x5 - 1.1 * x7 g[9] = -f[1] + 1300.0 tmpVar = np.power((745.0 * x5) / (x2 * x3), 2.0) + 1.575 * 1e8 g[10] = -np.sqrt(tmpVar) / (0.1 * x7 * x7 * x7) + 1100.0 g = np.where(g < 0, -g, 0) out["F"] = f out["G"] = g return f, g class CRE25(ElementwiseProblem): def __init__(self): self.problem_name = 'CRE25' self.n_objectives = 2 self.n_variables = 4 self.n_constraints = 1 self.lbound = np.full(self.n_variables, 12) self.ubound = np.full(self.n_variables, 60) super().__init__(n_var=self.n_variables, n_obj=self.n_objectives, n_constr=self.n_constraints, xl=self.lbound, xu=self.ubound) def _evaluate(self, x, out, *args, **kwargs): f = np.zeros(self.n_objectives) g = np.zeros(self.n_constraints) # all the four variables must be inverger values x1 = np.round(x[0]) x2 = np.round(x[1]) x3 = np.round(x[2]) x4 = np.round(x[3]) # First original objective function f[0] = np.abs(6.931 - ((x3 / x1) * (x4 / x2))) # Second original objective function (the maximum value among the four variables) l = [x1, x2, x3, x4] f[1] = max(l) g[0] = 0.5 - (f[0] / 6.931) g = np.where(g < 0, -g, 0) out["F"] = f out["G"] = g return f, g class CRE31(ElementwiseProblem): def __init__(self): self.problem_name = 'CRE31' self.n_objectives = 3 self.n_variables = 7 self.n_constraints = 10 self.lbound = np.zeros(self.n_variables) self.ubound = np.zeros(self.n_variables) self.lbound[0] = 0.5 self.lbound[1] = 0.45 self.lbound[2] = 0.5 self.lbound[3] = 0.5 self.lbound[4] = 0.875 self.lbound[5] = 0.4 self.lbound[6] = 0.4 self.ubound[0] = 1.5 self.ubound[1] = 1.35 self.ubound[2] = 1.5 self.ubound[3] = 1.5 self.ubound[4] = 2.625 self.ubound[5] = 1.2 self.ubound[6] = 1.2 super().__init__(n_var=self.n_variables, n_obj=self.n_objectives, n_constr=self.n_constraints, xl=self.lbound, xu=self.ubound) def _evaluate(self, x, out, *args, **kwargs): f = np.zeros(self.n_objectives) g = np.zeros(self.n_constraints) x1 = x[0] x2 = x[1] x3 = x[2] x4 = x[3] x5 = x[4] x6 = x[5] x7 = x[6] # First original objective function f[0] = 1.98 + 4.9 * x1 + 6.67 * x2 + 6.98 * x3 + 4.01 * x4 + 1.78 * x5 + 0.00001 * x6 + 2.73 * x7 # Second original objective function f[1] = 4.72 - 0.5 * x4 - 0.19 * x2 * x3 # Third original objective function Vmbp = 10.58 - 0.674 * x1 * x2 - 0.67275 * x2 Vfd = 16.45 - 0.489 * x3 * x7 - 0.843 * x5 * x6 f[2] = 0.5 * (Vmbp + Vfd) # Constraint functions g[0] = 1 -(1.16 - 0.3717 * x2 * x4 - 0.0092928 * x3) g[1] = 0.32 -(0.261 - 0.0159 * x1 * x2 - 0.06486 * x1 - 0.019 * x2 * x7 + 0.0144 * x3 * x5 + 0.0154464 * x6) g[2] = 0.32 -(0.214 + 0.00817 * x5 - 0.045195 * x1 - 0.0135168 * x1 + 0.03099 * x2 * x6 - 0.018 * x2 * x7 + 0.007176 * x3 + 0.023232 * x3 - 0.00364 * x5 * x6 - 0.018 * x2 * x2) g[3] = 0.32 -(0.74 - 0.61 * x2 - 0.031296 * x3 - 0.031872 * x7 + 0.227 * x2 * x2) g[4] = 32 -(28.98 + 3.818 * x3 - 4.2 * x1 * x2 + 1.27296 * x6 - 2.68065 * x7) g[5] = 32 -(33.86 + 2.95 * x3 - 5.057 * x1 * x2 - 3.795 * x2 - 3.4431 * x7 + 1.45728) g[6] = 32 -(46.36 - 9.9 * x2 - 4.4505 * x1) g[7] = 4 - f[1] g[8] = 9.9 - Vmbp g[9] = 15.7 - Vfd g = np.where(g < 0, -g, 0) out["F"] = f out["G"] = g return f, g class CRE32(ElementwiseProblem): def __init__(self): self.problem_name = 'CRE32' self.n_objectives = 3 self.n_variables = 6 self.n_constraints = 9 self.lbound = np.zeros(self.n_variables) self.ubound = np.zeros(self.n_variables) self.lbound[0] = 150.0 self.lbound[1] = 20.0 self.lbound[2] = 13.0 self.lbound[3] = 10.0 self.lbound[4] = 14.0 self.lbound[5] = 0.63 self.ubound[0] = 274.32 self.ubound[1] = 32.31 self.ubound[2] = 25.0 self.ubound[3] = 11.71 self.ubound[4] = 18.0 self.ubound[5] = 0.75 super().__init__(n_var=self.n_variables, n_obj=self.n_objectives, n_constr=self.n_constraints, xl=self.lbound, xu=self.ubound) def _evaluate(self, x, out, *args, **kwargs): f = np.zeros(self.n_objectives) # NOT g constraintFuncs = np.zeros(self.n_constraints) x_L = x[0] x_B = x[1] x_D = x[2] x_T = x[3] x_Vk = x[4] x_CB = x[5] displacement = 1.025 * x_L * x_B * x_T * x_CB V = 0.5144 * x_Vk g = 9.8065 Fn = V / np.power(g * x_L, 0.5) a = (4977.06 * x_CB * x_CB) - (8105.61 * x_CB) + 4456.51 b = (-10847.2 * x_CB * x_CB) + (12817.0 * x_CB) - 6960.32 power = (np.power(displacement, 2.0/3.0) * np.power(x_Vk, 3.0)) / (a + (b * Fn)) outfit_weight = 1.0 * np.power(x_L , 0.8) * np.power(x_B , 0.6) * np.power(x_D, 0.3) * np.power(x_CB, 0.1) steel_weight = 0.034 * np.power(x_L ,1.7) * np.power(x_B ,0.7) * np.power(x_D ,0.4) * np.power(x_CB ,0.5) machinery_weight = 0.17 * np.power(power, 0.9) light_ship_weight = steel_weight + outfit_weight + machinery_weight ship_cost = 1.3 * ((2000.0 * np.power(steel_weight, 0.85)) + (3500.0 * outfit_weight) + (2400.0 * np.power(power, 0.8))) capital_costs = 0.2 * ship_cost DWT = displacement - light_ship_weight running_costs = 40000.0 * np.power(DWT, 0.3) round_trip_miles = 5000.0 sea_days = (round_trip_miles / 24.0) * x_Vk handling_rate = 8000.0 daily_consumption = ((0.19 * power * 24.0) / 1000.0) + 0.2 fuel_price = 100.0 fuel_cost = 1.05 * daily_consumption * sea_days * fuel_price port_cost = 6.3 * np.power(DWT, 0.8) fuel_carried = daily_consumption * (sea_days + 5.0) miscellaneous_DWT = 2.0 * np.power(DWT, 0.5) cargo_DWT = DWT - fuel_carried - miscellaneous_DWT port_days = 2.0 * ((cargo_DWT / handling_rate) + 0.5) RTPA = 350.0 / (sea_days + port_days) voyage_costs = (fuel_cost + port_cost) * RTPA annual_costs = capital_costs + running_costs + voyage_costs annual_cargo = cargo_DWT * RTPA f[0] = annual_costs / annual_cargo f[1] = light_ship_weight # f_2 is dealt as a minimization problem f[2] = -annual_cargo # Reformulated objective functions constraintFuncs[0] = (x_L / x_B) - 6.0 constraintFuncs[1] = -(x_L / x_D) + 15.0 constraintFuncs[2] = -(x_L / x_T) + 19.0 constraintFuncs[3] = 0.45 * np.power(DWT, 0.31) - x_T constraintFuncs[4] = 0.7 * x_D + 0.7 - x_T constraintFuncs[5] = 500000.0 - DWT constraintFuncs[6] = DWT - 3000.0 constraintFuncs[7] = 0.32 - Fn KB = 0.53 * x_T BMT = ((0.085 * x_CB - 0.002) * x_B * x_B) / (x_T * x_CB) KG = 1.0 + 0.52 * x_D constraintFuncs[8] = (KB + BMT - KG) - (0.07 * x_B) constraintFuncs = np.where(constraintFuncs < 0, -constraintFuncs, 0) out["F"] = f out["G"] = g return f, constraintFuncs class CRE51(ElementwiseProblem): def __init__(self): self.problem_name = 'CRE51' self.n_objectives = 5 self.n_variables = 3 self.n_constraints = 7 self.lbound = np.zeros(self.n_variables) self.ubound = np.zeros(self.n_variables) self.lbound[0] = 0.01 self.lbound[1] = 0.01 self.lbound[2] = 0.01 self.ubound[0] = 0.45 self.ubound[1] = 0.10 self.ubound[2] = 0.10 super().__init__(n_var=self.n_variables, n_obj=self.n_objectives, n_constr=self.n_constraints, xl=self.lbound, xu=self.ubound) def _evaluate(self, x, out, *args, **kwargs): f = np.zeros(self.n_objectives) g = np.zeros(self.n_constraints) # First original objective function f[0] = 106780.37 * (x[1] + x[2]) + 61704.67 #Second original objective function f[1] = 3000 * x[0] # Third original objective function f[2] = 305700 * 2289 * x[1] / np.power(0.06*2289, 0.65) # Fourth original objective function f[3] = 250 * 2289 * np.exp(-39.75*x[1]+9.9*x[2]+2.74) # Fifth original objective function f[4] = 25 * (1.39 /(x[0]*x[1]) + 4940*x[2] -80) # Constraint functions g[0] = 1 - (0.00139/(x[0]*x[1])+4.94*x[2]-0.08) g[1] = 1 - (0.000306/(x[0]*x[1])+1.082*x[2]-0.0986) g[2] = 50000 - (12.307/(x[0]*x[1]) + 49408.24*x[2]+4051.02) g[3] = 16000 - (2.098/(x[0]*x[1])+8046.33*x[2]-696.71) g[4] = 10000 - (2.138/(x[0]*x[1])+7883.39*x[2]-705.04) g[5] = 2000 - (0.417*x[0]*x[1] + 1721.26*x[2]-136.54) g[6] = 550 - (0.164/(x[0]*x[1])+631.13*x[2]-54.48) g = np.where(g < 0, -g, 0) out["F"] = f out["G"] = g return f, g if __name__ == '__main__': np.random.seed(seed=1) fun = RE21() x = fun.lbound + (fun.ubound - fun.lbound) * np.random.rand(fun.n_variables) print("Problem = {}".format(fun.problem_name)) print("Number of objectives = {}".format(fun.n_objectives)) print("Number of variables = {}".format(fun.n_variables)) print("Number of constraints = {}".format(fun.n_constraints)) print("Lower bounds = ", fun.lbound) print("Upper bounds = ", fun.ubound) print("x = ", x) if 'CRE' in fun.problem_name: f, g = fun.evaluate(x) print("f(x) = {}".format(f)) print("g(x) = {}".format(g)) else: f = fun.evaluate(x) print("f(x) = {}".format(f))