📄 crossover.c
字号:
/* Crossover routines */# include <stdio.h># include <stdlib.h># include <math.h># include "global.h"# include "rand.h"/* Function to cross two individuals */void crossover (individual *parent1, individual *parent2, individual *child1, individual *child2){ if (nreal!=0) { realcross (parent1, parent2, child1, child2); } return;}/* Routine for real variable SBX crossover */void realcross (individual *parent1, individual *parent2, individual *child1, individual *child2){ int i; long double rand; long double y1, y2, yl, yu; long double c1, c2; long double alpha, beta, betaq; if (randomperc() <= pcross_real) { nrealcross++; for (i=0; i<nreal; i++) { if (randomperc()<=0.5 ) { if (fabs(parent1->xreal[i]-parent2->xreal[i]) > EPS) { if (parent1->xreal[i] < parent2->xreal[i]) { y1 = parent1->xreal[i]; y2 = parent2->xreal[i]; } else { y1 = parent2->xreal[i]; y2 = parent1->xreal[i]; } yl = min_realvar[i]; yu = max_realvar[i]; rand = randomperc(); beta = 1.0 + (2.0*(y1-yl)/(y2-y1)); alpha = 2.0 - pow(beta,-(eta_c+1.0)); if (rand <= (1.0/alpha)) { betaq = pow ((rand*alpha),(1.0/(eta_c+1.0))); } else { betaq = pow ((1.0/(2.0 - rand*alpha)),(1.0/(eta_c+1.0))); } c1 = 0.5*((y1+y2)-betaq*(y2-y1)); beta = 1.0 + (2.0*(yu-y2)/(y2-y1)); alpha = 2.0 - pow(beta,-(eta_c+1.0)); if (rand <= (1.0/alpha)) { betaq = pow ((rand*alpha),(1.0/(eta_c+1.0))); } else { betaq = pow ((1.0/(2.0 - rand*alpha)),(1.0/(eta_c+1.0))); } c2 = 0.5*((y1+y2)+betaq*(y2-y1)); if (c1<yl) c1=yl; if (c2<yl) c2=yl; if (c1>yu) c1=yu; if (c2>yu) c2=yu; if (randomperc()<=0.5) { child1->xreal[i] = c2; child2->xreal[i] = c1; } else { child1->xreal[i] = c1; child2->xreal[i] = c2; } } else { child1->xreal[i] = parent1->xreal[i]; child2->xreal[i] = parent2->xreal[i]; } } else { child1->xreal[i] = parent1->xreal[i]; child2->xreal[i] = parent2->xreal[i]; } } } else { for (i=0; i<nreal; i++) { child1->xreal[i] = parent1->xreal[i]; child2->xreal[i] = parent2->xreal[i]; } } return;}/* Routine for two point binary crossover */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -