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

📄 heredity.c

📁 遗传算法
💻 C
字号:
 #define R 7   // x的位数
 #define M 35 //群体大小
 #define T 20//遗传运算终止进化代数
 #include <math.h>
 float P[M+1][R+2];

  ////////////////////////////// //函数/////////////////////////////
 float f(float x)
 {
    return x*sin(10*3.14*x)+1.0;
 }

  ////////////////////////    //10的a次方//////////////////////////
 int power(int a)
 {  int i,power=1;
    for(i=1;i<=a;i++) power=power*10;
    return power;
 }
 ////////////////////////////初始化群体算法 ////////////////////////////
 init ()   ////// O(m*r)
 {
    int i,j;
    printf("\n\n第0代:\n");

    for(i=1;i<=M;i++)
    {

        P[i][1]=rand()%3;// P[i][1]在0,1,2之间产生
        P[i][0]=P[i][1];

        for(j=2;j<=R;j++)
        {
            P[i][j]=rand()%10;    //P[i][j]在0~9之间产生

            P[i][0]=P[i][0]+P[i][j]/power(j-1);

        }
        P[i][0]=P[i][0]-1;  //设置P[i][0]为表现型

    }


 }


  ///////////////////////遗传算法,包含选择,交叉,变异/////////// //////
 YiChuan(t)
 {  float MAX=-1; //群体种的最大值 ,初定为最小值
    float MIN=3; //群体种的最小值 ,初定为最大值
    float sum =0; //函数和
    int k=1,a,i,j,r1,r2;
    int  m ;//基因座


    for(i=1;i<=M;i++)   ////// O(m*r)
    {
        sum+=f(P[i][0]);  //函数求和
        if(MAX< f(P[i][0]))
        {
         MAX=f(P[i][0]);
         r1=i;
        }
        /////////////////选择算法 ///////////////////////////////////////////////
     if(MIN>f(P[i][0]))
        {
          MIN=f(P[i][0]);
          r2=i;
        }

    for(j=0;j<=R;j++)
    P[r2][j]=P[r1][j];
    }
    printf("群体中最大值为:%f\n", MAX );
    printf("群体的平均值为:%f\n",sum/M);


     printf("\n\n第%d代:\n",t+1);
     


     //////////////////////////////////交叉互换  ///////////////////////////
    for(i=1;i<=M/2;i++)     ////// O(m)
    {

        m=rand()%R;//随机产生基因座
        if(m)  //m=0时不交换
        {
            a=P[i][m];  //中间值a
            P[i][m]=P[i+M/2][m];
            P[i+M/2][m]=a;  //将第i个与第i+M/2个配对,交叉互换一个基因
        }
    }
    /////////////////////////变异 ////////////////////////////////////////
    for(i=1;i<=M;i++)       ////// O(m)
    {
        m=rand()*10%R;//随机产生基因座
        if(m&m!=1) P[i][m]=rand()%10;
        //在相应的基因座上再取随机数 ,m=0,1时不变异
    }

    for(i=1;i<=M;i++)        ////// O(m*r)
    {

        P[i][0]=P[i][1];
        for(j=2;j<=R;j++)
        {
            P[i][0]=P[i][0]+P[i][j]/power(j-1);
        }
        P[i][0]=P[i][0]-1;  //设置P[i][0]为表现型
    }

 }





 main()
 {  float MAX=-1; //群体种的最大值
    float sum =0; //函数和
    int t=0,i;
    init();   //初始化群体

    while(t<T)   //T代遗传     ////// O(t)
    {
       YiChuan(t);
       t++;
    }
    for(i=1;i<=M;i++)       ////// O(m)
    {
        sum+=f(P[i][0]);  //函数求和
        if(MAX< f(P[i][0]))
        {
         MAX=f(P[i][0]);
        }
    }
    printf("群体中最大值为:%f\n", MAX );
    printf("群体的平均值为:%f\n",sum/M);

 }

⌨️ 快捷键说明

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