def __init__(self, worker_id, data, response_surface, maxeval, nsamples, exp_design=None, sampling_method=None, extra=None): """Initialize the optimization strategy. :param worker_id: Start ID in a multistart setting :param data: Problem parameter data structure :param response_surface: Surrogate model object :param maxeval: Function evaluation budget :param nsamples: Number of simultaneous fevals allowed :param exp_design: Experimental design :param search_procedure: Search procedure for finding points to evaluate :param extra: Points to be added to the experimental design """ self.worker_id = worker_id self.data = data self.fhat = response_surface if self.fhat is None: self.fhat = RBFInterpolant(surftype=CubicRBFSurface, maxp=maxeval) self.maxeval = maxeval self.nsamples = nsamples self.extra = extra # Default to generate sampling points using Symmetric Latin Hypercube self.design = exp_design if self.design is None: if self.data.dim > 50: self.design = LatinHypercube(data.dim, data.dim + 1) else: self.design = SymmetricLatinHypercube(data.dim, 2 * (data.dim + 1)) self.xrange = np.asarray(data.xup - data.xlow) # algorithm parameters self.sigma_min = 0.005 self.sigma_max = 0.2 self.sigma_init = 0.2 self.failtol = max(5, data.dim) self.succtol = 3 self.numeval = 0 self.status = 0 self.sigma = 0 self.resubmitter = RetryStrategy() self.xbest = None self.fbest = np.inf self.fbest_old = None # Set up search procedures and initialize self.sampling = sampling_method if self.sampling is None: self.sampling = CandidateDYCORS(data) self.check_input() # Start with first experimental design self.sample_initial()
if __name__ == "__main__": # Test DYCORS dim = 10 maxeval = 100 initeval = 80 from test_problems import Ackley from experimental_design import LatinHypercube from rbf_interpolant import RBFInterpolant from rbf_surfaces import CubicRBFSurface xbest = np.ones(dim) data = Ackley(dim) cand = CandidateDYCORS(data, 100 * dim) exp_des = LatinHypercube(dim, npts=initeval) initpoints = exp_des.generate_points() rbf = RBFInterpolant(surftype=CubicRBFSurface) for i in range(initeval): rbf.add_point(initpoints[i, :], data.objfunction(initpoints[i, :])) cand.init(initpoints, maxeval, True, None) def evals(x, scaling): return rbf.evals(x) cand.make_points(xbest, 0.02, evals, maxeval) import matplotlib.pyplot as plt plt.plot(cand.xcand[:, 0], cand.xcand[:, 1], 'ro') plt.ylabel('Dimension 1') plt.xlabel('Dimension 2') plt.show()