8 #ifndef SOT_ADAPTIVE_SAMPLING_H 9 #define SOT_ADAPTIVE_SAMPLING_H 14 #include "genetic_algorithm.h" 35 virtual void reset(
int budget) = 0;
60 template<
class MeritFunction = MeritWeightedDistance>
64 std::shared_ptr<Surrogate>
mSurf;
81 SRBF(
const std::shared_ptr<Problem>& data,
const std::shared_ptr<Surrogate>& surf,
int numCand,
int budget) {
82 mData = std::shared_ptr<Problem>(data);
83 mSurf = std::shared_ptr<Surrogate>(surf);
87 mxLow = data->lBounds();
88 mxUp = data->uBounds();
89 mDistTol = 1e-3*sqrt(arma::sum(arma::square(mxUp - mxLow)));
112 mat cand = arma::repmat(xBest, 1, mNumCand);
113 mat pert = arma::randn(mDim, mNumCand);
114 pert.each_col() %= sigma;
117 for(
int i=0; i < mNumCand; i++) {
118 for(
int j=0; j < mDim; j++) {
119 if(cand(j, i) > mxUp(j)) {
120 cand(j, i) = fmax(2*mxUp(j) - cand(j, i), mxLow(j));
122 else if(cand(j, i) < mxLow(j)) {
123 cand(j, i) = fmin(2*mxLow(j) - cand(j, i), mxUp(j));
129 mNumEvals += newPoints;
131 return mMerit.
pickPoints(cand, mSurf, points, newPoints, mDistTol);
152 template<
class MeritFunction = MeritWeightedDistance>
173 DYCORS(
const std::shared_ptr<Problem>& data,
const std::shared_ptr<Surrogate>& surf,
174 int numCand,
int budget) {
175 mData = std::shared_ptr<Problem>(data);
176 mSurf = std::shared_ptr<Surrogate>(surf);
180 mxLow = data->lBounds();
181 mxUp = data->uBounds();
182 mDistTol = 1e-3*sqrt(arma::sum(arma::square(mxUp - mxLow)));
203 double dds_prob = std::min(20.0/mDim, 1.0) *
204 (1.0 - (std::log(mNumEvals + 1.0) / std::log(
double(mBudget))));
205 mat cand = arma::repmat(xBest, 1, mNumCand);
207 for(
int i=0; i < mNumCand; i++) {
210 for(
int j=0; j < mDim; j++) {
211 if(
rand() < dds_prob) {
213 cand(j, i) += sigma(j)*
randn();
218 int ind =
randi(mDim-1);
219 cand(ind, i) += sigma(ind)*
randn();
223 for(
int j=0; j < mDim; j++) {
224 if(cand(j, i) > mxUp(j)) {
225 cand(j, i) = fmax(2*mxUp(j) - cand(j, i), mxLow(j));
227 else if(cand(j, i) < mxLow(j)) {
228 cand(j, i) = fmin(2*mxLow(j) - cand(j, i), mxUp(j));
234 mNumEvals += newPoints;
236 return mMerit.
pickPoints(cand, mSurf, points, newPoints, mDistTol);
254 template<
class MeritFunction = MeritWeightedDistance>
275 Uniform(
const std::shared_ptr<Problem>& data,
const std::shared_ptr<Surrogate>& surf,
int numCand,
int budget) {
276 mData = std::shared_ptr<Problem>(data);
277 mSurf = std::shared_ptr<Surrogate>(surf);
281 mxLow = data->lBounds();
282 mxUp = data->uBounds();
283 mDistTol = 1e-3*sqrt(arma::sum(arma::square(mxUp - mxLow)));
305 mat cand = arma::randu<mat>(mDim, mNumCand);
306 for(
int j=0; j < mDim; j++) {
307 cand.row(j) = mxLow(j) + (mxUp(j) - mxLow(j)) * cand.row(j);
311 mNumEvals += newPoints;
313 return mMerit.
pickPoints(cand, mSurf, points, newPoints, mDistTol);
335 std::string mName =
"GA surrogate wrapper";
345 GAWrapper(
const std::shared_ptr<Problem> &data,
const std::shared_ptr<Surrogate> &surf,
346 const mat &points,
double distTol) {
348 mxLow = data->lBounds();
349 mxUp = data->uBounds();
350 mSurf = std::shared_ptr<Surrogate>(surf);
356 int dim()
const {
return mDim; }
357 double min()
const {
return mMinimum; }
359 std::string
name()
const {
return mName; }
368 mat dists = arma::sqrt(squaredPairwiseDistance<mat>(mPoints, X));
372 if(mSurf->numPoints() == X.n_cols && mPoints.n_cols == X.n_cols) {
373 surfVals = mSurf->evals(X, dists);
376 surfVals = mSurf->evals(X);
379 vec minDists = arma::min(dists).t();
381 surfVals.elem(arma::find(minDists < mDistTol)).fill(arma::datum::inf);
413 GASampling(
const std::shared_ptr<Problem>& data,
const std::shared_ptr<Surrogate>& surf,
414 int numIndividuals,
int numGenerations) {
415 mData = std::shared_ptr<Problem>(data);
416 mSurf = std::shared_ptr<Surrogate>(surf);
418 mxLow = data->lBounds();
419 mxUp = data->uBounds();
420 mNumIndividuals = numIndividuals;
421 mNumGenerations = numGenerations;
422 mDistTol = 1e-3*sqrt(arma::sum(arma::square(mxUp - mxLow)));
429 mat points2 = points;
430 mat xNew = arma::zeros(mDim, newPoints);
431 for(
int i=0; i < newPoints; i++) {
432 std::shared_ptr<Problem> gaWrapper(
433 std::make_shared<GAWrapper>(mData, mSurf, points2, arma::norm(sigma)));
436 xNew.col(i) = res.
xBest();
437 points2 = arma::join_horiz(points2, res.
xBest());
442 std::shared_ptr<Problem> gaWrapper(
443 std::make_shared<GAWrapper>(mData, mSurf, points, arma::norm(sigma)));
Optimization result class.
Definition: utils.h:138
int mNumCand
Definition: adaptive_sampling.h:157
int mDim
Definition: adaptive_sampling.h:158
GAWrapper(const std::shared_ptr< Problem > &data, const std::shared_ptr< Surrogate > &surf, const mat &points, double distTol)
Constructor.
Definition: adaptive_sampling.h:345
Abstract class for a SOT merit function.
Definition: merit_functions.h:28
vec mxLow
Definition: adaptive_sampling.h:67
arma::vec vec
Default (column) vector class.
Definition: common.h:17
vec xBest() const
Method for getting the best solution found so far.
Definition: utils.h:204
MeritFunction mMerit
Definition: adaptive_sampling.h:72
double mDistTol
Definition: adaptive_sampling.h:161
GASampling(const std::shared_ptr< Problem > &data, const std::shared_ptr< Surrogate > &surf, int numIndividuals, int numGenerations)
Constructor.
Definition: adaptive_sampling.h:413
void reset(int budget)
Resets the object for a new budget (useful if a strategy restarts)
Definition: adaptive_sampling.h:189
std::shared_ptr< Surrogate > mSurf
Definition: adaptive_sampling.h:328
std::shared_ptr< Surrogate > mSurf
Definition: adaptive_sampling.h:398
double mDistTol
Definition: adaptive_sampling.h:336
int mBudget
Definition: adaptive_sampling.h:163
vec mOptimum
Definition: adaptive_sampling.h:333
vec mxUp
Definition: adaptive_sampling.h:68
vec mxUp
Definition: adaptive_sampling.h:401
MeritFunction mMerit
Definition: adaptive_sampling.h:164
virtual void reset(int budget)=0
Virtual method for reseting the object.
int mBudget
Definition: adaptive_sampling.h:71
void reset(int budget)
Resets the object for a new budget (useful if a strategy restarts)
Definition: adaptive_sampling.h:96
int mNumIndividuals
Definition: adaptive_sampling.h:402
std::shared_ptr< Problem > mData
Definition: adaptive_sampling.h:63
mat mPoints
Definition: adaptive_sampling.h:330
vec mxLow
Definition: adaptive_sampling.h:159
Wrapper to turn a surrogate model into an optimization problem.
Definition: adaptive_sampling.h:326
int mDim
Definition: adaptive_sampling.h:399
Use a GA to minimize the surrogate.
Definition: adaptive_sampling.h:395
std::shared_ptr< Problem > mData
Definition: adaptive_sampling.h:155
double rand()
Generate a U[0,1] realization.
Definition: utils.h:386
vec mxLow
Definition: adaptive_sampling.h:400
virtual mat makePoints(const vec &xBest, const mat &points, const vec &sigma, int newPoints)=0
Virtual method for proposing new evaluations.
int dim() const
Method for getting the number of dimensions.
Definition: adaptive_sampling.h:356
vec optimum() const
Method for getting the global minimizer.
Definition: adaptive_sampling.h:358
vec uBounds() const
Method for getting the upper variable bounds.
Definition: adaptive_sampling.h:355
double randi(int i)
Generate a random integer.
Definition: utils.h:364
mat makePoints(const vec &xBest, const mat &points, const vec &sigma, int newPoints)
Proposes new evaluations.
Definition: adaptive_sampling.h:202
Genetic Algorithm.
Definition: genetic_algorithm.h:32
int mDim
Definition: adaptive_sampling.h:329
std::shared_ptr< Problem > mData
Definition: adaptive_sampling.h:397
double min() const
Method for getting global minimum value.
Definition: adaptive_sampling.h:357
std::string name() const
Method for getting the name of the optimization problem.
Definition: adaptive_sampling.h:359
DYnamic COordinate search using Response Surface models.
Definition: adaptive_sampling.h:153
vec mxLow
Definition: adaptive_sampling.h:331
vec mxUp
Definition: adaptive_sampling.h:332
mat makePoints(const vec &xBest, const mat &points, const vec &sigma, int newPoints)
Virtual method for proposing new evaluations.
Definition: adaptive_sampling.h:427
vec lBounds() const
Method for getting the lower variable bounds.
Definition: adaptive_sampling.h:354
DYCORS(const std::shared_ptr< Problem > &data, const std::shared_ptr< Surrogate > &surf, int numCand, int budget)
Constructor.
Definition: adaptive_sampling.h:173
SRBF(const std::shared_ptr< Problem > &data, const std::shared_ptr< Surrogate > &surf, int numCand, int budget)
Constructor.
Definition: adaptive_sampling.h:81
std::shared_ptr< Surrogate > mSurf
Definition: adaptive_sampling.h:156
vec mxUp
Definition: adaptive_sampling.h:160
vec evals(const mat &X) const
Method for evaluating the objective function at multiple points.
Definition: adaptive_sampling.h:366
Abstract class for a SOT adaptive sampling class.
Definition: adaptive_sampling.h:29
Stochastic RBF.
Definition: adaptive_sampling.h:61
int mDim
Definition: adaptive_sampling.h:66
int mNumCand
Definition: adaptive_sampling.h:65
double randn()
Generate a N(0,1) realization.
Definition: utils.h:375
Result run()
Runs the optimization algorithm.
Definition: genetic_algorithm.h:143
double mDistTol
Definition: adaptive_sampling.h:69
int mNumGenerations
Definition: adaptive_sampling.h:403
mat makePoints(const vec &xBest, const mat &points, const vec &sigma, int newPoints)
Proposes new evaluations.
Definition: adaptive_sampling.h:109
SOT namespace.
Definition: sot.h:27
double mDistTol
Definition: adaptive_sampling.h:404
virtual mat pickPoints(const mat &cand, const std::shared_ptr< Surrogate > &surf, const mat &points, int newPoints, double distTol)=0
Method for picking the next point.
double eval(const vec &x) const
Method for evaluating the objective function.
Definition: adaptive_sampling.h:360
Abstract class for a SOT optimization problem.
Definition: problem.h:24
arma::mat mat
Default matrix class.
Definition: common.h:16
std::shared_ptr< Surrogate > mSurf
Definition: adaptive_sampling.h:64
void reset(int budget)
Virtual method for reseting the object.
Definition: adaptive_sampling.h:425