0
点赞
收藏
分享

微信扫一扫

多目标遗传算法 ------ NSGA-II (部分源码解析)目标函数 problemdef.c

/* Test problem definitions */

# include <stdio.h>
# include <stdlib.h>
# include <math.h>

# include "global.h"
# include "rand.h"

# define sch1
/* # define sch2 */
/* # define fon */
/* # define kur */
/* # define pol */
/* # define vnt */
/* # define zdt1 */
/* # define zdt2 */
/* # define zdt3 */
/* # define zdt4 */
/* # define zdt5 */
/* # define zdt6 */
/* # define bnh */
/* # define osy */
/* # define srn */
/* # define tnk */
/* # define ctp1 */
/* # define ctp2 */
/* # define ctp3 */
/* # define ctp4 */
/* # define ctp5 */
/* # define ctp6 */
/* # define ctp7 */
/* # define ctp8 */

/* Test problem SCH1
# of real variables = 1
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/

#ifdef sch1
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[0] = pow(xreal[0],2.0);
obj[1] = pow((xreal[0]-2.0),2.0);
return;
}
#endif

/* Test problem SCH2
# of real variables = 1
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/

#ifdef sch2
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
if (xreal[0]<=1.0)
{
obj[0] = -xreal[0];
obj[1] = pow((xreal[0]-5.0),2.0);
return;
}
if (xreal[0]<=3.0)
{
obj[0] = xreal[0]-2.0;
obj[1] = pow((xreal[0]-5.0),2.0);
return;
}
if (xreal[0]<=4.0)
{
obj[0] = 4.0-xreal[0];
obj[1] = pow((xreal[0]-5.0),2.0);
return;
}
obj[0] = xreal[0]-4.0;
obj[1] = pow((xreal[0]-5.0),2.0);
return;
}
#endif

/* Test problem FON
# of real variables = n
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/

#ifdef fon
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double s1, s2;
int i;
s1 = s2 = 0.0;
for (i=0; i<nreal; i++)
{
s1 += pow((xreal[i]-(1.0/sqrt((double)nreal))),2.0);
s2 += pow((xreal[i]+(1.0/sqrt((double)nreal))),2.0);
}
obj[0] = 1.0 - exp(-s1);
obj[1] = 1.0 - exp(-s2);
return;
}
#endif

/* Test problem KUR
# of real variables = 3
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/

#ifdef kur
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
int i;
double res1, res2;
res1 = -0.2*sqrt((xreal[0]*xreal[0]) + (xreal[1]*xreal[1]));
res2 = -0.2*sqrt((xreal[1]*xreal[1]) + (xreal[2]*xreal[2]));
obj[0] = -10.0*( exp(res1) + exp(res2));
obj[1] = 0.0;
for (i=0; i<3; i++)
{
obj[1] += pow(fabs(xreal[i]),0.8) + 5.0*sin(pow(xreal[i],3.0));
}
return;
}
#endif

/* Test problem POL
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/

#ifdef pol
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double a1, a2, b1, b2;
a1 = 0.5*sin(1.0) - 2.0*cos(1.0) + sin(2.0) - 1.5*cos(2.0);
a2 = 1.5*sin(1.0) - cos(1.0) + 2.0*sin(2.0) - 0.5*cos(2.0);
b1 = 0.5*sin(xreal[0]) - 2.0*cos(xreal[0]) + sin(xreal[1]) - 1.5*cos(xreal[1]);
b2 = 1.5*sin(xreal[0]) - cos(xreal[0]) + 2.0*sin(xreal[1]) - 0.5*cos(xreal[1]);
obj[0] = 1.0 + pow((a1-b1),2.0) + pow((a2-b2),2.0);
obj[1] = pow((xreal[0]+3.0),2.0) + pow((xreal[1]+1.0),2.0);
return;
}
#endif

/* Test problem VNT
# of real variables = 2
# of bin variables = 0
# of objectives = 3
# of constraints = 0
*/

