optimize method
Implementation
Map<String, dynamic> optimize({int budget = 20}) {
final gp = _GP(kernel: _rbf);
final X = List<List<double>>.from(initialX);
final Y = List<double>.from(initialY);
final dim = lower.length;
List<double> proposeEI() {
// random sample many candidates and pick best EI (cheap approximation)
final candidates = List.generate(200, (_) {
return List.generate(
dim,
(d) => lower[d] + _rand.nextDouble() * (upper[d] - lower[d]),
);
});
double bestEI = double.negativeInfinity;
List<double>? bestX;
for (var cand in candidates) {
final pred = gp.predict(X, Y, cand);
final mu = pred['mu'] as double;
final sigma = sqrt(pred['sigma2'] as double);
final fBest = Y.reduce((a, b) => a > b ? a : b);
final imp = mu - fBest;
final z = sigma > 0 ? imp / sigma : 0.0;
final ei = imp * _normalCdf(z) + sigma * _normalPdf(z);
if (ei > bestEI) {
bestEI = ei;
bestX = cand;
}
}
return bestX!;
}
for (var i = 0; i < budget; i++) {
final xnext = proposeEI();
final ynext = _evaluate(xnext);
X.add(xnext);
Y.add(ynext);
}
final bestIdx =
Y.asMap().entries.reduce((a, b) => a.value > b.value ? a : b).key;
return {'bestX': X[bestIdx], 'bestY': Y[bestIdx]};
}