呼文韬's profile算法公敌PhotosBlogListsMore Tools Help

Blog


    7/20/2008

    baidu算法问题

     
    //用glp法生成初始种群
    //编码方式为实数编码
    //选择方法为随机遍历
    //采用了精英保存策略
    //采用了自适应的交叉率和变异率
    //采用了与模拟退火算法相结合的尺度变换
    //程序可自动计算个体间的海明距离,然后根据结果进行最佳配对
    //采用了最大信息保留的交叉算法
    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <iostream.h>
    #include <iomanip.h>
    #include <time.h>
    #include <windows.h>
    #define IM1 2147483563
    #define IM2 2147483399
    #define AM (1.0/IM1)
    #define IMM1 (IM1-1)
    #define IA1 40014
    #define IA2 40692
    #define IQ1 53668
    #define IQ2 52774
    #define IR1 12211
    #define IR2 3791
    #define NTAB 32
    #define NDIV (1+IMM1/NTAB)
    #define EPS 1.2e-7
    #define RNMX (1.0-EPS)
    #define zhizhenjuli 0.005
    #define PI 3.14159265358
    #define T0 10000//温度要取得很高才行。
    #define zhongqunshu1 200
    #define zuobianjie -1000
    #define youbianjie 1000
    #define lanmuteshuliang 5
    unsigned int seed=0; //seed 为种子,要设为全局变量
    void mysrand(long int i) //初始化种子
    {
    seed = -i;
    }
    long a[1];
    double hundun;
    double c=3.95;
    //设置全局变量
    struct individual
    {
     double *chrom;  //染色体;
     double geti;//变量值
     double shiyingdu; //目标函数的值;
     double fitness;   //变换后的适应度值;
    };
    struct haiming
    {
     int bianhao;//编号
     double geti;
     int haimingchazhi;//海明差值
    };
    struct youxuan//确定交叉后的优选个体
    {
     double geti;
     double shiyingdu;
    };
    double fangcha;   //目标函数值的方差
    individual *zuiyougeti;//精英保存策略
    double zuidafangcha;//到本代为止最优方差
    int zhongqunshu;   //种群大小
    individual *nowpop;//当前代
    individual *newpop;//新一代
    double sumfitness;//当代的总适应度fitness
    double sumshiyingdu;//当代的总适应度shiyingdu
    double maxfitness;//最大适应度
    double avefitness;//平均适应度
    double maxshiyingdu;//最大适应度
    double aveshiyingdu;//平均适应度
    float pc;//交叉概率
    float pm;//变异概率
    int lchrom;//染色体长度
    int maxgen;//最大遗传代数
    int gen;//遗传代数
    //函数
    int flipc(double ,double );//判断是否交叉
    int flipm(double );//判断是否变异
    int rnd(int low,int high);//产生low与high之间的任意数
    void initialize();//遗传算法初始化
    void preselectfitness(); //计算sumfiness,avefitness,maxfitness
    void generation();
    double suijibianli();//产生随机遍历指针
    int fuzhi(float );//选择要复制的个体
    void crossover(individual ,individual ,individual &,individual &);//交叉
    void bianyi(individual &);//变异
    void mubiaohanshu(individual &);//计算适应度
    void chidubianhuan(individual &);//对shiyingdu进行尺度变换赋给fitness
    double ran1(long *);//随机数初始
    double gasdev(long *idum);//高斯随机数
    void bianma(double bianliang,unsigned *p);//编码
    double yima(unsigned *p);
    void guanjiancanshujisuan();//计算shiyingdu,根据shiyingdu计算sumshiyingdu,对shiyingdu进行尺度变换变成fitness,根据fitness计算sumfitness,avefitness,maxfitness
    void jingyingbaoliu();//精英保存的实现
    void zuidafangchabaoliu();//最大方差值的保存
    void glp(int n,int s,int *,int (*)[1],float (*)[1]);//glp生成函数
    double hundunsuiji();
    int haimingchazhijisuan(double,double);//计算个体的海明值
    BOOL Exist(int Val, int Num, int *Array);//判断一个数在前面是否出现过
    int cmpfitness(const void *p1,const void *p2)
    {
     float i=((individual *)p1)->shiyingdu;//现在是按照"适应度"排序,改成"个体"的话就是按照"个体"排序
     float j=((individual *)p2)->shiyingdu;
     return i<j ? -1:(i==j ? 0:1);//现在是按升序牌排列,将1和-1互换后就是按降序排列
    }
    int cmpshiyingdu(const void *p1,const void *p2)
    {
     float i=((individual *)p1)->shiyingdu;//现在是按照"个体"排序
     float j=((individual *)p2)->shiyingdu;
     return i<j ? -1:(i==j ? 0:1);//现在是按升序牌排列,将1和-1互换后就是按降序排列
    }
    int cmpshiyingdujiang(const void *p1,const void *p2)
    {
     float i=((youxuan *)p1)->shiyingdu;
     float j=((youxuan *)p2)->shiyingdu;
     return i<j ? 1:(i==j ? 0:-1);//现在是按降序牌排列,将1和-1互换后就是按升序排列
    }
    int cmpgeti(const void *p1,const void *p2)
    {
     float i=((individual *)p1)->geti;//现在是按照"个体值"排序
     float j=((individual *)p2)->geti;
     return i<j ? -1:(i==j ? 0:1);//现在是按升序牌排列,将1和-1互换后就是按降序排列
    }
    int cmphaimingchazhi(const void *p1,const void *p2)
    {
     float i=((haiming *)p1)->haimingchazhi;//现在是按照"适应度"排序,改成"个体"的话就是按照"个体"排序
     float j=((haiming *)p2)->haimingchazhi;
     return i<j ? 1:(i==j ? 0:-1);//现在是按降序牌排列,将-1和1互换后就是按升排列
    }
    int cmp1(const void *p1,const void *p2)
    {
     int i= *(int*)p1;
     int j= *(int*)p2;
     return i<j ? 1:(i==j ? 0:-1);//现在是按降序牌排列,将1和-1互换后就是按升序排列
    }
    void main()
    {
     initialize();
     //cout<<zuiyougeti->geti<<" "<<-zuiyougeti->shiyingdu<<endl;/////////////
     for(gen=1;gen<maxgen;gen++)
     { generation();
     }
      jingyingbaoliu();
     cout<<setiosflags(ios::fixed)<<setprecision(6)<<"最小的n为"<<" "<<setiosflags(ios::fixed)<<setprecision(9)<<(-zuiyougeti->shiyingdu)<<endl;////////////////
     delete [] newpop;
     delete [] nowpop;
     delete [] zuiyougeti;
     system("pause");
    }
    void initialize()
    {
     hundun=ran1(a);
     while(hundun==0||hundun==0.25||hundun==0.75||hundun==1)
     {
      hundun=ran1(a);
     }
     int q[zhongqunshu1][1],s=1;
     float xx[zhongqunshu1][1];//生成的glp用x储存
     int h[1]={1};//生成向量
     zuiyougeti=new individual;//最优个体的生成
     zhongqunshu=200;//种群数量
     nowpop=new individual[zhongqunshu1];//当代
     newpop=new individual[zhongqunshu1];//新一代
     maxgen=15;//最大代数
     gen=0;//起始代
     lchrom=22;//基因数量的初始化
     mysrand(time(0));//随机数种子
        a[0]=seed;//随机数种子
     //对最优个体的初始化
      zuiyougeti->geti=0;
           zuiyougeti->fitness=0;
         zuiyougeti->shiyingdu=-6.67e+66;
      zuidafangcha=0;
        glp(zhongqunshu,s,h,q,xx);
    // for(int i=0;i<zhongqunshu1;i++)//产生初始种群
    // {
    //  for(int j=0;j<s;j++)
    //  {
    //   nowpop[i].geti=zuobianjie+(youbianjie-(zuobianjie))*xx[i][j];
    //  }
    // }
       for(int i=0;i<zhongqunshu1;i++)//产生初始种群
       {
        nowpop[i].geti=zuobianjie+(youbianjie-(zuobianjie))*ran1(a);
       }
     //nowpop[0].geti=999;//////////////////////////
     guanjiancanshujisuan();
     zuidafangchabaoliu();//最大方差值的保存
     jingyingbaoliu(); //精英保留的实现
     guanjiancanshujisuan();//计算shiyingdu,根据shiyingdu计算sumshiyingdu,对shiyingdu进行尺度变换变成fitness,根据fitness计算sumfitness,avefitness,maxfitness
     zuidafangchabaoliu();//最大方差值的保存
    }
    void jingyingbaoliu() //精英保留的实现
    {
     individual *zuiyougetiguodu;
     zuiyougetiguodu=new individual[zhongqunshu1];//建立一个过渡数组
     for(int i=0;i<zhongqunshu;i++)//将当代个体复制到过渡数组中
      zuiyougetiguodu[i]=nowpop[i];
     qsort(zuiyougetiguodu,zhongqunshu1,sizeof(individual),&cmpfitness);//按fitness升序排序
          // cout<<"zuiyougetiguodu适应度:"<<zuiyougetiguodu[zhongqunshu1-1].shiyingdu<<endl;///////////
     // cout<<"zuiyougeti适应度:"<<zuiyougeti->shiyingdu<<endl;///////////////////
      //system("pause");
      if(zuiyougetiguodu[zhongqunshu-1].shiyingdu>zuiyougeti->shiyingdu)
      {
       *zuiyougeti=zuiyougetiguodu[zhongqunshu1-1];//如果最优个体的fitness比当代最大的fitness小则用当代的代替之
      //cout<<"zuiyougetiguodu个体:"<<zuiyougetiguodu[zhongqunshu1-1].geti<<endl;/////////////
      //cout<<"zuiyougeti个体:"<<zuiyougeti->geti<<endl;/////////////
      }
      else
       nowpop[rnd(0,(zhongqunshu1-1))]=*zuiyougeti;//否则的话从当代中随机挑选一个用最优个体代替之
      delete [] zuiyougetiguodu;//释放过渡数组
    }
    void zuidafangchabaoliu()//最大方差值的保存
    {
     if(fangcha>zuidafangcha)
      zuidafangcha=fangcha;
    }
    void guanjiancanshujisuan()//计算shiyingdu,根据shiyingdu计算sumshiyingdu,对shiyingdu进行尺度变换变成fitness,根据fitness计算sumfitness,avefitness,maxfitness
    {
     for(int i=0;i<zhongqunshu;i++)//计算shiyingdu
      mubiaohanshu(nowpop[i]);
     sumshiyingdu=0;
     for(i=0;i<zhongqunshu;i++)
      sumshiyingdu=sumshiyingdu+nowpop[i].shiyingdu;
     aveshiyingdu=sumshiyingdu/zhongqunshu;
     fangcha=0;
     for(i=0;i<zhongqunshu;i++)//求方差
      fangcha+=pow((nowpop[i].shiyingdu-aveshiyingdu),2)/zhongqunshu;
     for(i=0;i<zhongqunshu;i++)//对shiyingdu进行尺度变换变成fitness
      chidubianhuan(nowpop[i]);
     preselectfitness();//根据fitness计算sumfitness,avefitness,maxfitness
    }
    void mubiaohanshu(individual &bianliang)//计算shiyingdu
    {
     double ping_fang,cheng_fang;
     ping_fang=100*pow(bianliang.geti,2);
     cheng_fang=pow(2,bianliang.geti);
     if(ping_fang<cheng_fang)
      bianliang.shiyingdu=-bianliang.geti;
    }
    void chidubianhuan(individual &bianliang)//对shiyingdu进行尺度变换变成fitness
    {
     double T;//退火温度
     T=T0*(pow(0.99,(gen+1-1)));
     double sum=0;
        for(int j=0;j<zhongqunshu;j++)
      sum+=exp(nowpop[j].shiyingdu/T);
     bianliang.fitness=exp(bianliang.shiyingdu/T)/sum;//算出fitness
    }
    void preselectfitness()//根据fitness计算sumfitness,avefitness,maxfitness
    {
     int j;
     sumfitness=0;
     for(j=0;j<zhongqunshu;j++)
      sumfitness+=nowpop[j].fitness;
     individual *guodu;
     guodu=new individual[zhongqunshu1];
     for(j=0;j<zhongqunshu;j++)
      guodu[j]=nowpop[j];
     qsort(guodu,zhongqunshu1,sizeof(individual),&cmpfitness);
     maxfitness=guodu[zhongqunshu1-1].fitness;
     avefitness=sumfitness/zhongqunshu1;
     delete [] guodu;
    }
    void generation()
    {
     individual fuqin1,fuqin2,*pipeiguodu,*pipeichi;
     int *peiduishuzu;//用来存放产生的随机配对
     pipeiguodu=new individual[zhongqunshu1];
     pipeichi=new individual[zhongqunshu1];
     peiduishuzu=new int[zhongqunshu1];
     haiming *haimingrongqi;
     haimingrongqi=new haiming[zhongqunshu1];
     int member1,member2,j=0,fuzhijishu=0,i=0,temp=0,tt=0;
     float zhizhen;
     //随机遍历的实现
     for(zhizhen=suijibianli();zhizhen<1;(zhizhen=zhizhen+zhizhenjuli))//设定指针1/66
     {
      pipeichi[fuzhijishu]=nowpop[fuzhi(zhizhen)];
      fuzhijishu++;//复制计数
     }
    // for(int iii=0;iii<10;iii++)
    // {
    //  if(pipeichi[iii].geti<zuobianjie||pipeichi[iii].geti>youbianjie)
    //  cout<<pipeichi[iii].geti<<" ";///////////
    // }
    // cout<<endl;////////////////
       // system("pause");//////////////////////////
     //交叉与变异的实现
     //交叉
        for(i=0;i<zhongqunshu1;i++)
     {
      peiduishuzu[i]=-1;
     }
     
     for(i=0;i<zhongqunshu1;i++)
     {
      haimingrongqi[i].geti=pipeichi[i].geti;
     }
     //cout<<haimingrongqi[1].geti<<endl;//////////////
     //system("pause");//////////////////////////
     double rou;//进化因子
     double avehai=0;//平均海明值
     int sumchahainei=0;//单个个体和其他个体海明距离和
     int sumchahaiwai=0;//总的海明距离和
     int jisuancishu=0;//求海明和的次数
     for(int ii=0;ii<zhongqunshu1-1;ii++)
     {
      sumchahainei=0;
            //cout<<"ii的值:"<<haimingrongqi[ii].geti<<endl;//////////
      for(int jj=ii+1;jj<zhongqunshu1;jj++)
      {
       //cout<<"jj的值:"<<haimingrongqi[jj].geti<<endl;//////////
       //system("pause");//////////////////////////
       sumchahainei=sumchahainei+haimingchazhijisuan(haimingrongqi[ii].geti,haimingrongqi[jj].geti);
      }
      sumchahaiwai=sumchahaiwai+sumchahainei;
     }
     //cout<<"平均海明差:"<<sumchahaiwai<<endl;////////////////////////////
     //system("pause");///////////////
    // cout<<endl;
     for(ii=1;ii<=zhongqunshu1-1;ii++)
     {
      jisuancishu=jisuancishu+(zhongqunshu1-ii);
     }
    //  cout<<jisuancishu<<endl;////////////////////////////
    // system("pause");///////////////
    // cout<<endl;
     rou=exp(-pow(gen,2)/(2*pow(maxgen/3,2)));
     avehai=(double)(rou*sumchahaiwai/jisuancishu);
    // cout<<rou<<" "<<avehai<<" "<<jisuancishu<<" "<<sumchahaiwai<<endl;////////////////////////////
      // system("pause");///////////////
     for (i=0; i<zhongqunshu1; i++)
     {
      temp =rnd(0,zhongqunshu1-1); //产生值在0-zhongqunshu1-1的随机数
       while(Exist(temp, i, peiduishuzu))//判断产生的随机数是否已经产生过,如果是,则再产生一个随机数
       {
        temp =rnd(0,zhongqunshu1-1);
       }
       //如果没有的话,则把产生的随机数放在peiduishuzu中
        *(peiduishuzu+i) = temp;
       // cout<<temp<<endl;/////////////////////////
        int t=zhongqunshu1;
           j=0;
        while(Exist(j,i,peiduishuzu)||haimingchazhijisuan(haimingrongqi[temp].geti,haimingrongqi[j].geti)<avehai)
        {
         //cout<<"编号:"<<j<<"海明差值内:"<<haimingchazhijisuan(haimingrongqi[temp].geti,haimingrongqi[j].geti)<<" "<<"是否存在:"<<Exist(j,i,peiduishuzu)<<endl;//////
         // system("pause");//////////////
         j=j+1;
         t--;
         if(t<1)
          break;
        }
       // if(t>=1)
       // cout<<"编号:"<<j<<"海明差值外:"<<haimingchazhijisuan(haimingrongqi[temp].geti,haimingrongqi[j].geti)<<" "<<"是否存在:"<<Exist(j,i,peiduishuzu)<<endl;//////
         // system("pause");//////////////
       // cout<<j<<" "<<t<<endl;///////////
       // system("pause");/////
        if(t>=1)
        {
         i=i+1;
         *(peiduishuzu+i)=j;
        }
        else
        {
         haiming *haimingchazhirongqi;
         haimingchazhirongqi=new haiming[zhongqunshu1];
         for(j=0;j<zhongqunshu1;j++)
         {
          haimingchazhirongqi[j].haimingchazhi=haimingchazhijisuan(haimingrongqi[temp].geti,haimingrongqi[j].geti);
          haimingchazhirongqi[j].bianhao=j;
         }
         qsort(haimingchazhirongqi,zhongqunshu1,sizeof(haiming),&cmphaimingchazhi);
         int m=0;
         while(Exist(haimingchazhirongqi[m].bianhao,i,peiduishuzu)||haimingchazhirongqi[m].bianhao==temp)
         {
          m=m+1;
         }
         i=i+1;
         *(peiduishuzu+i)=haimingchazhirongqi[m].bianhao;
        // cout<<"m="<<m<<endl;///////////////////////////////////
        // cout<<"配对编号:"<<haimingchazhirongqi[m].bianhao<<endl;///////
        // cout<<"海明差值:"<<haimingchazhirongqi[m].haimingchazhi<<endl;///////
                       // cout<<"海明差值小:"<<haimingchazhirongqi[m+2].haimingchazhi<<endl;///////
        // system("pause");//////////////////////////////////
        }
      
     }
    //    for(int iii=0;iii<10;iii++)///////////////////
    // {
    //  cout<<pipeichi[peiduishuzu[iii]].geti<<endl;///////////////
    // }
    //    system("pause");//////////////////////
    //    cout<<endl;
    // qsort(peiduishuzu,200,sizeof(int),&cmp1);//////////////
    // cout<<endl;/////////////////////////////////
    //   for(int iii=0;iii<200;iii++)///////////////////
    // {
    //  cout<<peiduishuzu[iii]<<endl;///////////////
    // }
    //    system("pause");//////////////////////
    //    cout<<endl;
     for(i=0;i<zhongqunshu1-1;i=i+2)
     {
      fuqin1=pipeichi[peiduishuzu[i]];
      fuqin2=pipeichi[peiduishuzu[i+1]];
      crossover(fuqin1,fuqin2,newpop[i],newpop[i+1]);
     }
     for(j=0;j<zhongqunshu1;j++)
     {
      //if(newpop[j].geti<-1000)
       //cout<<"个体数值小于下界了";
      nowpop[j].geti=newpop[j].geti;
     }
     //
     guanjiancanshujisuan();
     //变异的实现
        for(j=0;j<zhongqunshu;j++)
     {
      bianyi(nowpop[j]);
     }
     //
     guanjiancanshujisuan();
     //精英保留的实现
     jingyingbaoliu();
      //
     guanjiancanshujisuan();
     delete [] haimingrongqi;
     delete [] peiduishuzu;
     delete [] pipeichi;
     delete [] pipeiguodu;
    }
    void crossover(individual parent1,individual parent2,individual &child1,individual &child2)//交叉
    {
     int j=0,i=0;
     if(flipc(parent1.fitness,parent2.fitness))
     {
      //cout<<"父个体1:"<<parent1.geti<<endl;////////////////
      //cout<<"父个体2:"<<parent2.geti<<endl;////////////////
      int xingcunzhe;
      youxuan *zuihouliangge;//将优选群的个体按高斯变异的结果排序(高斯变异为了验证是否是信息最大化点),取适应度最大的两个
      individual *jingzhengqun,*youxuanqun,*beiyongyouxuanqun;
      int *I,*index,*red;
      double lanmute,*getipingjunhaiming;
      I=new int[2*lanmuteshuliang+2];
      index=new int[2*lanmuteshuliang+2];
          jingzhengqun=new individual[(2*lanmuteshuliang+2)];//设置竞争群的大小,用于交叉的栏目特暂时设为5个
      youxuanqun=new individual[(2*lanmuteshuliang+2)];//优选群的大小最后为信息最大化选择后剩下的个体
      beiyongyouxuanqun=new individual[(2*lanmuteshuliang+2)];
            getipingjunhaiming=new double[(2*lanmuteshuliang+2)];//用来储存个体平均海明距离
      red=new int[(2*lanmuteshuliang+2)];//用来储存冗余信息
      zuihouliangge=new youxuan[(2*lanmuteshuliang+2)];
      for(j=0;j<(2*lanmuteshuliang+2);j++)
      {
       I[j]=0;
       index[j]=1;
      }
      for(j=0;j<lanmuteshuliang;j++)
      {
       lanmute=0.5+ran1(a)*(1.5-0.5);
          jingzhengqun[i].geti=lanmute*parent1.geti+(1-lanmute)*parent2.geti;
       jingzhengqun[i+1].geti=lanmute*parent2.geti+(1-lanmute)*parent1.geti;
       while(jingzhengqun[i].geti<zuobianjie||jingzhengqun[i].geti>youbianjie||jingzhengqun[i+1].geti<zuobianjie||jingzhengqun[i+1].geti>youbianjie)
       {
        lanmute=0.5+ran1(a)*(1.5-0.5);
              jingzhengqun[i].geti=lanmute*parent1.geti+(1-lanmute)*parent2.geti;
           jingzhengqun[i+1].geti=lanmute*parent2.geti+(1-lanmute)*parent1.geti;
       }
       i=i+2;
      }
      jingzhengqun[i].geti=parent1.geti;
      jingzhengqun[i+1].geti=parent2.geti;
      //for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
      //{
      // cout<<jingzhengqun[j].geti<<endl;
      //}
     // system("pause");///////////////////////////////////
      for(j=0;j<(2*lanmuteshuliang+2);j++)
      {
       mubiaohanshu(jingzhengqun[j]);
      }
     // for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
     // {
     //  cout<<jingzhengqun[j].shiyingdu<<endl;
     // }
     // system("pause");///////////////////////////////////
     // for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
     // {
     //  cout<<jingzhengqun[j].geti<<endl;
     // }
     // system("pause");///////////////////////////////////
      qsort(jingzhengqun,(2*lanmuteshuliang+2),sizeof(individual),&cmpgeti);//将竞争群按空间排序
     // for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
     // {
     //  cout<<jingzhengqun[j].geti<<endl;
     // }
     // system("pause");///////////////////////////////////
     // for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
     // {
     //  cout<<jingzhengqun[j].shiyingdu<<endl;
     // }
     // system("pause");///////////////////////////////////
      //判断是否是峰值附近
            for(j=0;j<(2*lanmuteshuliang+1);j++)
      {
       if(jingzhengqun[j].shiyingdu<jingzhengqun[j+1].shiyingdu)
       {
        I[j]=1;
       }
       else if(jingzhengqun[j].shiyingdu>=jingzhengqun[j+1].shiyingdu)
       {
        I[j]=-1;
       }
      }
      I[(2*lanmuteshuliang+1)]=I[2*lanmuteshuliang];
     // for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
     // {
     // cout<<I[j]<<endl;
     // }
     // system("pause");///////////////////////////////////
            for(j=0;j<(2*lanmuteshuliang+1);j++)
      {
       if(I[j]==I[j+1])
        index[j]=0;
      }
      //for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
      //{
      // cout<<index[j]<<endl;
      //}
      //system("pause");///////////////////////////////////
            //判断冗余度
      //求平均海明距离
        double avehai=0;//平均海明值
     int sumchahainei=0;//单个个体和其他个体海明距离和
     int sumchahaiwai=0;//总的海明距离和
     int jisuancishu=0;//求海明和的次数
     for(int ii=0;ii<(2*lanmuteshuliang+1);ii++)
     {
      sumchahainei=0;
            //cout<<"ii的值:"<<haimingrongqi[ii].geti<<endl;//////////
      for(int jj=ii+1;jj<(2*lanmuteshuliang+2);jj++)
      {
       //cout<<"jj的值:"<<haimingrongqi[jj].geti<<endl;//////////
       //system("pause");//////////////////////////
       sumchahainei=sumchahainei+haimingchazhijisuan(jingzhengqun[ii].geti,jingzhengqun[jj].geti);
      }
      sumchahaiwai=sumchahaiwai+sumchahainei;
     }
     //cout<<sumchahaiwai<<endl;///////////
     for(ii=1;ii<=(2*lanmuteshuliang+1);ii++)
     {
      jisuancishu=jisuancishu+((2*lanmuteshuliang+2)-ii);
     }
     avehai=(double)(sumchahaiwai/jisuancishu);
    // cout<<"平均海明距离:"<<avehai<<endl;////////////////////
     //system("pause");////////////////////
        //求单个个体平均海明距离
     for(ii=0;ii<(2*lanmuteshuliang+2);ii++)
     {
      getipingjunhaiming[ii]=0;
      for(int jj=0;jj<(2*lanmuteshuliang+2);jj++)
      {
       getipingjunhaiming[ii]=getipingjunhaiming[ii]+haimingchazhijisuan(jingzhengqun[ii].geti,jingzhengqun[jj].geti);
      }
      getipingjunhaiming[ii]= getipingjunhaiming[ii]/(2*lanmuteshuliang+1);
     }
    //   for(ii=0;ii<(2*lanmuteshuliang+2);ii++)////////////////////////
    // {////////////////
    //  cout<<getipingjunhaiming[ii]<<endl;///////////
    // }////////////////////
    // system("pause");////////////////////
        for(ii=0;ii<(2*lanmuteshuliang+2);ii++)
     {
      if(getipingjunhaiming[ii]>=avehai)
       red[ii]=1;
      else
       red[ii]=0;
     }
    // for(ii=0;ii<(2*lanmuteshuliang+2);ii++)////////////////////////
    // {////////////////
    //  cout<<red[ii]<<endl;///////////
    // }/////////////////////
    // system("pause");////////////////////
     ii=0;
     xingcunzhe=0;
        for(ii=0;ii<(2*lanmuteshuliang+2);ii++)
     {
      if(index[ii]!=0||red[ii]!=0)
      {
       youxuanqun[xingcunzhe].geti=jingzhengqun[ii].geti;
       xingcunzhe++;
      }
     }
    // cout<<"幸存者数量:"<<xingcunzhe<<endl;//////////////////
     //   for(ii=0;ii<xingcunzhe;ii++)////////////////////////
    // {////////////////
    //  mubiaohanshu(youxuanqun[ii]);
    //  cout<<"个体:"<<youxuanqun[ii].geti<<" "<<"适应度:"<<youxuanqun[ii].shiyingdu<<endl;///////////
    // }/////////////////////
      //  system("pause");////////////////////
        for(ii=0;ii<xingcunzhe;ii++)////////////////////////
     {
      //zuihouliangge[ii].geti=youxuanqun[ii].geti;
      zuihouliangge[ii].shiyingdu=0;
     }
     //对优选群进行高斯变异
     if(xingcunzhe>=2)
     {
      for(int jjj=0;jjj<20;jjj++)
      {
      
       for(ii=0;ii<xingcunzhe;ii++)
       {
        mubiaohanshu(youxuanqun[ii]);
       }
          for(ii=0;ii<xingcunzhe;ii++)
       {
           beiyongyouxuanqun[ii].geti=youxuanqun[ii].geti+gasdev(a);
        while(beiyongyouxuanqun[ii].geti<zuobianjie||beiyongyouxuanqun[ii].geti>youbianjie)
        {
         beiyongyouxuanqun[ii].geti=youxuanqun[ii].geti+gasdev(a);
        }
       }
          for(ii=0;ii<xingcunzhe;ii++)
       {
           mubiaohanshu(beiyongyouxuanqun[ii]);
       }
           for(ii=0;ii<xingcunzhe;ii++)
       {
           if(beiyongyouxuanqun[ii].shiyingdu>youxuanqun[ii].shiyingdu)
        {
            youxuanqun[ii].geti=beiyongyouxuanqun[ii].geti;
        }
       }
      }
          for(ii=0;ii<xingcunzhe;ii++)
      {
       mubiaohanshu(youxuanqun[ii]);
      }
     
     //   for(ii=0;ii<xingcunzhe;ii++)////////////////////
    // {////////////////
    //  cout<<"个体:"<<youxuanqun[ii].geti<<" "<<"适应度:"<<youxuanqun[ii].shiyingdu<<endl;///////////
    // }///
    // cout<<endl;///////////
    // system("pause");/////////////
     for(ii=0;ii<xingcunzhe;ii++)
     {
      zuihouliangge[ii].shiyingdu=youxuanqun[ii].shiyingdu;
      zuihouliangge[ii].geti=youxuanqun[ii].geti;
     }
     //   for(ii=0;ii<xingcunzhe;ii++)////////////////////
    // {////////////////
    //  cout<<"个体:"<<zuihouliangge[ii].geti<<" "<<"适应度:"<<zuihouliangge[ii].shiyingdu<<endl;///////////
    // }///
    // cout<<endl;///////////
    // system("pause");/////////////
        qsort(zuihouliangge,(2*lanmuteshuliang+2),sizeof(youxuan),&cmpshiyingdujiang);//将优选群按变异后适应度降序排序
    // for(ii=0;ii<xingcunzhe;ii++)////////////////////
    // {////////////////
    //  cout<<"个体:"<<zuihouliangge[ii].geti<<" "<<"适应度:"<<zuihouliangge[ii].shiyingdu<<endl;///////////
    // }///
    // cout<<endl;///////////
    // system("pause");/////////////
     child1.geti=zuihouliangge[0].geti;
     child2.geti=zuihouliangge[1].geti;
    // cout<<child1.geti<<endl;///////////////////////
     //cout<<child2.geti<<endl;///////////////////////
     }
     else
     {
      double alpha=ran1(a);
      child1.geti=alpha*parent1.geti+(1-alpha)*parent2.geti;
      child2.geti=alpha*parent2.geti+(1-alpha)*parent1.geti;
     } 
      delete [] zuihouliangge;
      delete [] red;
      delete [] getipingjunhaiming;
      delete [] beiyongyouxuanqun;
      delete [] youxuanqun;
      delete [] jingzhengqun;
      delete [] index;
      delete [] I;
     }
     else
     {
       child1.geti=parent1.geti;
       child2.geti=parent2.geti;
     }
    }
    void bianyi(individual &child)//变异
    {
     if(flipm(child.fitness))
     {
     double alpha,r,derta;
        alpha=ran1(a);
     if(alpha>0.5)
     {
      derta=(youbianjie-child.geti)*(1-ran1(a)*pow((1-gen/maxgen),2));
      child.geti=child.geti+derta;
     }
     else
     {
      derta=(child.geti-zuobianjie)*(1-ran1(a)*pow((1-gen/maxgen),2));
      child.geti=child.geti-derta;
     }
     }
     if(child.geti>2000||child.geti<-2000)//////////////////
       system("pause");/////////////////////
    }
    double ran1(long *idum)
    {
    int j;
    long k;
    static long idum2=123456789;
    static long iy=0;
    static long iv[NTAB];
    float temp;
    if (*idum <= 0)
    {
    if (-(*idum) < 1) *idum=1;
    else *idum = -(*idum);
    idum2=(*idum);
    for (j=NTAB+7;j>=0;j--)
    {
    k=(*idum)/IQ1;
    *idum=IA1*(*idum-k*IQ1)-k*IR1;
    if (*idum < 0) *idum += IM1;
    if (j < NTAB) iv[j] = *idum;
    }
    iy=iv[0];
    }
    k=(*idum)/IQ1;
    *idum=IA1*(*idum-k*IQ1)-k*IR1;
     if (*idum < 0) *idum += IM1;
    k=idum2/IQ2;
    idum2=IA2*(idum2-k*IQ2)-k*IR2;
    if (idum2 < 0) idum2 += IM2;
    j=iy/NDIV;
    iy=iv[j]-idum2;
    iv[j] = *idum;
    if (iy < 1) iy += IMM1;
    if ((temp=AM*iy) > RNMX) return RNMX;
    else return temp;
    }
    double suijibianli()//随机遍历
    {
     double i=ran1(a);
     while(i>zhizhenjuli)
     {
      i=ran1(a);
     }
     //cout<<i<<endl;//////////////
     return i;
    }
    int fuzhi(float p)//复制
    {
     int i;
     double sum=0;
     if(sumfitness!=0)
     {
      for(i=0;(sum<p)&&(i<zhongqunshu);i++)
       sum+=nowpop[i].fitness/sumfitness;
     }
     else
      i=rnd(1,zhongqunshu1);
     return(i-1);
    }
    int rnd(int low, int high)           /*在整数low和high之间产生一个随机整数*/
    {
        int i;
        if(low >= high)
            i = low;
        else
        {
            i =(int)((ran1(a) * (high - low + 1)) + low);
            if(i > high) i = high;
        }
        return(i);
    }
    int flipc(double p,double q)//判断是否交叉
    {
     double pc1=0.9,pc2=0.8;
     if((p-q)>0)
     {
      if(p>=avefitness)
      {
       pc=pc1-(pc1-pc2)*(p-avefitness)/(maxfitness-avefitness);
      }
      else
       pc=pc1;
     }
     else
     {
      if(q>=avefitness)
      {
       pc=pc1-(pc1-pc2)*(q-avefitness)/(maxfitness-avefitness);
      }
      else
       pc=pc1;
     }
        if(ran1(a)<=0.8)
            return(1);
        else
            return(0);
    }
    int flipm(double p)//判断是否变异
    {
     double pm1=0.01,pm2=0.001;
     if(p>=avefitness)
     {
      pm=(pm1-(pm1-pm2)*(maxfitness-p)/(maxfitness-avefitness));
     }
     else
     pm=pm1;
     if(ran1(a)<=0.01)
            return(1);
        else
            return(0);
    }
    void glp(int n,int s,int *h,int (*q)[1],float (*xx)[1])//glp
    {
     int i=0,j=0;
     //求解q
     for(i=0;i<n;i++)
     {
      for(j=0;j<s;j++)
      {
       *(*(q+i)+j)=((i+1)*(*(h+j)))%n;
      }
     }
     i=n-1;
     for(j=0;j<s;j++)
     {
      *(*(q+i)+j)=n;
     }
     //求解x
     for(i=0;i<n;i++)
     {
      for(j=0;j<s;j++)
      {
       *(*(xx+i)+j)=(float)(2*(*(*(q+i)+j))-1)/(2*n);
      }
     }
    }
    BOOL Exist(int Val, int Num, int *Array)//判断一个数是否在一个数组的前Num个数中
    {
    BOOL FLAG = FALSE;
    int i;
    for (i=0; i<Num; i++)
    if (Val == *(Array + i))
    {
    FLAG = TRUE;
    break;
    }
    return FLAG;
    }
    double hundunsuiji()
    {
     hundun=c*hundun*(1-hundun);
     return hundun;
    }
    int haimingchazhijisuan(double bianliang1,double bianliang2)
    {
     unsigned *p;
     unsigned *q;
    // unsigned *gray;
     p=new unsigned[lchrom];
     q=new unsigned[lchrom];
    // gray=new unsigned[lchrom];
     int x=0;
     int i=0,j=0;
     if(bianliang1<zuobianjie||bianliang1>youbianjie)///////////////////
     {
      cout<<"bianliang1:"<<bianliang1<<endl;/////////
      system("pause");
     }
     if(bianliang2<zuobianjie||bianliang2>youbianjie)///////////////////
     {
      cout<<"bianliang2:"<<bianliang2<<endl;/////////
      system("pause");
     }
     //cout<<youbianjie-(zuobianjie)<<endl;
     //system("pause");
     for(i=0;i<lchrom;i++)//p,q两个数组归零
     {
      q[i]=0;
      p[i]=0;
     }
     //对变量1进行编码
     x=(bianliang1-(zuobianjie))*((pow(2,lchrom)-1)/(youbianjie-(zuobianjie)));
     //cout<<x<<endl;///////////
     if(x<0)
     system("pause");///////////
     i=0;
     while (x!=0&&(i!=lchrom))
     {
      q[i]=(unsigned)(x%2);
      x=x/2;
      i++;
     }
    // for(i=0;i<lchrom;i++)//////////////////
    //  cout<<q[i];///////////////
    // cout<<endl;///////////
     int w=lchrom-1;
     if(q[w]!=0&&q[w]!=1)
      system("pause");
     //对变量2进行编码
     x=0;
     x=(bianliang2-(zuobianjie))*((pow(2,lchrom)-1)/(youbianjie-(zuobianjie)));
     //cout<<x<<endl;///////////
     if(x<0)
     system("pause");///////////
     i=0;
     while (x!=0&&(i!=lchrom))
     {
      p[i]=(unsigned)(x%2);
      x=x/2;
      i++;
     }
        w=lchrom-1;
     if(p[w]!=0&&p[w]!=1)
      system("pause");
    // for(j=0;j<lchrom&&w>0;j++)
    // {
    //  p[j]=q[w];
    //  w--;
    // }
    // //cout<<"yuanma"<<endl;
    // for(j=0;j<lchrom;j++)///////////
    //  cout<<p[j];////////
    // cout<<endl;////////////////////
    // for(j=0;j<lchrom;j++)///////////
    //  cout<<q[j];////////
    // cout<<endl;////////////////////
    // gray[0]=p[0];
    // for(j=1;j<lchrom;j++)
    // {
    //  if(p[j-1]==p[j])
    //   gray[j]=0;
    //  else if(p[j-1]!=p[j])
    //   gray[j]=1;
    // }
     //for(j=0;j<lchrom;j++)
     // p[j]=gray[j];
     //cout<<"geleima"<<endl;
     //for(j=0;j<lchrom;j++)///////////
     // cout<<p[j];////////
     //cout<<endl;////////////////////
     //system("pause");///////////
        int hai=0,a=0;
     for(j=0;j<lchrom;j++)
     {
      if(q[j]==p[j])
       a=0;
      else
       a=1;
      hai=hai+a;
      //cout<<hai<<endl;////
     }
     if(hai<0)//////////////
     {
      cout<<"海明差值计算结果:"<<hai<<endl;///////////////
      system("pause");/////////////////////
     }
    // delete [] gray;
     delete [] q;
     delete []p;
     return hai;
    }
    double gasdev(long *idum)

     double ran1(long *idum);
     static int iset=0;
     static double gset;
     double fac,rsq,v1,v2;
     if (*idum < 0)
      iset=0; //初始化
     if (iset == 0)
     {
      do
      {
       v1=2.0*ran1(idum)-1.0;
       v2=2.0*ran1(idum)-1.0;
       rsq=v1*v1+v2*v2;
      }while (rsq >= 1.0 || rsq == 0.0);
      fac=sqrt(-2.0*log(rsq)/rsq);
      gset=v1*fac;
      iset=1;
      return v2*fac;
     }
     else
     {
      iset=0;
      return gset;
     }
    }
     
     
     
     
     
     
     

    Comments

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    Trackbacks

    The trackback URL for this entry is:
    http://cid-3c590615949598e2.spaces.live.com/blog/cns!3C590615949598E2!279.trak
    Weblogs that reference this entry
    • None