#ifdef vnt
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[0] = 0.5*(xreal[0]*xreal[0] + xreal[1]*xreal[1]) + sin(xreal[0]*xreal[0] + xreal[1]*xreal[1]);
obj[1] = (pow((3.0*xreal[0] - 2.0*xreal[1] + 4.0),2.0))/8.0 + (pow((xreal[0]-xreal[1]+1.0),2.0))/27.0 + 15.0;
obj[2] = 1.0/(xreal[0]*xreal[0] + xreal[1]*xreal[1] + 1.0) - 1.1*exp(-(xreal[0]*xreal[0] + xreal[1]*xreal[1]));
return;
}
#endif

/* Test problem ZDT1
# of real variables = 30
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/

#ifdef zdt1
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double f1, f2, g, h;
int i;
f1 = xreal[0];
g = 0.0;
for (i=1; i<30; i++)
{
g += xreal[i];
}
g = 9.0*g/29.0;
g += 1.0;
h = 1.0 - sqrt(f1/g);
f2 = g*h;
obj[0] = f1;
obj[1] = f2;
return;
}
#endif

/* Test problem ZDT2
# of real variables = 30
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/

#ifdef zdt2
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double f1, f2, g, h;
int i;
f1 = xreal[0];
g = 0.0;
for (i=1; i<30; i++)
{
g += xreal[i];
}
g = 9.0*g/29.0;
g += 1.0;
h = 1.0 - pow((f1/g),2.0);
f2 = g*h;
obj[0] = f1;
obj[1] = f2;
return;
}
#endif

/* Test problem ZDT3
# of real variables = 30
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/

#ifdef zdt3
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double f1, f2, g, h;
int i;
f1 = xreal[0];
g = 0.0;
for (i=1; i<30; i++)
{
g += xreal[i];
}
g = 9.0*g/29.0;
g += 1.0;
h = 1.0 - sqrt(f1/g) - (f1/g)*sin(10.0*PI*f1);
f2 = g*h;
obj[0] = f1;
obj[1] = f2;
return;
}
#endif

/* Test problem ZDT4
# of real variables = 10
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/

#ifdef zdt4
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double f1, f2, g, h;
int i;
f1 = xreal[0];
g = 0.0;
for (i=1; i<10; i++)
{
g += xreal[i]*xreal[i] - 10.0*cos(4.0*PI*xreal[i]);
}
g += 91.0;
h = 1.0 - sqrt(f1/g);
f2 = g*h;
obj[0] = f1;
obj[1] = f2;
return;
}
#endif

/* Test problem ZDT5
# of real variables = 0
# of bin variables = 11
# of bits for binvar1 = 30
# of bits for binvar2-11 = 5
# of objectives = 2
# of constraints = 0
*/

#ifdef zdt5
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
int i, j;
int u[11];
int v[11];
double f1, f2, g, h;
for (i=0; i<11; i++)
{
u[i] = 0;
}
for (j=0; j<30; j++)
{
if (gene[0][j] == 1)
{
u[0]++;
}
}
for (i=1; i<11; i++)
{
for (j=0; j<4; j++)
{
if (gene[i][j] == 1)
{
u[i]++;
}
}
}
f1 = 1.0 + u[0];
for (i=1; i<11; i++)
{
if (u[i] < 5)
{
v[i] = 2 + u[i];
}
else
{
v[i] = 1;
}
}
g = 0;
for (i=1; i<11; i++)
{
g += v[i];
}
h = 1.0/f1;
f2 = g*h;
obj[0] = f1;
obj[1] = f2;
return;
}
#endif

/* Test problem ZDT6
# of real variables = 10
# of bin variables = 0
# of objectives = 2
# of constraints = 0
*/

#ifdef zdt6
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double f1, f2, g, h;
int i;
f1 = 1.0 - (exp(-4.0*xreal[0]))*pow((sin(4.0*PI*xreal[0])),6.0);
g = 0.0;
for (i=1; i<10; i++)
{
g += xreal[i];
}
g = g/9.0;
g = pow(g,0.25);
g = 1.0 + 9.0*g;
h = 1.0 - pow((f1/g),2.0);
f2 = g*h;
obj[0] = f1;
obj[1] = f2;
return;
}
#endif

/* Test problem BNH
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 2
*/

