sga.cpp
上传用户:helpmateqq
上传日期:2013-03-23
资源大小:86k
文件大小:8k
开发平台:

Visual C++

  1. #include <iostream.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <stdio.h>
  5. #include <time.h>
  6. long* long2binary(long codelength,long ltochange);
  7. int CreateChromN(long popsize, long lchrom, long* &plarray);
  8. int ChromCross(double dPcross,long * plArray,long lPopsize, long lChrom);
  9. int ChromMutation(double dpMutation,long* plArray,long lPopsize, long lChrom);
  10. int RWS(long* plAdapt, long* plArray,long lPopsize, long lChrom);
  11. //整数转换为二进制
  12. long* long2binary(long codelength,long ltochange)
  13. {
  14.    long* plResult=new long[codelength];
  15.    if(plResult==NULL) return NULL;
  16.    for(int i=0;i<codelength;i++)//从低位开始
  17.    {
  18.   long aa=(long)pow(2,i);
  19.     if((ltochange&aa)==0)
  20.   plResult[codelength-1-i]=0; //但从高位开始存储
  21.   else 
  22.   plResult[codelength-1-i]=1 ;
  23.    }
  24.    return plResult;
  25. }
  26. //随机产生染色体
  27. int CreateChromN(long popsize, long lchrom, long* &plarray)
  28. {
  29. //随机选择编码组
  30. long *plAr= new long[popsize*lchrom];
  31. if(plAr==NULL) return 0;
  32. long *plSelection= new long[popsize];
  33. if(plSelection==NULL) return 0;
  34. long n=(long)pow(2,lchrom)-1;//可能的染色体分组
  35. plSelection[0]=(int)(n*rand()/RAND_MAX);//取0到popsize之间的数
  36. int i=0; //i从0开始
  37. long tempSelection;
  38. while(i<popsize-1)//??
  39. {
  40.         int hh=0;
  41. tempSelection=(long)(n*rand()/RAND_MAX);
  42. for(int j=0;j<i+1;j++)
  43. {
  44. if(tempSelection==plSelection[j]) 
  45. hh=hh+1;//计数,可以稍微提高效率,不比较完毕
  46. }
  47. if(hh==0) //没有相同的数
  48. {
  49. i=i+1;
  50. plSelection[i]=tempSelection;
  51. }
  52. }
  53. //然后将数转化为标准二进制编码,且存储
  54. long* plBinary;
  55. for(i=0;i<popsize;i++)
  56. {
  57.       plBinary=long2binary(lchrom,plSelection[i]);
  58.   for(int j=i*lchrom;j<(i+1)*lchrom;j++) 
  59.   plAr[j]=plBinary[j-i*lchrom];
  60. }
  61.     plarray=plAr;
  62. return 1;
  63. //1 还是随机选择(固定二进制编码,不用考虑优化编码)*/
  64. //2 随机编码?比较的工作量比较大
  65. //return 1;
  66. }
  67. //operator &(long aa)
  68. //**随机选择过程可以做成一个单独的函数
  69. //染色体进行交配
  70. int ChromCross(double dpCross,long *plArray,long lPopsize, long lChrom)
  71. {
  72. //long plPop[20]={1,0,0,0,1,0,0,1,0,1,1,1,0,0,1,1,0,0,1,0};
  73.     //已知初始种群,数组大小为N=lPopsize*lChrom
  74.     //判断数组是否含有非0,1值
  75. for(int jj=0;jj<lPopsize*lChrom;jj++)
  76. {
  77. if((plArray[jj]!=1)&(plArray[jj]!=0))
  78. return 0;
  79. }
  80. //交配的种群个数
  81.     long lPop2Cross=(long)lPopsize*dpCross;
  82.     //保证要交配的染色体个数为偶数
  83. //减1比较好,如果+1,奇数个种群交配率为100%出现错误情况
  84.     if(lPop2Cross%2) lPop2Cross=lPop2Cross-1;
  85.     //交配位,0到lChrom之间
  86.     long lBit2Cross=(long)(lChrom-1)*rand()/RAND_MAX;
  87.    //随机选择其中的染色体进行交配,等概率交配,不考虑适应值
  88.   
  89.   //方法是:随机产生一数组(数的范围在0-(lPopsize-1)之间),相邻两个进行交配
  90.  long* plSelection=new long[];
  91.  if(plSelection==NULL) return 0;
  92.      plSelection[0]=(long)((lPopsize-1)*rand()/RAND_MAX);//取0到(lPopsize-1)之间的数
  93. int i=0; //i从0开始
  94. long tempSelection;
  95. while(i<lPop2Cross-1)//
  96. {
  97.         int hh=0;
  98. tempSelection=(long)((lPopsize-1)*rand()/RAND_MAX);
  99. for(int j=0;j<i+1;j++)
  100. {
  101. if(tempSelection==plSelection[j]) 
  102. hh=hh+1;//计数,可以稍微提高效率,不比较完毕
  103. }
  104. if(hh==0) //没有相同的数
  105. {
  106. i=i+1;
  107. plSelection[i]=tempSelection;
  108. }
  109. }
  110. //plSelection[]存储的是待交配的染色体的序号
  111. //交配
  112. for(int j=0;j<lPop2Cross;j=j+2)
  113. {
  114.      
  115.  for(long h=lBit2Cross;h<lChrom;h++)
  116.  {
  117.          
  118.  long lTempBit;// 要交换的位
  119.  lTempBit=plArray[plSelection[j]*lChrom+h];
  120.          plArray[plSelection[j]*lChrom+h]=plArray[plSelection[j+1]*lChrom+h];
  121.  plArray[plSelection[j+1]*lChrom+h]=lTempBit;
  122.  }
  123. }
  124. /*for(j=0;j<20;j++)
  125. {
  126.     plArray[j]=plPop[j];
  127. }*/
  128. return 1;
  129. }
  130. //染色体变异
  131. int ChromMutation(double dpMutation,long* plArray,long lPopsize,long lChrom)
  132. {
  133.  //判断数组是否含有非0,1值
  134. for(int jj=0;jj<lPopsize*lChrom;jj++)
  135. {
  136. if((plArray[jj]!=1)&(plArray[jj]!=0))
  137. return 0;
  138. }
  139. //lPopsize:种群个数  lChrom:编码长度
  140.  long lPoptoMutation=(long)lPopsize*dpMutation;
  141.  if(lPoptoMutation==0) return 1;
  142.  long lBittoMutation;
  143.  lBittoMutation=(long)(lChrom-1)*rand()/RAND_MAX;
  144.  long* plSelection=new long[];
  145.      plSelection[0]=(long)((lPopsize-1)*rand()/RAND_MAX);//取0到(lPopsize-1)之间的数
  146. int i=0; //i从0开始
  147. long tempSelection;
  148. while(i<lPoptoMutation-1)//
  149. {
  150.         int hh=0;
  151. tempSelection=(long)((lPopsize-1)*rand()/RAND_MAX);
  152. for(int j=0;j<i+1;j++)
  153. {
  154. if(tempSelection==plSelection[j]) 
  155. hh=hh+1;//计数,可以稍微提高效率,不比较完毕
  156. }
  157. if(hh==0) //没有相同的数
  158. {
  159. i=i+1;
  160. plSelection[i]=tempSelection;
  161. }
  162. }
  163. //plSelection[]存储的是发生变异的染色体的索引
  164. for(i=0;i<lPoptoMutation;i++)
  165. {
  166. if(plArray[plSelection[i]*lChrom+lBittoMutation]==1)
  167.             plArray[plSelection[i]*lChrom+lBittoMutation]=0;
  168. else
  169. plArray[plSelection[i]*lChrom+lBittoMutation]=1;
  170. }
  171.      
  172. /* for(int j=0;j<20;j++)
  173. {
  174.     plArray[j]=plPop[j];
  175. }*/
  176.  return 1;
  177. }
  178. //轮盘赌算法
  179. //给定N个染色体的适应值,求出染色体编码数组
  180. int RWS(long* plAdapt, long* plArray,long lPopsize, long lChrom)
  181. {
  182. //判断数组是否含有非0,1值
  183. for(int jj=0;jj<lPopsize*lChrom;jj++)
  184. {
  185. if((plArray[jj]!=1)&(plArray[jj]!=0))
  186. return 0;
  187. }
  188.     //存储选择概率
  189. double* plP=new double[];
  190. if(plP==NULL) return 0;
  191.     double dSum=0.0;
  192. //求适应值的和
  193. for(int i=0;i<lPopsize;i++)
  194. {
  195. dSum=dSum+plAdapt[i];     
  196. }
  197. //求各选择概率
  198. for(i=0;i<lPopsize;i++)
  199. {
  200. plP[i]=plAdapt[i]/dSum;
  201. }
  202. //算法理解,分别产生随机数,选择染色体,包括被重复选取
  203. //存储被选取的染色体序号
  204. long* plSelect=new long[lPopsize];
  205. double dRand=0.0;
  206. double dS=0;
  207. int j=0;
  208. srand((unsigned)time(NULL));
  209. for(i=0;i<lPopsize;i++) //选取个体序列
  210. {
  211. dRand=static_cast<double>((rand()%100)*0.01);//精确到小数点后2位
  212. dS=0;
  213. for(j=0;j<lPopsize;j++) //染色体序列
  214. {
  215. if(dS>=dRand)
  216. {
  217. plSelect[i]=j;
  218.     break;
  219. }
  220. dS=dS+plP[j];
  221. }
  222. }
  223.     long* plSelectedPop=new long[lPopsize*lChrom];// 大小同于给定的初始群体
  224. for(i=0;i<lPopsize;i++)
  225. {
  226. for(j=0;j<lChrom;j++)
  227. {
  228. plSelectedPop[i*lChrom+j]=plArray[plSelect[i]*lChrom+j];
  229. }
  230. }
  231.     for(j=0;j<lPopsize*lChrom;j++)
  232. plArray[j]=plSelectedPop[j]; //需释放
  233. delete []plSelectedPop;
  234. return 1;
  235. }
  236. void main()
  237. {
  238. // cout<<0.5*((int)(rand()/RAND_MAX))<<endl;
  239.     cout<<pow(2,3)<<endl;
  240.     printf("%dn",8&1);
  241. printf("%dn",8&2);
  242.     printf("%dn",8&4);
  243. printf("%dn",8&8);
  244.     printf("%dn",8&16);
  245. long* hehe=long2binary(5,8);
  246. cout<<hehe[0]<<hehe[1]<<hehe[2]<<hehe[3]<<endl;//从高位到低位输出
  247. /* int hehe[4];
  248. for(int i=0;i<4;i++)
  249. {
  250. if(8&&pow(2,i)==0) hehe[3-i]=0;
  251. else  hehe[4-i]=1;
  252. }
  253. */
  254. long* Result=new long[];
  255. CreateChromN(8, 5, Result); 
  256. for(int i=0;i<20;i++)
  257. cout<<Result[i]<<endl;
  258.  delete[] Result;
  259.  ////////////////////////
  260. //long* plResultofCross=new long[20];
  261.      long plPop[20]={1,0,0,0,1,0,0,1,0,1,1,1,0,0,1,1,0,0,1,0};
  262. //交配算法调试
  263.  /*ChromCross(0.5,plPop,4,5);
  264.      for(i=0;i<20;i++)
  265. cout<<(long)plPop[i]<<endl;*/
  266.    
  267.     
  268.  ///////////////////////
  269.  //变异算法调试
  270.  //为验证算法,pMutation取较大值,且要屏蔽交配算法,因交配算法修改了plPop
  271. /* ChromMutation(0.25,plPop,4,5);  
  272.      for(i=0;i<20;i++)
  273. cout<<(long)plPop[i]<<endl;
  274.    */
  275.  //轮盘赌法验证
  276.  
  277.  long lAdapt[4]={32,18,160,100};
  278.      RWS(lAdapt,plPop,4,5);
  279.      for(i=0;i<20;i++)
  280. cout<<(long)plPop[i]<<endl;
  281.    ////
  282.   srand( (unsigned)time(NULL));
  283.        double yyyy;
  284.    /* Display 10 numbers. *////随机数产生不对
  285.      for( i = 0; i < 10;i++ )
  286.  {
  287.      yyyy=static_cast<double>((rand()%100)*0.01);
  288.  printf( "%.2fn",yyyy);
  289.  }
  290.    
  291.  
  292. }