多目标遗传算法 ------ 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 源码中给出的几个测试函数, 其中无限制条件的测试函数不需解释, 对有限制条件的做一定说明。
根据比对, 可以直到算法中, 将所有的约束条件都转换为 >=0 。
所以, 违反限制条件的 约束函数值 均小于 0 。
TNK 测试函数有一定特殊性, 因为其中存在 无意义的个体, 即 X2 为0 , 这里对该情况下的 约束 函数1 直接赋值为 -1 。
代码,如下:
if (xreal[1] == 0.0) { constr[0] = -1.0; }
本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。
如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。
posted on 2017-01-09 16:05 Angry_Panda 阅读(1822) 评论(2) 编辑 收藏 举报