#ifdef bnh
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[0] = 4.0*(xreal[0]*xreal[0] + xreal[1]*xreal[1]);
obj[1] = pow((xreal[0]-5.0),2.0) + pow((xreal[1]-5.0),2.0);
constr[0] = 1.0 - (pow((xreal[0]-5.0),2.0) + xreal[1]*xreal[1])/25.0;
constr[1] = (pow((xreal[0]-8.0),2.0) + pow((xreal[1]+3.0),2.0))/7.7 - 1.0;
return;
}
#endif

/* Test problem OSY
# of real variables = 6
# of bin variables = 0
# of objectives = 2
# of constraints = 6
*/

#ifdef osy
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[0] = -(25.0*pow((xreal[0]-2.0),2.0) + pow((xreal[1]-2.0),2.0) + pow((xreal[2]-1.0),2.0) + pow((xreal[3]-4.0),2.0) + pow((xreal[4]-1.0),2.0));
obj[1] = xreal[0]*xreal[0] + xreal[1]*xreal[1] + xreal[2]*xreal[2] + xreal[3]*xreal[3] + xreal[4]*xreal[4] + xreal[5]*xreal[5];
constr[0] = (xreal[0]+xreal[1])/2.0 - 1.0;
constr[1] = 1.0 - (xreal[0]+xreal[1])/6.0;
constr[2] = 1.0 - xreal[1]/2.0 + xreal[0]/2.0;
constr[3] = 1.0 - xreal[0]/2.0 + 3.0*xreal[1]/2.0;
constr[4] = 1.0 - (pow((xreal[2]-3.0),2.0))/4.0 - xreal[3]/4.0;
constr[5] = (pow((xreal[4]-3.0),2.0))/4.0 + xreal[5]/4.0 - 1.0;
return;
}
#endif

/* Test problem SRN
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 2
*/

#ifdef srn
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[0] = 2.0 + pow((xreal[0]-2.0),2.0) + pow((xreal[1]-1.0),2.0);
obj[1] = 9.0*xreal[0] - pow((xreal[1]-1.0),2.0);
constr[0] = 1.0 - (pow(xreal[0],2.0) + pow(xreal[1],2.0))/225.0;
constr[1] = 3.0*xreal[1]/10.0 - xreal[0]/10.0 - 1.0;
return;
}
#endif

/* Test problem TNK
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 2
*/

#ifdef tnk
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
obj[0] = xreal[0];
obj[1] = xreal[1];
if (xreal[1] == 0.0)
{
constr[0] = -1.0;
}
else
{
constr[0] = xreal[0]*xreal[0] + xreal[1]*xreal[1] - 0.1*cos(16.0*atan(xreal[0]/xreal[1])) - 1.0;
}
constr[1] = 1.0 - 2.0*pow((xreal[0]-0.5),2.0) + 2.0*pow((xreal[1]-0.5),2.0);
return;
}
#endif

/* Test problem CTP1
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 2
*/

#ifdef ctp1
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
g = 1.0 + xreal[1];
obj[0] = xreal[0];
obj[1] = g*exp(-obj[0]/g);
constr[0] = obj[1]/(0.858*exp(-0.541*obj[0]))-1.0;
constr[1] = obj[1]/(0.728*exp(-0.295*obj[0]))-1.0;
return;
}
#endif

