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

📄 crossover.c

📁 多目标遗传算法的程序
💻 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 + -