Source code for smt_optim.benchmarks.gotestproblems.constrained

"""
Reference: https://www-optima.amp.i.kyoto-u.ac.jp/member/student/hedar/Hedar_files/TestGO_files/Page422.htm
"""


import numpy as np
from smt_optim.benchmarks.base import BenchmarkProblem

[docs] class G01(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G01" self.num_dim: int = 13 self.num_obj = 1 self.num_cstr = 9 self.num_fidelity = 1 self.bounds = np.array([ [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 100], [0, 100], [0, 100], [0, 1], ]) self.tags = [ "GOTestProblems", ] self.constraints = [ self.g1, self.g2, self.g3, self.g4, self.g5, self.g6, self.g7, self.g8, self.g9, ] # x* = (1,1,...,1,3,3,3,1), f(x*) = -15
[docs] def objective(self, x): x1 = x[0:5] x2 = x[4:14] return 5 * np.sum(x1) - 5 * np.sum(x1 ** 2) - np.sum(x2)
[docs] def g1(self, x): return 2 * x[0] + 2 * x[1] + x[9] + x[10] - 10
[docs] def g2(self, x): return 2 * x[0] + 2 * x[2] + x[9] + x[11] - 10
[docs] def g3(self, x): return 2 * x[1] + 2 * x[2] + x[10] + x[11] - 10
[docs] def g4(self, x): return -8 * x[0] + x[9]
[docs] def g5(self, x): return -8 * x[1] + x[10]
[docs] def g6(self, x): return -8 * x[2] + x[11]
[docs] def g7(self, x): return -2 * x[3] - x[4] + x[9]
[docs] def g8(self, x): return -2 * x[5] - x[6] + x[10]
[docs] def g9(self, x): return -2 * x[7] - x[8] + x[11]
[docs] class G02(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G02" self.num_dim: int | str = 20 self.num_obj = 1 self.num_cstr = 2 self.num_fidelity = 1 self.bounds = np.array([ [0, 10], ] * self.num_dim) self.tags = [ "GOTestProblems", "n_variable", ] self.constraints = [ self.g1, self.g2, ] # n = 20, f(x*) = 0.803619. Have not found this solution yet # x_star = np.array([3.162460616, 3.128331428, 3.094792129, 3.061451495, 3.027929159,2.993826067, # 2.958668718, 2.921842273, 0.494825115, 0.488357110,0.482316427, 0.476645751, 0.471295508, 0.466230993, # 0.461420050,0.456836648, 0.452458769, 0.448267622, 0.444247010, 0.440382860])
[docs] def objective(self, x): cos_x = np.cos(x) sum_jx = np.sum(np.linspace(1, self.num_dim, self.num_dim) * x ** 2) return -np.abs((np.sum(cos_x ** 4) - 2 * np.prod(cos_x ** 2)) / np.sqrt(sum_jx))
[docs] def g1(self, x): return -np.prod(x) + 0.75
[docs] def g2(self, x): return np.sum(x) - 7.5 * self.num_dim
[docs] class G03(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G03" self.num_dim: int | str = 2 self.num_obj = 1 self.num_cstr = 1 self.num_fidelity = 1 self.cstr_types = ["eq"] self.bounds = np.array([ [0, 1], ] * self.num_dim) self.tags = [ "GOTestProblems", "n_variable", ] self.constraints = [ self.h1, # equality constraint ] # x* = (1/n^0.5, …, 1/n^0.5), f(x*) = 1
[docs] def objective(self, x): cst = np.sqrt(self.num_dim) ** self.num_dim return -cst * np.prod(x)
[docs] def h1(self, x): return np.sum(x ** 2) - 1
[docs] class G04(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G04" self.num_dim: int = 5 self.num_obj = 1 self.num_cstr = 6 self.num_fidelity = 1 self.bounds = np.array([ [78, 102], [33, 45], [27, 45], [27, 45], [27, 45], ]) self.tags = [ "GOTestProblems", ] self.constraints = [ self.g1, self.g2, self.g3, self.g4, self.g5, self.g6, ] # x* = (78,33,29.995,45,36.7758), f(x*) = -30665.539
[docs] def objective(self, x): return 5.3578547*x[2]**2 + 0.8356891*x[0]*x[4] + 37.293239*x[0] - 40792.141
[docs] def u(self, x): return 85.334407 + 0.0056858 * x[1] * x[4] + 0.0006262 * x[0] * x[3] - 0.0022053 * x[2] * x[4]
[docs] def v(self, x): return 80.51249 + 0.0071317 * x[1] * x[4] + 0.0029955 * x[0] * x[1] + 0.0021813 * x[2] ** 2
[docs] def w(self, x): return 9.300961 + 0.0047026 * x[2] * x[4] + 0.0012547 * x[0] * x[2] + 0.0019085 * x[2] * x[3]
[docs] def g1(self, x): return -self.u(x)
[docs] def g2(self, x): return self.u(x) - 92
[docs] def g3(self, x): return -self.v(x) + 90
[docs] def g4(self, x): return self.v(x) - 110
[docs] def g5(self, x): return -self.w(x) + 20
[docs] def g6(self, x): return self.w(x) - 25
[docs] class G05(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G05" self.num_dim: int = 4 self.num_obj = 1 self.num_cstr = 5 self.num_fidelity = 1 self.cstr_types = [ "ineq", "ineq", "eq", "eq", "eq", ] self.bounds = np.array([ [0, 1200], [0, 1200], [-0.55, 0.55], [-0.55, 0.55], ]) self.tags = [ "GOTestProblems", ] self.constraints = [ self.g1, self.g2, self.h1, self.h2, self.h3, ] # x* = (679.9453,1026,0.118876,-0.3962336), f(x*) = 5126.4981
[docs] def objective(self, x): return 3*x[0] + 1e-6*x[0]**3 + 2*x[1] + 2e-6/3*x[1]**3
[docs] def g1(self, x): return x[2]-x[3] - 0.55
[docs] def g2(self, x): return x[3] - x[2] - 0.55
[docs] def h1(self, x): return np.abs(1000*(np.sin(-x[2] - 0.25) + np.sin(-x[3] - 0.25)) + 894.8 - x[0])
[docs] def h2(self, x): return np.abs(1000 * (np.sin(x[2] - 0.25) + np.sin(x[2] - x[3] - 0.25)) + 894.8 - x[1])
[docs] def h3(self, x): return np.abs(1000*(np.sin(x[3] - 0.25) + np.sin(x[3] - x[2] - 0.25)) + 1294.8)
[docs] class G06(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G06" self.num_dim: int = 2 self.num_obj = 1 self.num_cstr = 2 self.num_fidelity = 1 self.bounds = np.array([ [13, 100], [0, 100], ]) self.tags = [ "GOTestProblems", ] self.constraints = [ self.g1, self.g2, ] # x* = (14.095,0.84296), f(x*) = -6961.81388
[docs] def objective(self, x): return (x[0] - 10)**3 + (x[1] - 20)**3
[docs] def g1(self, x): return -(x[0] - 5)**2 - (x[1] - 5)**2 + 100
[docs] def g2(self, x): return (x[0] - 6)**2 + (x[1] - 5)**2 - 82.81
[docs] class G07(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G07" self.num_dim: int = 10 self.num_obj = 1 self.num_cstr = 8 self.num_fidelity = 1 self.bounds = np.array([ [-10, 10], ] * self.num_dim) self.tags = [ "GOTestProblems", ] self.constraints = [ self.g1, self.g2, self.g3, self.g4, self.g5, self.g6, self.g7, self.g8, ] # x*=(2.171996, 2.363683, 8.773926, 5.095984, 0.9906548, 1.430574,1.321644, 9.828726, 8.280092, 8.375927), # f(x*) = 24.3062091
[docs] def objective(self, x): return x[0]**2+x[1]**2+x[0]*x[1]-14*x[0]-16*x[1]+(x[2]-10)**2 + 4*(x[3]-5)**2+(x[4]-3)**2+2*(x[5]-1)**2+5*x[6]**2 + 7*(x[7]-11)**2+2*(x[8]-10)**2+(x[9]-7)**2+45
[docs] def g1(self, x): return 4*x[0]+5*x[1]-3*x[6]+9*x[7]-105
[docs] def g2(self, x): return 10*x[0]-8*x[1]-17*x[6]+2*x[7]
[docs] def g3(self, x): return -8 * x[0] + 2 * x[1] + 5 * x[8] - 2 * x[9] - 12
[docs] def g4(self, x): return 3*(x[0]-2)**2+4*(x[1]-3)**2+2*x[2]**2-7*x[3]-120
[docs] def g5(self, x): return 5*x[0]**2+8*x[1]+(x[2]-6)**2-2*x[3]-40
[docs] def g6(self, x): return 0.5*(x[0]-8)**2+2*(x[1]-4)**2+3*x[4]**2-x[5]-30
[docs] def g7(self, x): return x[0]**2+2*(x[1]-2)**2-2*x[0]*x[1]+14*x[4]-6*x[5]
[docs] def g8(self, x): return -3*x[0]+6*x[1]+12*(x[8]-8)**2-7*x[9]
[docs] class G08(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G08" self.num_dim: int = 2 self.num_obj = 1 self.num_cstr = 2 self.num_fidelity = 1 self.bounds = np.array([ [0, 10], ] * self.num_dim) self.tags = [ "GOTestProblems", ] self.constraints = [ self.g1, self.g2, ] # x* = (1.2279713, 4.2453733) , f (x*) = 0.095825
[docs] def objective(self, x): return -(np.sin(2*np.pi*x[0])**3 * np.sin(2*np.pi*x[1]))/(x[0]**3 * (x[0] + x[1]))
[docs] def g1(self, x): return x[0]**2 - x[1] + 1
[docs] def g2(self, x): return 1 - x[0] + (x[1] - 4)**2
[docs] class G09(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G09" self.num_dim: int = 7 self.num_obj = 1 self.num_cstr = 4 self.num_fidelity = 1 self.bounds = np.array([ [-10, 10], ] * self.num_dim) self.tags = [ "GOTestProblems", ] self.constraints = [ self.g1, self.g2, self.g3, self.g4, ] # x* = (2.330499, 1.951372,−0.4775414, 4.365726,−0.6244870, 1.038131,1.594227), f (x*) = 680.6300573
[docs] def objective(self, x): return (x[0]-10)**2+5*(x[1]-12)**2+x[2]**4+3*(x[3]-11)**2 + 10*x[4]**6+7*x[5]**2+x[6]**4-4*x[5]*x[6]-10*x[5]-8*x[6]
[docs] def v1(self, x): return 2*x[0]**2
[docs] def v2(self, x): return x[1]**2
[docs] def g1(self, x): return self.v1(x)+3*self.v2(x)**2+x[2]+4*x[3]**2+5*x[4]-127
[docs] def g2(self, x): return 7*x[0]+3*x[1]+10*x[2]**2+x[3]-x[4]-282
[docs] def g3(self, x): return 23*x[0]+self.v2(x)+6*x[5]**2-8*x[6]-196
[docs] def g4(self, x): return 2*self.v1(x)+self.v2(x)-3*x[0]*x[1]+2*x[2]**2+5*x[5]-11*x[6]
[docs] class G10(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G10" self.num_dim: int = 8 self.num_obj = 1 self.num_cstr = 6 self.num_fidelity = 1 self.bounds = np.array([ [100, 10_000], [1_000, 10_000], [1_000, 10_000], [10, 1000], [10, 1000], [10, 1000], [10, 1000], [10, 1000], ]) self.tags = [ "GOTestProblems", ] self.constraints = [ self.g1, self.g2, self.g3, self.g4, self.g5, self.g6, ] # x* = (579.3167, 1359.943, 5110.071, 182.0174, 295.5985, 217.9799, 286.4162,395.5979), f (x*) = 7049.3307
[docs] def objective(self, x): return x[0]+x[1]+x[2]
[docs] def g1(self, x): return -1+0.0025*(x[3]+x[5])
[docs] def g2(self, x): return -1+0.0025*(-x[3]+x[4]+x[6])
[docs] def g3(self, x): return -1+0.01*(-x[4]+x[7])
[docs] def g4(self, x): return 100*x[0]-x[0]*x[5]+833.33252*x[3]-83333.333
[docs] def g5(self, x): return x[1]*x[3]-x[1]*x[6]-1250*x[3]+1250*x[4]
[docs] def g6(self, x): return x[2]*x[4]-x[2]*x[7]-2500*x[4]+1250000
[docs] class G11(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G11" self.num_dim: int = 2 self.num_obj = 1 self.num_cstr = 1 self.num_fidelity = 1 self.cstr_types = ["eq"] self.bounds = np.array([ [-1, 1], ] * self.num_dim) self.tags = [ "GOTestProblems", ] self.constraints = [ self.h1, ] # x* = ±(1/(2^0.5), 1/2), f(x*) = 0.75
[docs] def objective(self, x): return x[0]**2 + (x[1] - 1)**2
[docs] def h1(self, x): return x[1] - x[0]**2
[docs] class G12(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G12" self.num_dim: int = 3 self.num_obj = 1 self.num_cstr = 1 self.num_fidelity = 1 self.bounds = np.array([ [0, 10], ] * self.num_dim) self.tags = [ "GOTestProblems", ] self.constraints = [ self.g1, ] # x* = (5, 5, 5), f(x*) = 1
[docs] def objective(self, x): return -(1 - 0.01*((x[0] - 5)**2 + (x[1] - 5)**2 + (x[2] - 5)**2))
[docs] def g1(self, x): z = np.empty((9, 9, 9)) for i in range(9): for j in range(9): for k in range(9): p = i+1 q = j+1 r = k+1 z[i, j, k] = (x[0]-p)**2 + (x[1]-q)**2 + (x[2]-r)**2 - 0.0625 return np.min(z)
[docs] class G13(BenchmarkProblem): def __init__(self): super().__init__() self.name = "G13" self.num_dim: int = 5 self.num_obj = 1 self.num_cstr = 3 self.num_fidelity = 1 self.cstr_types = [ "eq", "eq", "eq", ] self.bounds = np.array([ [-2.3, 2.3], [-2.3, 2.3], [-3.2, 3.2], [-3.2, 3.2], [-3.2, 3.2], ]) self.tags = [ "GOTestProblems", ] self.constraints = [ self.h1, self.h2, self.h3, ] # x* = (−1.717143, 1.595709, 1.827247, −0.7636413, −0.763645), f (x*) = 0.0539498
[docs] def objective(self, x): return np.exp(np.prod(x))
[docs] def h1(self, x): return np.sum(x**2) - 10
[docs] def h2(self, x): return x[1]*x[2] - 5*x[3]*x[4]
[docs] def h3(self, x): return x[0]**3 + x[1]**3 + 1
[docs] class WeldedBeamDesign(BenchmarkProblem): def __init__(self): super().__init__() # TODO: review implementation (different sources = different results) self.name = "WeldedBeamDesign" self.num_dim: int = 4 self.num_obj = 1 self.num_cstr = 6 self.num_fidelity = 1 self.bounds = np.array([ [0.125, 10], [0.1, 10], [0.1, 10], [0.1, 10], ]) self.tags = [ "GOTestProblems", ] self.constraints = [ self.g1, self.g2, self.g3, self.g4, self.g5, self.g6, ] self.P = 6_000 self.L = 14 self.E = 30e+6 self.G = 12e+6 self.t_max = 13_600 self.s_max = 30_000 self.d_max = 0.25
[docs] def M(self, x): return self.P * (self.L + x[1] / 2)
[docs] def R(self, x): return np.sqrt(0.25 * (x[1] ** 2 + (x[0] + x[2]) ** 2))
[docs] def J(self, x): # 2 ??? * ??? np.sqrt(2) * x[0] * x[1] * (x[1] ** 2 / 12 + 0.25 * (x[0] + x[2]) ** 2) return 2 / np.sqrt(2) * x[0] * x[1] * (x[1] ** 2 / 12 + 0.25 * (x[0] + x[2]) ** 2)
[docs] def P_c(self, x): return (4.013 * self.E / (6 * self.L ** 2)) * x[2] * x[3] ** 3 * (1 - 0.25 * x[2] * np.sqrt(self.E / self.G) / self.L)
[docs] def t1(self, x): return self.P / (np.sqrt(2) * x[0] * x[1])
[docs] def t2(self, x): return self.M(x) * self.R(x) / self.J(x)
[docs] def t(self, x): return np.sqrt(self.t1(x) ** 2 + self.t1(x) * self.t2(x) * x[1] / self.R(x) + self.t2(x) ** 2)
[docs] def s(self, x): return 6 * self.P * self.L / (x[3] * x[2] ** 2)
[docs] def d(self, x): return 4 * self.P * self.L ** 3 / (self.E * x[3] * x[2] ** 3)
[docs] def objective(self, x): return 1.10471*x[0]**2*x[1]+0.04811*x[2]*x[3]*(14.0 + x[1])
[docs] def g1(self, x): return self.t(x) - self.t_max
[docs] def g2(self, x): return self.s(x) - self.s_max
[docs] def g3(self, x): return x[0] - x[3]
[docs] def g4(self, x): return 0.10471*x[0]**2 + 0.04811*x[2]*x[3]*(14.0 + x[1]) - 5.0
[docs] def g5(self, x): return self.d(x) - self.d_max
[docs] def g6(self, x): return self.P - self.P_c(x)
if __name__ == "__main__": from smt_optim.subsolvers.multistart import multistart_minimize prob = WeldedBeamDesign() # prob.set_dim(20) print(prob.bounds) sp_cstr = [] for j in range(prob.num_cstr): sp_cstr.append( { "fun": lambda x, f=prob.constraints[j]: -f(x), "type": prob.cstr_types[j] if hasattr(prob, "cstr_types") else "ineq", } ) res = multistart_minimize(prob.objective, bounds=prob.bounds, constraints=sp_cstr, n_start=100, seed=0) print(res.x) print(res.fun) # G2 problem # x_star = np.array([3.162460616, 3.128331428, 3.094792129, 3.061451495, 3.027929159,2.993826067, 2.958668718, 2.921842273, 0.494825115, 0.488357110,0.482316427, 0.476645751, 0.471295508, 0.466230993, 0.461420050,0.456836648, 0.452458769, 0.448267622, 0.444247010, 0.440382860]) # print(prob.objective(x_star)) # print(prob.constraints[0](x_star)) # print(prob.constraints[1](x_star)) x_star = np.array([0.18756483308730693, 4.053366828472939, 8.731994883504612, 0.2231022567643955]) print(prob.objective(x_star)) print(prob.constraints[0](x_star)) print(prob.constraints[1](x_star))