/* Test problem CTP2
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/

#ifdef ctp2
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = -0.2*PI;
a = 0.2;
b = 10.0;
c = 1.0;
d = 6.0;
e = 1.0;
g = 1.0 + xreal[1];
obj[0] = xreal[0];
obj[1] = g*(1.0 - sqrt(obj[0]/g));
exp1 = (obj[1]-e)*cos(theta) - obj[0]*sin(theta);
exp2 = (obj[1]-e)*sin(theta) + obj[0]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[0] = exp1/exp2 - 1.0;
return;
}
#endif

/* Test problem CTP3
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/

#ifdef ctp3
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = -0.2*PI;
a = 0.1;
b = 10.0;
c = 1.0;
d = 0.5;
e = 1.0;
g = 1.0 + xreal[1];
obj[0] = xreal[0];
obj[1] = g*(1.0 - sqrt(obj[0]/g));
exp1 = (obj[1]-e)*cos(theta) - obj[0]*sin(theta);
exp2 = (obj[1]-e)*sin(theta) + obj[0]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[0] = exp1/exp2 - 1.0;
return;
}
#endif

/* Test problem CTP4
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/

#ifdef ctp4
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = -0.2*PI;
a = 0.75;
b = 10.0;
c = 1.0;
d = 0.5;
e = 1.0;
g = 1.0 + xreal[1];
obj[0] = xreal[0];
obj[1] = g*(1.0 - sqrt(obj[0]/g));
exp1 = (obj[1]-e)*cos(theta) - obj[0]*sin(theta);
exp2 = (obj[1]-e)*sin(theta) + obj[0]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[0] = exp1/exp2 - 1.0;
return;
}
#endif

/* Test problem CTP5
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/

#ifdef ctp5
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = -0.2*PI;
a = 0.1;
b = 10.0;
c = 2.0;
d = 0.5;
e = 1.0;
g = 1.0 + xreal[1];
obj[0] = xreal[0];
obj[1] = g*(1.0 - sqrt(obj[0]/g));
exp1 = (obj[1]-e)*cos(theta) - obj[0]*sin(theta);
exp2 = (obj[1]-e)*sin(theta) + obj[0]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[0] = exp1/exp2 - 1.0;
return;
}
#endif

/* Test problem CTP6
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/

#ifdef ctp6
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = 0.1*PI;
a = 40.0;
b = 0.5;
c = 1.0;
d = 2.0;
e = -2.0;
g = 1.0 + xreal[1];
obj[0] = xreal[0];
obj[1] = g*(1.0 - sqrt(obj[0]/g));
exp1 = (obj[1]-e)*cos(theta) - obj[0]*sin(theta);
exp2 = (obj[1]-e)*sin(theta) + obj[0]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[0] = exp1/exp2 - 1.0;
return;
}
#endif

/* Test problem CTP7
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 1
*/

#ifdef ctp7
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
theta = -0.05*PI;
a = 40.0;
b = 5.0;
c = 1.0;
d = 6.0;
e = 0.0;
g = 1.0 + xreal[1];
obj[0] = xreal[0];
obj[1] = g*(1.0 - sqrt(obj[0]/g));
exp1 = (obj[1]-e)*cos(theta) - obj[0]*sin(theta);
exp2 = (obj[1]-e)*sin(theta) + obj[0]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[0] = exp1/exp2 - 1.0;
return;
}
#endif

/* Test problem CTP8
# of real variables = 2
# of bin variables = 0
# of objectives = 2
# of constraints = 2
*/

#ifdef ctp8
void test_problem (double *xreal, double *xbin, int **gene, double *obj, double *constr)
{
double g;
double theta, a, b, c, d, e;
double exp1, exp2;
g = 1.0 + xreal[1];
obj[0] = xreal[0];
obj[1] = g*(1.0 - sqrt(obj[0]/g));
theta = 0.1*PI;
a = 40.0;
b = 0.5;
c = 1.0;
d = 2.0;
e = -2.0;
exp1 = (obj[1]-e)*cos(theta) - obj[0]*sin(theta);
exp2 = (obj[1]-e)*sin(theta) + obj[0]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[0] = exp1/exp2 - 1.0;
theta = -0.05*PI;
a = 40.0;
b = 2.0;
c = 1.0;
d = 6.0;
e = 0.0;
exp1 = (obj[1]-e)*cos(theta) - obj[0]*sin(theta);
exp2 = (obj[1]-e)*sin(theta) + obj[0]*cos(theta);
exp2 = b*PI*pow(exp2,c);
exp2 = fabs(sin(exp2));
exp2 = a*pow(exp2,d);
constr[1] = exp1/exp2 - 1.0;
return;
}
#endif

以上, 为NSGA-II 源码中给出的几个测试函数, 其中无限制条件的测试函数不需解释, 对有限制条件的做一定说明。


多目标遗传算法 ------ NSGA-II (部分源码解析)目标函数  problemdef.c_源码解析


根据比对, 可以直到算法中, 将所有的约束条件都转换为  >=0  。

所以, 违反限制条件的 约束函数值  均小于 0  。

TNK 测试函数有一定特殊性,  因为其中存在  无意义的个体, 即 X2 为0  ,   这里对该情况下的  约束 函数1   直接赋值为  -1  。

代码,如下:

if (xreal[1] == 0.0)
{
constr[0] = -1.0;
}


举报

相关推荐

0 条评论