⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 problem.h

📁 该算法是张青复与周爱民的基于RM-MEDA算法的程序
💻 H
字号:

//
//Please find details of the method from
//
//	Q. Zhang, A. Zhou and Y. Jin, "RM-MEDA: A Regularity Model Based Multiobjective Estimation of Distribution Algorithm", IEEE Trans. Evolutionary Computation, Vol. 12, no. 1, pp41-63, 2008.
//
//The source codes are free for reserach work. If you have any problem with the source codes, please contact with 
//	Qingfu Zhang, 
//		Department of Computing and Electronic Systems,
//		University of Essex,
//		Colchester, CO4 3SQ, UK
//		http://cswww.essex.ac.uk/staff/zhang
//		Email: qzhang@essex.ac.uk
//    Aimin Zhou
//		Department of Computing and Electronic Systems,
//		University of Essex,
//		Colchester, CO4 3SQ, UK
//		http://privatewww.essex.ac.uk/~azhou/
//		Email: azhou@essex.ac.uk or amzhou@gmail.com 
//Programmer:		
//		Aimin Zhou
//Last Update:
//		Feb. 21, 2008
//
//Problem.h : test instances in ZZJ08 
//

#include <cmath>

namespace PROBLEM
{

#define PI 3.1415926536
typedef double (*GF)(const std::vector< double >& X);
double GL(const std::vector< double >& X)
{
	double g=0.0;
	for(unsigned int i=2; i<X.size(); i++) g += (X[i]-X[0])*(X[i]-X[0]);
	return g;
}

double GN(const std::vector< double >& X)
{
	double g=0.0;
	for(unsigned int i=2; i<X.size(); i++) g += (X[i]*X[i]-X[0])*(X[i]*X[i]-X[0]);
	return g;
}
//F2
double F1(const std::vector< double >& X, GF g, double alpha)
{
	return (1.0 + (*g)(X))*cos(pow(X[0],alpha)*PI/2.0)*cos(pow(X[1],alpha)*PI/2.0);
}
double F2(const std::vector< double >& X, GF g, double alpha)
{
	return (1.0 + (*g)(X))*cos(pow(X[0],alpha)*PI/2.0)*sin(pow(X[1],alpha)*PI/2.0);
}
double F3(const std::vector< double >& X, GF g, double alpha)
{
	return (1.0 + (*g)(X))*sin(pow(X[0],alpha)*PI/2.0);
}

//	ZDT11 test problem
void ZZJ08_F1(std::vector< double >& F, std::vector< double >& E, std::vector< double >& I, std::vector< double >& X)
{
	F[0] = X[0];
	double g = 0.0;
	for(unsigned int i=1; i<X.size(); i++)
		g += (X[i]-X[0])*(X[i]-X[0]);
	g = 1.0 + 9.0*g/(X.size() - 1.0);
	F[1] = g*(1.0 - sqrt(X[0]/g));
}

//	ZDT21 test problem
void ZZJ08_F2(std::vector< double >& F, std::vector< double >& E, std::vector< double >& I, std::vector< double >& X)
{
	F[0] = X[0];
	double g = 0;
	for(unsigned int i=1; i<X.size(); i++)
		g +=  (X[i]-X[0])*(X[i]-X[0]);
	g = 1.0 + 9.0*g/(X.size() - 1.0);
	F[1] = g*(1.0 -  X[0] * X[0] /(g*g));
}

//	ZDT61 test problem
void ZZJ08_F3(std::vector< double >& F, std::vector< double >& E, std::vector< double >& I, std::vector< double >& X)
{
	F[0] = 1 - exp(- 4.0*X[0])*pow(sin(6.0*PI*X[0]), 6.0);
	double g = 0.0;
	for(unsigned int i=1; i<X.size(); i++)
		g += (X[i]-X[0])*(X[i]-X[0]);
	g = 1.0 + 9.0*pow(g/(X.size()-1.0), 0.25);
	F[1] = g*(1.0 -  F[0]*F[0]/(g*g));
}


//	DTLZ21 test problem
void ZZJ08_F4(std::vector< double >& F, std::vector< double >& E, std::vector< double >& I, std::vector< double >& X)
{
	F[0] = F1(X, GL, 1.0);
	F[1] = F2(X, GL, 1.0);
	F[2] = F3(X, GL, 1.0);
}

//	ZDT12 test problem
void ZZJ08_F5(std::vector< double >& F, std::vector< double >& E, std::vector< double >& I, std::vector< double >& X)
{
	F[0] = X[0];
	double g = 0.0;
	for(unsigned int i=1; i<X.size(); i++)
		g += (X[i]*X[i] - X[0])*(X[i]*X[i] - X[0]);
	g = 1.0 + 9.0*g/(X.size() - 1.0);
	F[1] = g*(1.0 - sqrt(X[0]/g));
}

//	ZDT22 test problem
void ZZJ08_F6(std::vector< double >& F, std::vector< double >& E, std::vector< double >& I, std::vector< double >& X)
{
	F[0] = sqrt(X[0]);
	double g = 0;
	for(unsigned int i=1; i<X.size(); i++)
		g += (X[i]*X[i] - X[0])*(X[i]*X[i] - X[0]);
	g = 1.0 + 9.0*g/(X.size() - 1.0);
	F[1] = g*(1.0-X[0] /(g*g));
}

//	ZDT62 test problem
void ZZJ08_F7(std::vector< double >& F, std::vector< double >& E, std::vector< double >& I, std::vector< double >& X)
{
	F[0] = 1 - exp(-4.0*X[0])*pow(sin(6.0*PI*X[0]), 6.0);
	double g = 0.0;
	for(unsigned int i=1; i<X.size(); i++)
		g += (X[i]*X[i]-X[0])*(X[i]*X[i]-X[0]);
	g = 1.0 + 9.0*pow(g/(X.size()-1.0), 0.25);
	F[1] = g*(1.0- F[0]*F[0]/(g*g));
}

//	DTLZ22 test problem
void ZZJ08_F8(std::vector< double >& F, std::vector< double >& E, std::vector< double >& I, std::vector< double >& X)
{
	F[0] = F1(X, GN, 1.0);
	F[1] = F2(X, GN, 1.0);
	F[2] = F3(X, GN, 1.0);
}

//	ZDT4a2 test problem
void ZZJ08_F9(std::vector< double >& F, std::vector< double >& E, std::vector< double >& I, std::vector< double >& X)
{
	F[0] = X[0];
	double g    = 0.0;
	double tmp1 = 0.0;
	double tmp2 = 1.0;
	for(unsigned int i=1; i<X.size(); i++)
	{
		tmp1 += (X[i]*X[i]-X[0])*(X[i]*X[i]-X[0]);
		tmp2 *= cos((X[i]*X[i]-X[0])/sqrt(double(i)));
	}
	g	 = (tmp1/4000.0 - tmp2 + 1.0) + 1.0;
	F[1] = g*(1.0-sqrt(X[0]/g));
}

//	ZDT4c2 test problem
void ZZJ08_F10(std::vector< double >& F, std::vector< double >& E, std::vector< double >& I, std::vector< double >& X)
{
	F[0] = X[0];
	double g = 1.0 + 10.0*(X.size() - 1.0);
	for(unsigned int i=1; i<X.size(); i++)
		g += (X[i]*X[i]-X[0])*(X[i]*X[i]-X[0]) - 10.0*cos(2*PI*(X[i]*X[i]-X[0]));
	F[1] = g*fabs(1.0 - sqrt(X[0]/g));
}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -