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

算法公敌

让一切算法成为我的敌人,然后,我去战胜他们
9/7/2008

格雷码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void main()
{
 int i=0,lchrom=22;
 unsigned a=3000001,b=87;
 vector<unsigned> haiaa1(lchrom);
 haiaa1.clear();
 while (a!=0&&(i!=lchrom))
 {
  haiaa1[i]=(unsigned)(a%2);
  a=a/2;
  i++;
 }
 for(i=0;i<22;i++)
 {
  cout<<haiaa1[i];
 }
 cout<<endl;
 a=3000001;
 a=a^(a>>1);
 vector<unsigned> haiaa(lchrom);
 haiaa.clear();
 i=0;
 while (a!=0&&(i!=lchrom))
 {
  haiaa[i]=(unsigned)(a%2);
  a=a/2;
  i++;
 }
 for(i=0;i<22;i++)
 {
  cout<<haiaa[i];
 }
 cout<<endl;
}
8/5/2008

实数编码高维数遗传算法

方程的维数在jiedeweishu中修改,目标函数mubiaohanshu中写入,想求最小值就在该函数最后输入bianliang.shiyingdu=-bianliang.shiyingdu,想求最大值就保持bianliang.shiyingdu为正
 
 

#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 jiedeweishu 4
//#define zuobianjie -2000
//#define youbianjie 2000
#define lanmuteshuliang 5
unsigned int seed=0; //seed 为种子,要设为全局变量
void mysrand(long int i) //初始化种子
{
seed = -i;
}
long a[1];
double zuobianjie[jiedeweishu]={60,7.5,0,0};//定义左边界数值
double youbianjie[jiedeweishu]={100,25,40,0.4};//定义右边界数值
//double hundun;
//double c=3.95;
//设置全局变量
struct individual
{
 double *chrom;  //染色体;
 double geti[jiedeweishu];//变量值
 double shiyingdu; //目标函数的值;
 double fitness;   //变换后的适应度值;
};
struct haiming
{
 int bianhao;//编号
 double geti[jiedeweishu];
 int haimingchazhi;//海明差值
};
struct youxuan//确定交叉后的优选个体
{
 double geti[jiedeweishu];
 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;//遗传代数
double aa=1000,c=25;
//函数
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 *getishuzhi1,double *getishuzhi2);//计算个体的海明值
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[0];//现在是按照"个体值"排序
 float j=((individual *)p2)->geti[0];
 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();
 int i;
 for(i=0;i<jiedeweishu;i++)
 {
  cout<<zuiyougeti->geti[i]<<",";
 }
 cout<<setiosflags(ios::scientific);
 cout<<"初始最优解:"<<" "<<-zuiyougeti->shiyingdu<<endl;/////////////
 //system("pause");////////////////////////////////////
 for(gen=1;gen<maxgen;gen++)
 {
  generation();
  //if(-zuiyougeti->shiyingdu<3e-5)
  // break;
 }
  jingyingbaoliu();
  cout<<setiosflags(ios::scientific);
  for(i=0;i<jiedeweishu;i++)
  {
   cout<<setiosflags(ios::fixed)<<setprecision(6)<<zuiyougeti->geti[i]<<",";
  }
  cout<<"最优解为:"<<" "<<setiosflags(ios::fixed)<<setprecision(6)<<-(zuiyougeti->shiyingdu)<<endl;////////////////
 delete [] newpop;
 delete [] nowpop;
 delete [] zuiyougeti;
 system("pause");
}
void initialize()
{
 int i,j;
// 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};//生成向量
 //for(i=0;i<jiedeweishu;i++)//对边界进行初始化
//{
//  zuobianjie[i]=-100;
//  youbianjie[i]=100;
// }
 zuiyougeti=new individual;//最优个体的生成
 zhongqunshu=200;//种群数量
 nowpop=new individual[zhongqunshu1];//当代
 newpop=new individual[zhongqunshu1];//新一代
 maxgen=300;//最大代数
 gen=0;//起始代
 lchrom=22;//基因数量的初始化
 mysrand(time(0));//随机数种子
    a[0]=seed;//随机数种子
 //对最优个体的初始化
 for(i=0;i<jiedeweishu;i++)
 {
  zuiyougeti->geti[i]=1;
 }
       zuiyougeti->fitness=0;
     zuiyougeti->shiyingdu=-200;
  //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(i=0;i<zhongqunshu1;i++)//产生初始种群
   {
    for(j=0;j<jiedeweishu;j++)
    {
     nowpop[i].geti[j]=zuobianjie[j]+(youbianjie[j]-(zuobianjie[j]))*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 fangcheng1,fangcheng2,fangcheng3,fangcheng4;
 if(bianliang.geti[1]>7.5)
 {
  fangcheng1=9.5*(bianliang.geti[0]-c)+5.7*(bianliang.geti[0]-bianliang.geti[1])+0.1033*(1-0.0045*(bianliang.geti[0]-25))*aa-0.70965*aa;
  fangcheng2=1.997*pow(bianliang.geti[3],1.4)+1087.536*pow(bianliang.geti[2]*(bianliang.geti[1]-7.5),0.7)/pow(bianliang.geti[3]*194740,0.7)-bianliang.geti[2];
  fangcheng3=bianliang.geti[3]*139250/100-bianliang.geti[2]*0.876096*(bianliang.geti[1]-7.5);
  fangcheng4=0.12274*aa+5.7*(bianliang.geti[0]-bianliang.geti[1])-bianliang.geti[2]*(bianliang.geti[1]-7.5);
 }
 else //罚函数
 {
  fangcheng1=1e66;
  fangcheng2=1e66;
  fangcheng3=1e66;
  fangcheng4=1e66;
  bianliang.geti[0]=100;
  bianliang.geti[1]=100;
  bianliang.geti[2]=100;
  bianliang.geti[3]=100;
 }
 
 bianliang.shiyingdu=-fabs(fangcheng1)-fabs(fangcheng2)-fabs(fangcheng3)-fabs(fangcheng4);//三个方程的解的绝对值和若为0,则方程组得解
 //cout<<bianliang.shiyingdu<<endl;/////////////////////
 
}
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/zhongqunshu1
 {
  
  pipeichi[fuzhijishu]=nowpop[fuzhi(zhizhen)];
  fuzhijishu++;//复制计数
  //cout<<fuzhijishu<<endl;
 }
 //for(int iii=0;iii<zhongqunshu1;iii++)
 //{
 // for(int kk=0;kk<jiedeweishu;kk++)
 // {
 // if(pipeichi[iii].geti[kk]<zuobianjie[kk]||pipeichi[iii].geti[kk]>youbianjie[kk])
 // cout<<pipeichi[iii].geti[kk]<<" ";///////////
 // }
 // cout<<endl;
 //}
// cout<<endl;////////////////
   // system("pause");//////////////////////////
 //交叉与变异的实现
 //交叉
    for(i=0;i<zhongqunshu1;i++)
 {
  peiduishuzu[i]=-1;
 }
 
 for(i=0;i<zhongqunshu1;i++)
 {
  for(int kk=0;kk<jiedeweishu;kk++)
  {
   haimingrongqi[i].geti[kk]=pipeichi[i].geti[kk];
  }
 }
 //cout<<haimingrongqi[1].geti[0]<<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;
    //cout<<"wo0"<<endl;///////////////////////
    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;
     //cout<<"wo1"<<endl;///////////////
    }
    else
    {
     //cout<<"wo2"<<endl;
     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;
      //cout<<temp<<" "<<j<<" "<<haimingchazhirongqi[j].haimingchazhi<<endl;////////////////
     }
     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");//////////////////////////////////
    }
  
 }
 //cout<<"wo"<<endl;
   // for(int iii=0;iii<zhongqunshu1;iii++)///////////////////
   // {
   //  for(int kk=0;kk<jiedeweishu;kk++)
   //  {
   //   cout<<pipeichi[peiduishuzu[iii]].geti[kk]<<" ";///////////////
   //  }
   //  cout<<endl;
   // }
   // system("pause");//////////////////////
   // cout<<endl;
   // qsort(peiduishuzu,200,sizeof(int),&cmp1);//////////////
   // cout<<endl;/////////////////////////////////
   // for(iii=0;iii<200;iii++)///////////////////
   // {
    // cout<<peiduishuzu[iii]<<endl;///////////////
    //}
    //system("pause");//////////////////////
    //cout<<endl;
 for(i=0;i<zhongqunshu1-1;i=i+2)
 {
 // cout<<"wozai453"<<endl;
  fuqin1=pipeichi[peiduishuzu[i]];
  fuqin2=pipeichi[peiduishuzu[i+1]];
  //cout<<"父亲1"<<":"<<fuqin1.geti[0]<<" "<<fuqin1.geti[1]<<endl;///////////
  //cout<<"父亲2"<<":"<<fuqin2.geti[0]<<" "<<fuqin2.geti[1]<<endl;///////////
  //cout<<"wo1"<<endl;
  crossover(fuqin1,fuqin2,newpop[i],newpop[i+1]);
 }
 //cout<<"wo123"<<endl;//////////////////////
 int bianlianggeshu=0;
 for(j=0;j<zhongqunshu1;j++)
 {
  //if(newpop[j].geti<-1000)
   //cout<<"个体数值小于下界了";
  for(bianlianggeshu=0;bianlianggeshu<jiedeweishu;bianlianggeshu++)
  {
   nowpop[j].geti[bianlianggeshu]=newpop[j].geti[bianlianggeshu];
  }
 }
 //
 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,jj;
 if(flipc(parent1.fitness,parent2.fitness))
 {
  //cout<<"父个体1:"<<parent1.geti[0]<<endl;////////////////
 // cout<<"父个体2:"<<parent2.geti[0]<<endl;////////////////
  //system("pause");
  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)];//用来储存冗余信息
  
  for(j=0;j<(2*lanmuteshuliang+2);j++)
  {
   I[j]=0;
   index[j]=1;
  }
  for(j=0;j<lanmuteshuliang;j++)
  {
   for(jj=0;jj<jiedeweishu;jj++)
   {
    lanmute=0.5+ran1(a)*(1.5-0.5);
    jingzhengqun[i].geti[jj]=lanmute*parent1.geti[jj]+(1-lanmute)*parent2.geti[jj];
    jingzhengqun[i+1].geti[jj]=lanmute*parent2.geti[jj]+(1-lanmute)*parent1.geti[jj];
    while(jingzhengqun[i].geti[jj]<zuobianjie[jj]||jingzhengqun[i].geti[jj]>youbianjie[jj]||jingzhengqun[i+1].geti[jj]<zuobianjie[jj]||jingzhengqun[i+1].geti[jj]>youbianjie[jj])
    {
     lanmute=0.5+ran1(a)*(1.5-0.5);
     jingzhengqun[i].geti[jj]=lanmute*parent1.geti[jj]+(1-lanmute)*parent2.geti[jj];
     jingzhengqun[i+1].geti[jj]=lanmute*parent2.geti[jj]+(1-lanmute)*parent1.geti[jj];
    }
   }
   i=i+2;
  }
  for(jj=0;jj<jiedeweishu;jj++)
  {
   jingzhengqun[i].geti[jj]=parent1.geti[jj];
   jingzhengqun[i+1].geti[jj]=parent2.geti[jj];
  }
 // for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
 // {
 //  cout<<"wo1"<<endl;
 //  for(int kk=0;kk<2;kk++)
 //  {
 //   cout<<jingzhengqun[j].geti[kk]<<" ";
 //  }
 //  cout<<endl;
 // }
 //system("pause");///////////////////////////////////
  for(j=0;j<(2*lanmuteshuliang+2);j++)
  {
   mubiaohanshu(jingzhengqun[j]);
  }
 // for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
 // {
 //  for(int kk=0;kk<jiedeweishu;kk++)
 //  {
 //   cout<<jingzhengqun[j].geti[kk]<<" ";
 //  }
 //  cout<<endl;
 // }
 // system("pause");///////////////////////////////////
 // for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
 // {
 //  cout<<jingzhengqun[j].shiyingdu<<endl;
 // }
 // system("pause");///////////////////////////////////
  qsort(jingzhengqun,(2*lanmuteshuliang+2),sizeof(individual),&cmpgeti);//将竞争群按空间排序
 // for(j=0;j<(2*lanmuteshuliang+2);j++)////////////////////
 // {
   //      for(int kk=0;kk<jiedeweishu;kk++)
 //  {
 //   cout<<jingzhengqun[j].geti[kk]<<" ";
  // }
 //  cout<<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;//求海明和的次数
  jj=0; 
  for(int ii=0;ii<(2*lanmuteshuliang+1);ii++)
  {
   sumchahainei=0;
   //cout<<"ii的值:"<<haimingrongqi[ii].geti<<endl;//////////
   for(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(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)
   {
    for(jj=0;jj<jiedeweishu;jj++)
    {
     youxuanqun[xingcunzhe].geti[jj]=jingzhengqun[ii].geti[jj];
    }
    xingcunzhe++;
   }
  }
  zuihouliangge=new youxuan[xingcunzhe];
  // cout<<"幸存者数量:"<<xingcunzhe<<endl;//////////////////
    //for(ii=0;ii<xingcunzhe;ii++)////////////////////////
  // {////////////////
  //  mubiaohanshu(youxuanqun[ii]);
  //  cout<<"个体:"<<youxuanqun[ii].geti[0]<<" "<<youxuanqun[ii].geti[1]<<" "<<"适应度:"<<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<30;jjj++)
   {
    for(ii=0;ii<xingcunzhe;ii++)
    {
     mubiaohanshu(youxuanqun[ii]);
    }
    for(ii=0;ii<xingcunzhe;ii++)
    {
     for(jj=0;jj<jiedeweishu;jj++)
     {
      beiyongyouxuanqun[ii].geti[jj]=youxuanqun[ii].geti[jj]+gasdev(a);
      while(beiyongyouxuanqun[ii].geti[jj]<zuobianjie[jj]||beiyongyouxuanqun[ii].geti[jj]>youbianjie[jj])
      {
       beiyongyouxuanqun[ii].geti[jj]=youxuanqun[ii].geti[jj]+gasdev(a);
      }
     }
    }
   }
    for(ii=0;ii<xingcunzhe;ii++)
    {
     mubiaohanshu(beiyongyouxuanqun[ii]);
    }
    for(ii=0;ii<xingcunzhe;ii++)
    {
     if(beiyongyouxuanqun[ii].shiyingdu>youxuanqun[ii].shiyingdu)
     {
      for(jj=0;jj<jiedeweishu;jj++)
      {
       youxuanqun[ii].geti[jj]=beiyongyouxuanqun[ii].geti[jj];
      }
     }
    }
    for(ii=0;ii<xingcunzhe;ii++)
    {
     mubiaohanshu(youxuanqun[ii]);
    }
 
       //for(ii=0;ii<xingcunzhe;ii++)////////////////////
     //{////////////////
     // cout<<"个体:"<<youxuanqun[ii].geti[0]<<" "<<youxuanqun[ii].geti[1]<<" "<<"适应度:"<<youxuanqun[ii].shiyingdu<<endl;///////////
     //}///
     //cout<<endl;///////////
     //system("pause");/////////////
    for(ii=0;ii<xingcunzhe;ii++)
    {
     for(jj=0;jj<jiedeweishu;jj++)
     {
      zuihouliangge[ii].geti[jj]=youxuanqun[ii].geti[jj];
     }
     zuihouliangge[ii].shiyingdu=youxuanqun[ii].shiyingdu;
    }
     // for(ii=0;ii<xingcunzhe;ii++)////////////////////
    // {////////////////
    //  cout<<"个体:"<<zuihouliangge[ii].geti[0]<<" "<<zuihouliangge[ii].geti[1]<<" "<<"适应度:"<<zuihouliangge[ii].shiyingdu<<endl;///////////
    // }///
    // cout<<endl;///////////
    // system("pause");/////////////
    qsort(zuihouliangge,xingcunzhe,sizeof(youxuan),&cmpshiyingdujiang);//将优选群按变异后适应度降序排序
    // for(ii=0;ii<xingcunzhe;ii++)////////////////////
    // {////////////////
    //  cout<<"个体:"<<zuihouliangge[ii].geti[0]<<" "<<zuihouliangge[ii].geti[1]<<" "<<"适应度:"<<zuihouliangge[ii].shiyingdu<<endl;///////////
    // }///
    // cout<<endl;///////////
    // system("pause");/////////////
    for(jj=0;jj<jiedeweishu;jj++)
    {
     child1.geti[jj]=zuihouliangge[0].geti[jj];
     child2.geti[jj]=zuihouliangge[1].geti[jj];
    }
    // cout<<child1.geti[0]<<" "<<child1.geti[1]<<endl;///////////////////////
       // cout<<child2.geti[0]<<" "<<child2.geti[1]<<endl;///////////////////////
     //cout<<"wozai761"<<endl;//////////////////////
  }
  else
  {
   //cout<<"wozai761"<<endl;
   double alpha;
   for(jj=0;jj<jiedeweishu;jj++)
   {
    alpha=ran1(a);
    child1.geti[jj]=alpha*parent1.geti[jj]+(1-alpha)*parent2.geti[jj];
    child2.geti[jj]=alpha*parent2.geti[jj]+(1-alpha)*parent1.geti[jj];
   }
  } 
       // cout<<"wozai774"<<endl;//////////////////////
  delete [] zuihouliangge;
 // cout<<"wozai776"<<endl;//////////////////////
  delete [] red;
 // cout<<"wozai778"<<endl;//////////////////////
  delete [] getipingjunhaiming;
  delete [] beiyongyouxuanqun;
 // cout<<"wozai780"<<endl;//////////////////////
  delete [] youxuanqun;
  delete [] jingzhengqun;
  delete [] index;
  delete [] I;
  //cout<<"wozai784"<<endl;//////////////////////
 }
 else
 {
       //cout<<"wozai781"<<endl;
  for(jj=0;jj<jiedeweishu;jj++)
  {
   child1.geti[jj]=parent1.geti[jj];
   child2.geti[jj]=parent2.geti[jj];
  }
 }
}
void bianyi(individual &child)//变异
{
 int jj=0;
 for(jj=0;jj<jiedeweishu;jj++)
 {
  if(flipm(child.fitness))
  {
   double alpha,r,derta;
   alpha=ran1(a);
   if(alpha>0.5)
   {
    derta=(youbianjie[jj]-child.geti[jj])*(1-ran1(a)*pow((1-gen/maxgen),2));
    child.geti[jj]=child.geti[jj]+derta;
   }
   if(alpha<=0.5)
   {
    derta=(child.geti[jj]-zuobianjie[jj])*(1-ran1(a)*pow((1-gen/maxgen),2));
    child.geti[jj]=child.geti[jj]-derta;
   }
  }
 }
    for(jj=0;jj<jiedeweishu;jj++)
 {
 if(child.geti[jj]>youbianjie[jj]||child.geti[jj]<zuobianjie[jj])//////////////////
   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)<=pc)
        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)<=pm)
        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 *getishuzhi1,double *getishuzhi2)
{
 int hai[jiedeweishu],aa=0;
 for(int kk=0;kk<jiedeweishu;kk++)
 {
  hai[kk]=0;
 }
 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,jj=0;
 if(getishuzhi1[0]<zuobianjie[0]||getishuzhi1[0]>youbianjie[0]||getishuzhi1[1]<zuobianjie[1]||getishuzhi1[1]>youbianjie[1])///////////////////
 {
  cout<<"haimingchazhijisuan一步第一个变量越界"<<endl;/////////
  system("pause");
 }
 if(getishuzhi2[0]<zuobianjie[0]||getishuzhi2[0]>youbianjie[0]||getishuzhi2[1]<zuobianjie[1]||getishuzhi2[1]>youbianjie[1])///////////////////
 {
  cout<<"haimingchazhijisuan一步第二个变量越界"<<endl;/////////
  system("pause");
 }
 //cout<<youbianjie-(zuobianjie)<<endl;
 //system("pause");
 for(jj=0;jj<jiedeweishu;jj++)
 {
  x=0,i=0,j=0;
  for(i=0;i<lchrom;i++)//p,q两个数组归零
  {
   q[i]=0;
   p[i]=0;
  }
 //对变量1进行编码
  x=(getishuzhi1[jj]-(zuobianjie[jj]))*((pow(2,lchrom)-1)/(youbianjie[jj]-(zuobianjie[jj])));
 //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=(getishuzhi2[jj]-(zuobianjie[jj]))*((pow(2,lchrom)-1)/(youbianjie[jj]-(zuobianjie[jj])));
 //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;j++)
   {
    if(q[j]==p[j])
     aa=0;
    else
     aa=1;
    hai[jj]=hai[jj]+aa;
    //cout<<hai<<endl;////
   }
  if(hai[jj]<0)//////////////
  {
   cout<<"海明差值计算结果:"<<hai[jj]<<endl;///////////////
   system("pause");/////////////////////
  }
 }
 int chazhi=0;
 for(jj=0;jj<jiedeweishu;jj++)
 {
  chazhi+=hai[jj];
 }
 //cout<<chazhi<<endl;
// cout<<"wozai1061"<<endl;
 
// delete [] gray;
 delete [] q;
 delete []p;
 return chazhi;
}
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;
 }
}
7/23/2008

