Пример #1
0
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;
}
Пример #4
0
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;
}