27 #ifndef SHARK_ALGORITHMS_DIRECT_SEARCH_LM_CMA_H 28 #define SHARK_ALGORITHMS_DIRECT_SEARCH_LM_CMA_H 56 class IncrementalCholeskyMatrix{
58 IncrementalCholeskyMatrix(){}
59 void init (
double alpha,std::size_t dimensions, std::size_t numVectors, std::size_t Nsteps){
60 m_vArr.resize(numVectors,dimensions);
61 m_pcArr.resize(numVectors,dimensions);
62 m_b.resize(numVectors);
63 m_d.resize(numVectors);
64 m_l.resize(numVectors);
67 m_maxStoredVectors = numVectors;
80 void prod(RealVector& x, T
const& z)
const{
82 double a = std::sqrt(1-m_alpha);
83 for(std::size_t j=0; j != m_j.size(); j++){
84 std::size_t jcur = m_j[j];
92 void inv(RealVector& x, T
const& z)
const{
96 void update(RealVector
const& newPc){
98 if (m_j.size() < m_maxStoredVectors)
100 std::size_t index = m_j.size();
101 m_j.push_back(index);
109 std::size_t dmin = m_l[m_j[1]] - m_l[m_j[0]];
111 for(std::size_t j=2; j != m_j.size(); j++)
113 std::size_t dcur = m_l[m_j[j]] - m_l[m_j[j-1]];
122 if (dmin >= m_Nsteps)
125 if (imin != m_j.size()-1)
127 std::size_t sav = m_j[imin];
128 for(std::size_t j = imin; j != m_j.size()-1; j++)
134 int newidx = m_j.back();
135 m_l[newidx] = m_counter;
143 for(std::size_t i = imin; i != m_j.size(); ++i)
146 inv(v,
row(m_pcArr,index),i);
150 double c = std::sqrt(1.0-m_alpha);
151 double f = std::sqrt(1+m_alpha/(1-m_alpha)*normv2);
152 m_b[index] = c/normv2*(f-1);
153 m_d[index] = 1/(c*normv2)*(1-1/f);
159 void inv(RealVector& x, T
const& z,std::size_t k)
const{
161 double c= 1.0/std::sqrt(1-m_alpha);
162 for(std::size_t j=0; j != k; j++){
163 std::size_t jcur = m_j[j];
176 std::vector<std::size_t> m_j;
177 std::vector<std::size_t> m_l;
178 std::size_t m_Nsteps;
179 std::size_t m_maxStoredVectors;
180 std::size_t m_counter;
204 m_features |= REQUIRES_VALUE;
210 {
return "LMCMA-ES"; }
214 unsigned lambda = unsigned( 4. + ::floor( 3. * ::log( static_cast<double>( dimension ) ) ) );
216 lambda = std::max<unsigned int>( 5,
std::min( lambda, dimension ) );
229 unsigned int lambda = suggestLambda( p.size() );
230 unsigned int mu = suggestMu( lambda );
235 1.0/std::sqrt(
double(p.size()))
247 checkFeatures(
function);
250 m_numberOfVariables =
function.numberOfVariables();
252 m_mu =
static_cast<unsigned int>(::floor(mu));
255 m_mean = initialSearchPoint;
256 m_best.point = initialSearchPoint;
257 m_best.value =
function(initialSearchPoint);
260 m_stepSize.init(initialSigma);
263 m_weights.resize(m_mu);
264 for (
unsigned int i = 0; i < m_mu; i++){
265 m_weights(i) = ::log(mu + 0.5) - ::log(1. + i);
267 m_weights /=
sum(m_weights);
270 m_muEff = 1. /
sum(
sqr(m_weights));
271 double c1 = 1/(10*std::log(m_numberOfVariables+1.0));
275 m_evolutionPathC =
blas::repeat(0.0,m_numberOfVariables);
276 m_A.init(c1,m_numberOfVariables,lambda,lambda);
282 std::vector< Individual<RealVector, double, RealVector> > offspring( m_lambda );
285 for(
unsigned int i = 0; i < offspring.size(); i++ ) {
286 createSample(offspring[i].searchPoint(),offspring[i].chromosome());
288 penalizingEvaluator(
function, offspring.begin(), offspring.end() );
293 std::vector< Individual<RealVector, double, RealVector> > parents(
lambda() );
295 selection(offspring.begin(),offspring.end(),parents.begin(), parents.end());
296 updateStrategyParameters( parents );
299 m_best.point= parents[ 0 ].searchPoint();
300 m_best.value= parents[ 0 ].unpenalizedFitness();
305 return m_stepSize.stepSize();
309 RealVector
const&
mean()
const {
320 return m_evolutionPathC;
324 unsigned int mu()
const {
347 RealVector m( m_numberOfVariables, 0. );
348 for(
unsigned int j = 0; j < mu(); j++ ){
349 noalias(m) += m_weights( j ) * offspring[j].searchPoint();
353 noalias(m_evolutionPathC) = (1. - m_cC ) * m_evolutionPathC + std::sqrt( m_cC * (2. - m_cC) * m_muEff ) * (m - m_mean) / sigma();
360 m_A.update(m_evolutionPathC);
363 m_stepSize.update(offspring);
368 void createSample(RealVector& x,RealVector& z)
const{
369 x.resize(m_numberOfVariables);
370 z.resize(m_numberOfVariables);
371 for(std::size_t i = 0; i != m_numberOfVariables; ++i){
372 z(i) =
gauss(*mpe_rng,0,1);
375 noalias(x) = sigma()*x +m_mean;
378 unsigned int m_numberOfVariables;
380 unsigned int m_lambda;
385 detail::IncrementalCholeskyMatrix m_A;
389 RealVector m_weights;
392 RealVector m_evolutionPathC;