CArray定义多维数组(转)

typedef   CArray <int,int>   Array;
CArray <Array,Array>   x;
x.SetSize(   10   );
for(   int   i   =   0   ;   i   <   10   ;   i++){
x[i].SetSize(20);
}
这样就定义了一个int[10][20];的数组可以随时扩充.
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;
 }
}
 
 
 
 
 
 
 
5/1/2008

见识

4月30号所控课题答辩,这是我毕业后受到的最大打击,我写文件的能力太差了,内容散乱,逻辑不清,基本没表达清我要说的意思,今后一定要加强这方面的锻炼,避免出现干的出,却说不出的尴尬局面
 
同时我也见识到了什么叫不切实际的夸夸其谈,和马三立的相声差不多。
 
提出理论依据-〉验证性试验-〉小规模试验生产-〉大规模生产,这才是科学的。
 
可惜我刚提出想法,领导们就要我说出成品的性能,这根本就不是答辩,简直是一帮狂人的空想聚会,不按科学规律办事早晚是要出事的。
 
Photo 1 of 56
by 
by 
by 
by 
More...

呼文韬

  • Send a private message
  • Subscribe to RSS feed
  • Tell a friend
  • Add to My MSN
  • Add to Live.com
  • Add to your network
No list items have been added yet.

Feed

The owner hasn't specified a feed for this module yet.
感谢访问!
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.

Windows Media Player

No list items have been added yet.