void properties::private_vector_ave_sd_calc(double_vector &v,double &ave,double &sd){ for (unsigned int i=0;i<v.size();i++) ave+=v[i]; ave=ave/v.size(); if (v.size()>1){ for (unsigned int i=0; i<v.size(); i++) sd+=pow(v[i]-ave,2); sd=sqrt(sd/(v.size()-1)); }else sd=0; }
// Fonction evo_strat est une implementation de l'algorithme (1+1)-ES. // implémenter une adaptation automatique de la variance, qui s'appelle la "regle du 1/5" // Elle est entre autres decrite ici: http://web.cecs.pdx.edu/~greenwd/ecjrnl.pdf // le parametre adaptive déclenche la regle du 1/5 // si le parametre fitness_sequence est non nul, alors la sequence des fitnesses est enregistrée dedans double_vector evo_strat(double_vector v0,double (*eval)(double_vector*),int ntrials=1000,double sigma=1.0,bool adaptive=false,double_vector *fitness_sequence=NULL) { void add_noise_to_vector(double_vector &,double); int t,s=v0.size(); double_vector v=v0; double eval_v = (*eval)(&v); int nb_success_mutations=0; cout<<"s = " <<s<< " eval_v = "<<eval_v<<endl; for (t=1; t <= ntrials; t++) { double_vector v2=v; double eval_v2; add_noise_to_vector(v2, sigma); eval_v2 = (*eval)(&v2); if (eval_v2 > eval_v) { v = v2; eval_v = eval_v2; nb_success_mutations++; } if (fitness_sequence) fitness_sequence->push_back(eval_v); if (t % (10*s) == 0 && adaptive) { double ps = nb_success_mutations/(10.0*s); /* percentage of success */ double c=0.85; if (ps > 0.2) sigma /= c; else sigma *= c; nb_success_mutations = 0; } } return v; }
// Fonction cree les valeurs aleatoires de vecteur void add_noise_to_vector(double_vector &v,double sigma) { int i, s=v.size(); for (i = 0; i < s; i++) v[i] += normal_distribution()*sigma; }
double_vector L0Smoothing_1D(double_vector data, int jump) { double lambda = 0.01, kappa = 2.0; double_vector out(data.size()); Matrix SR(data.size(), 1); for(int j = 0; j < 1; ++j) { for(int i = 0; i < data.size(); ++i) { SR(i, j) = data[i]; } } double betamax = 1; Matrix fx(1, 2); fx(0, 0) = 1; fx(0, 1) = -1; Matrix fy(2, 1); fy(0, 0) = 1; fy(1, 0) = -1; Matrix sizeI2D(1, 2); sizeI2D(0, 0) = data.size(); sizeI2D(0, 1) = 1; Matrix2 otfFx = psf2otf(fx, sizeI2D); Matrix2 otfFy = psf2otf(fy, sizeI2D); Matrix otfFx2 = MatAbsPow2(otfFx); Matrix otfFy2 = MatAbsPow2(otfFy); Matrix2 Normin1R = fft2_1D(SR); Matrix Denormin2 = otfFx2; float beta = 2 * lambda; while(beta < betamax) { float lb = lambda / beta; Matrix Denormin = ZMatrix(data.size(), 1); Denormin = beta * Denormin2; MatAdd(Denormin, 1); Matrix vR = Matdiff(SR, 1); Matrix Pos2Sum = MatPow2(vR); for(int j = 0; j < 1; ++j) { for(int i = 0; i < data.size(); ++i) { if(Pos2Sum(i, j) < lb) { vR(i, j) = 0; } } } Matrix Normin2R = Matdiffinv(vR, 1); Matrix2 FSR = (Normin1R + fft2_1D(vR) * beta) / Denormin; SR = ifft2_1D(FSR); beta = beta * kappa; printf("."); for(uint i = 0; i < data.size(); ++i) { for(uint j = 0; j < 1; ++j) { out[i] = SR(i, j); } } } return out; }