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

Visual C++

  1. /********************************************************************/
  2. /*         基于基本遗传算法的分层遗传改进算法函数最优化   SHGA.C    */
  3. /*     A Function Optimizer using Simple Genetic Algorithm          */
  4. /* developed from the Pascal SGA code presented by David E.Goldberg */
  5. /*              华南理工大学电子与信息学院   苏勇          2004年4月*/
  6. /********************************************************************/
  7. #include <stdio.h>
  8. #include <math.h>
  9. /* 全局变量 */
  10. struct individual                       /* 个体*/
  11. {
  12.     unsigned *chrom;                    /* 染色体 */
  13.     double   fitness;                   /* 个体适应度*/
  14.     double   varible;                   /* 个体对应的变量值*/   
  15.     int      xsite;                     /* 低层交叉位置 */
  16. int  xsiteA; /* 高层交叉位置 */
  17.     int      parent[2];                 /* 父个体  */
  18. int  parentA[2]; /* 高层父个体(父代子群) */
  19.     int      *utility;                  /* 特定数据指针变量 */
  20. };
  21. struct bestever                         /* 最佳个体*/
  22. {
  23.     unsigned *chrom;                    /* 低层遗传运算所得最佳个体染色体*/
  24. unsigned *chromA; /* 全局最佳个体染色体 */
  25.     double   fitness;                   /* 最佳个体适应度 */
  26.     double   varible;                   /* 最佳个体对应的变量值 */
  27.     int      generation;                /* 最佳个体生成代 */
  28. int  subpopulation; /* 最佳个体所在子种群 */
  29. };
  30.  struct individual **oldpop;            /* 当前代种群 */
  31.  struct individual **newpop;            /* 新一代种群 */
  32.  struct bestever bestfit;               /* 最佳个体 */
  33.  double sumfitness;                     /* 种群中个体适应度累计 */
  34.  double sumA; /* 所有子群平均适应度累计 */
  35.  double max;                            /* 种群中个体最大适应度 */
  36.  double maxA; /* 全局最佳适应度值 */
  37.  double avg;                            /* 种群中个体平均适应度 */
  38.  double min;                            /* 种群中个体最小适应度 */
  39.  double minA; /* 全局最小适应度值 */
  40.  double *A; /* 子群平均适应度值数组 */
  41.  float  pcross;                         /* 低层交叉概率 */
  42.  float  pcrossA; /* 高层交叉概率 */
  43.  float  pmutation;                      /* 低层变异概率 */
  44.  float  pmutationA; /* 高层变异概率 */
  45.  int    popsize;                        /* 种群大小  */
  46.  int    lchrom;                         /* 染色体长度*/
  47.  int    chromsize;                      /* 存储一染色体所需字节数 */
  48.  int    gen;                            /* 当前世代数 */
  49.  int    maxgen;                         /* 最大世代数   */
  50.  int    run;                            /* 低层遗传当前运行次数 */
  51.  int runA; /* 高层遗传当前运行次数 */
  52.  int    maxruns;                        /* 总运行次数   */
  53.  int    printstrings;                   /* 输出染色体编码的判断,0 -- 不输出, 1 -- 输出 */
  54.  int    nmutation;                      /* 低层当前代变异发生次数 */
  55.  int nmutationA; /* 高层当前代变异发生次数 */
  56.  int    ncross;                         /* 低层当前代交叉发生次数 */
  57.  int ncrossA; /* 高层当前代交叉发生次数 */
  58.  int subpopnum; /* 子种群个数 */
  59.  int subpop; /* 当前子种群 */
  60.  float randomseed; /* 随机数种子 */
  61.  int shu; /* 当前子群 */
  62.  double varibleA; /* 全局最佳染色体对应变量值 */
  63.  int genA; /* 全局最佳染色体所在代数 */
  64. /* 随机数发生器使用的静态变量 */
  65. static double oldrand[55];
  66. static int jrand;
  67. static double rndx2;
  68. static int rndcalcflag;
  69. /* 输出文件指针 */
  70. FILE *outfp ;
  71. /* 函数定义 */
  72. void advance_random();
  73. int flip(float);rnd(int, int);
  74. void randomize();
  75. double randomnormaldeviate();
  76. float randomperc(),rndreal(float,float);
  77. void warmup_random(float);
  78. void initialize(),initdata(),initpop();
  79. void initreport(),generation(),initmalloc();
  80. void freeall(),nomemory(char *),report();
  81. void reportA();
  82. void writepop(),writechrom(unsigned *);
  83. void preselect();
  84. void statistics(struct individual *);
  85. void title(),repchar (FILE *,char *,int);
  86. void skip(FILE *,int);
  87. int select();
  88. void objfunc(struct individual *);
  89. /* 低层交叉变异函数 */
  90. int crossover (unsigned *, unsigned *, unsigned *, unsigned *);
  91. void mutation(unsigned *);
  92. /* 高层交叉变异函数 */
  93. void CMTransA();
  94. int selectA();
  95. void preselectA();
  96. void initialize()      /* 遗传算法初始化 */
  97. {
  98.     /* 键盘输入遗传算法参数 */
  99.     initdata();
  100.     /* 确定染色体的字节长度 */
  101.     chromsize = (lchrom/(8*sizeof(unsigned)));
  102.     if(lchrom%(8*sizeof(unsigned))) chromsize++;
  103.     /*分配给全局数据结构空间 */
  104.     initmalloc();
  105.     initreport();
  106. }
  107. void initdata()           /* 遗传算法参数输入 */
  108. {
  109.    char  answer[2];
  110.    popsize=30;
  111.    if((popsize%2) != 0)
  112.    {
  113.  fprintf(outfp, "种群大小已设置为偶数n");
  114.  popsize++;
  115.    }
  116.    lchrom=22; /* 染色体长度定义为22 */
  117.    printstrings=1;
  118.    maxgen=100; /* 低层运算100代 */
  119.    pcross=0.8; /* 低层交叉概率0.8 */
  120.    pcrossA=0.2; /* 高层交叉概率0.6 */
  121.    pmutation=0.05; /* 低层变异概率0.05 */
  122.    pmutationA=0.05; /* 高层变异概率0.05 */
  123.    genA=maxgen;
  124. }
  125. void initpop()           /* 随机初始化种群 */
  126. {
  127.     int j, j1, k, stop;
  128.     unsigned mask = 1;
  129.     for(j = 0; j < popsize; j++)
  130.     {
  131.         for(k = 0; k < chromsize; k++)
  132.         {
  133.             oldpop[subpop][j].chrom[k] = 0;
  134.             if(k == (chromsize-1))
  135.                 stop = lchrom - (k*(8*sizeof(unsigned)));
  136.             else
  137.                 stop =8*sizeof(unsigned);
  138.             for(j1 = 1; j1 <= stop; j1++)
  139.             {
  140.                oldpop[subpop][j].chrom[k] = oldpop[subpop][j].chrom[k]<<1;
  141.                if(flip(randomseed))
  142.                   oldpop[subpop][j].chrom[k] = oldpop[subpop][j].chrom[k]|mask;
  143.             }
  144.         }
  145.         oldpop[subpop][j].parent[0] = 0;     /* 初始父个体信息 */
  146.         oldpop[subpop][j].parent[1] = 0;
  147. oldpop[subpop][0].parentA[0]= 0;
  148. oldpop[subpop][0].parentA[1]= 0;
  149.         oldpop[subpop][j].xsite = 0;
  150. oldpop[subpop][0].xsiteA= 0;
  151.         objfunc(&(oldpop[subpop][j]));       /* 计算初始适应度*/
  152.     }
  153. if(subpop==0)
  154. {
  155. maxA = oldpop[0][0].fitness;
  156. minA = oldpop[0][0].fitness;
  157. }
  158. }
  159. void initreport()               /* 初始参数输出 */
  160. {
  161.     void   skip();
  162.     skip(outfp,1);
  163.     fprintf(outfp,"             基本遗传算法参数n");
  164.     fprintf(outfp," -------------------------------------------------n");
  165. fprintf(outfp,"    子种群数(subpopnum)   =   %dn",subpopnum);
  166.     fprintf(outfp,"    种群大小(popsize)     =   %dn",popsize);
  167.     fprintf(outfp,"    染色体长度(lchrom)    =   %dn",lchrom);
  168.     fprintf(outfp,"    最大进化代数(maxgen)  =   %dn",maxgen);
  169.     fprintf(outfp,"    交叉概率(pcross)      =   %fn",pcross);
  170.     fprintf(outfp,"    变异概率(pmutation)   =   %fn",pmutation);
  171.     fprintf(outfp," -------------------------------------------------n");
  172.     skip(outfp,1);
  173.     fflush(outfp);
  174. }
  175. void generation()           /* 低层交叉变异 */
  176. {
  177.   int mate1, mate2, jcross, j = 0;
  178.   /*  每代运算前进行预选 */
  179.   preselect();
  180.   /* 选择, 交叉, 变异 */
  181.   do
  182.     {
  183.       /* 挑选交叉配对 */
  184.       mate1 = select();
  185.       mate2 = select();
  186.       /* 交叉和变异 */
  187.       jcross = crossover(oldpop[subpop][mate1].chrom, oldpop[subpop][mate2].chrom, newpop[subpop][j].chrom, newpop[subpop][j+1].chrom);
  188.       mutation(newpop[subpop][j].chrom);
  189.       mutation(newpop[subpop][j+1].chrom);
  190.       /* 解码, 计算适应度 */
  191.       objfunc(&(newpop[subpop][j]));
  192.       /*记录亲子关系和交叉位置 */
  193.       newpop[subpop][j].parent[0] = mate1+1;
  194.       newpop[subpop][j].xsite = jcross;
  195.       newpop[subpop][j].parent[1] = mate2+1;
  196.       objfunc(&(newpop[subpop][j+1]));
  197.       newpop[subpop][j+1].parent[0] = mate1+1;
  198.       newpop[subpop][j+1].xsite = jcross;
  199.       newpop[subpop][j+1].parent[1] = mate2+1;
  200.       j = j + 2;
  201.     }
  202.   while(j < (popsize-1));
  203. }
  204. void CMTransA() /* 高层交叉变异 */
  205. {
  206. int mateA1, mateA2, jcrossA = 0, k, h, m, j1, j=0;
  207. unsigned mask = 1;
  208. int stop;
  209. preselectA();
  210. do
  211. {
  212. /*////////////  高层交叉 ///////////////*/
  213. mateA1 = selectA();
  214. mateA2 = selectA();
  215. if(flip(pcrossA))
  216. {
  217. jcrossA = (int)rnd(1 ,(popsize - 1));
  218. ncrossA++;
  219. for(m = jcrossA; m < popsize; m++)
  220. {
  221. for(k=0;k< chromsize; k++)
  222. {
  223. oldpop[mateA1][m].chrom[k] = newpop[j+1][m].chrom[k];
  224. oldpop[mateA2][m].chrom[k] = newpop[j][m].chrom[k];
  225. }
  226. }
  227. for(m = 0; m < jcrossA; m++)
  228. {
  229. for(k=0;k< chromsize; k++)
  230. {
  231. oldpop[mateA1][m].chrom[k] = newpop[j][m].chrom[k];
  232. oldpop[mateA2][m].chrom[k] = newpop[j+1][m].chrom[k];
  233. }
  234. }
  235. }
  236. else
  237. {
  238. for(m = 0; m< popsize; m++)
  239. {
  240. for(k=0;k<chromsize;k++)
  241. {
  242. oldpop[mateA1][m].chrom[k] = newpop[j][m].chrom[k];
  243. oldpop[mateA2][m].chrom[k] = newpop[j+1][m].chrom[k];
  244. }
  245. }
  246. jcrossA=0;
  247. }
  248. /*////////////  高层变异 ////////////////*/
  249. if(flip(pmutationA))
  250.         {
  251. nmutationA++;
  252. for(h = 0; h < chromsize; h++)
  253. {
  254. newpop[j][m].chrom[h] = 0;
  255. if(h == (chromsize-1))
  256. stop = lchrom - (h*(8*sizeof(unsigned)));
  257. else
  258. stop =8*sizeof(unsigned);
  259. for(j1 = 1; j1 <= stop; j1++)
  260. {
  261. newpop[j][m].chrom[h] = newpop[j][m].chrom[h]<<1;
  262. if(flip(0.5))
  263. newpop[j][m].chrom[h] = newpop[j][m].chrom[h]|mask;
  264. }
  265. }
  266. }
  267. if(flip(pmutation))
  268.         {
  269. nmutationA++;
  270. for(h = 0; h < chromsize; h++)
  271. {
  272. newpop[j+1][m].chrom[h] = 0;
  273. if(h == (chromsize-1))
  274. stop = lchrom - (h*(8*sizeof(unsigned)));
  275. else
  276. stop =8*sizeof(unsigned);
  277. for(j1 = 1; j1 <= stop; j1++)
  278. {
  279. newpop[j+1][m].chrom[h] = newpop[j+1][m].chrom[h]<<1;
  280. if(flip(0.5))
  281. newpop[j+1][m].chrom[h] = newpop[j+1][m].chrom[h]|mask;
  282. }
  283. }
  284. }
  285. /* 解码, 计算适应度 */
  286. for(k = 0; k < popsize; k++)
  287. objfunc(&(newpop[j][k]));
  288. for(k = 0; k < popsize; k++)
  289. objfunc(&(newpop[j+1][k]));
  290. newpop[j+1][0].parentA[0] = mateA1+1;
  291. newpop[j+1][0].xsiteA = jcrossA;
  292. newpop[j+1][0].parentA[1] = mateA2+1;
  293. j = j + 2;
  294. }
  295. while(j<(subpopnum-1));
  296. }
  297. void initmalloc()              /*为全局数据变量分配空间 */
  298. {
  299.   unsigned nbytes;
  300.   char  *malloc();
  301.   int i,j;
  302.   /* 分配给当前代和新一代种群内存空间 */
  303.   if((A = (double *) malloc(subpopnum*sizeof(double))) == NULL)
  304.     nomemory("A");
  305.   nbytes = popsize*sizeof(struct individual);
  306.   if((oldpop = (struct individual **) malloc(subpopnum*4)) == NULL)
  307.     nomemory("oldpop");
  308.   for(j=0; j<subpopnum;j++)
  309.   {
  310. if((oldpop[j] = (struct individual *) malloc(nbytes)) == NULL)
  311. nomemory("oldpop[j]");
  312.   }
  313.   if((newpop = (struct individual **) malloc(subpopnum*4)) == NULL)
  314.     nomemory("newpop");
  315.   for(j=0; j<subpopnum;j++)
  316.   {
  317. if((newpop[j] = (struct individual *) malloc(nbytes)) == NULL)
  318. nomemory("newpop[j]");
  319.   }
  320.   /* 分配给染色体内存空间 */
  321.   nbytes = chromsize*sizeof(unsigned);
  322.   for(j = 0; j < popsize; j++)
  323.     {
  324.   for(i=0;i<subpopnum;i++)
  325.   {
  326. if((oldpop[i][j].chrom = (unsigned *) malloc(nbytes)) == NULL)
  327. nomemory("oldpop[i] chromosomes");
  328. if((newpop[i][j].chrom = (unsigned *) malloc(nbytes)) == NULL)
  329. nomemory("newpop[i] chromosomes");
  330.   }
  331.     }
  332.   if((bestfit.chrom = (unsigned *) malloc(nbytes)) == NULL)
  333.     nomemory("bestfit chromosome");
  334.   if((bestfit.chromA = (unsigned *) malloc(nbytes)) == NULL)
  335.     nomemory("bestfit chromosomeA");
  336. }
  337. void freeall()               /* 释放内存空间 */
  338. {
  339.   int i,j;
  340.    for(i = 0; i < popsize; i++)
  341.     {
  342.    for(j=0;j<subpopnum;j++)
  343.    {
  344. free(oldpop[j][i].chrom);
  345. free(newpop[j][i].chrom);
  346.    }
  347.     }
  348.   free(A);
  349.   for(j=0;j<subpopnum;j++)
  350.   free(oldpop[j]);
  351.   free(oldpop);
  352.   for(j=0;j<subpopnum;j++)
  353.   free(newpop[j]);
  354.   free(newpop);
  355.   free(bestfit.chrom);
  356.   free(bestfit.chromA);
  357. }
  358. void nomemory(string)        /* 内存不足,退出*/
  359.   char *string;
  360. {
  361.   fprintf(outfp,"malloc: out of memory making %s!!n",string);
  362.   exit(-1);
  363. }
  364. void reportA()
  365. {
  366. void   skip();
  367. int i,j,s;
  368. fprintf(outfp,"第1次高层交叉变异统计报告n");
  369. repchar(outfp,"-",80);
  370. skip(outfp,1); 
  371. for(s=0;s<subpopnum-1;s+=2)
  372. {
  373. fprintf(outfp, "   第%d子种群   ", s+1);
  374. repchar(outfp, " ",lchrom-10);
  375. fprintf(outfp, "  适应度值   ");
  376. repchar(outfp, " ",2);
  377. fprintf(outfp, "   第%d子种群   ", s+2);
  378. repchar(outfp, " ",lchrom-6);
  379. fprintf(outfp, "  适应度值   ");
  380. fprintf(outfp, "  父代子群:");
  381. fprintf(outfp, "(%2d,%2d)", newpop[s+1][0].parentA[0],newpop[s+1][0].parentA[1]);
  382. skip(outfp,1); 
  383. for(i=0;i<popsize-1;i++)
  384. {
  385. fprintf(outfp, "%2d) ",i+1);
  386. writechrom((&newpop[s][i])->chrom);
  387. repchar(outfp, " ",2);
  388. fprintf(outfp, "  %f  " ,newpop[s][i].fitness); 
  389. repchar(outfp, " ",5);
  390. fprintf(outfp, "%2d) ",i+1);
  391. writechrom((&newpop[s][i+1])->chrom);
  392. repchar(outfp, " ",2);
  393. fprintf(outfp, "  %f  " ,newpop[s][i+1].fitness); 
  394. skip(outfp,1);
  395. }
  396. repchar(outfp,"-",80);
  397. skip(outfp,1);
  398. fprintf(outfp, "高层交叉次数:  %d  ,  高层变异次数:  %d ",ncrossA,nmutationA);
  399. skip(outfp,1);
  400. }
  401. fprintf(outfp," 迄今发现最佳个体   =>  所在分层: %d 所在子群: %d  所在代数: %d ", runA,bestfit.subpopulation , genA);
  402. fprintf(outfp," 适应度:%f  染色体: ", maxA);
  403. writechrom((&bestfit)->chromA);
  404. fprintf(outfp," 对应的变量值: %f", varibleA);
  405. skip(outfp,1);
  406. fprintf(outfp," 迄今发现最小适应度 => %f ",minA);
  407. skip(outfp,1);
  408. repchar(outfp,"-",80);
  409. skip(outfp,1);  
  410. }
  411. void report()                /* 输出种群统计结果 */
  412. {
  413.     void  repchar(), skip();
  414.     void  writepop(), writestats();
  415.     repchar(outfp,"-",80);
  416.     skip(outfp,1); 
  417.     if(printstrings == 1)
  418.     {
  419.         repchar(outfp," ",((80-17)/2));
  420.         fprintf(outfp,"第%d子种群模拟计算统计报告  n",(subpop+1));
  421.         fprintf(outfp, "世代数 %3d", gen);
  422.         repchar(outfp," ",(80-28));
  423.         fprintf(outfp, "世代数 %3dn", (gen+1));
  424.         fprintf(outfp,"个体  染色体编码");
  425.         repchar(outfp," ",lchrom-5);
  426.         fprintf(outfp,"适应度    父个体 交叉位置  ");
  427.         fprintf(outfp,"染色体编码 ");
  428.         repchar(outfp," ",lchrom-5);
  429.         fprintf(outfp,"适应度n");
  430.         repchar(outfp,"-",80);
  431.         skip(outfp,1);
  432.         writepop(outfp);
  433.         repchar(outfp,"-",80);
  434.         skip(outfp,1);
  435.      }
  436.     fprintf(outfp," 第 %d 代统计: n",gen);
  437.     fprintf(outfp," 总交叉操作次数 = %d, 总变异操作数 = %dn",ncross,nmutation);
  438.     fprintf(outfp," 子群中最小适应度:%f 最大适应度:%f  平均适应度 %fn", min,max,A[subpop]);
  439.     fprintf(outfp," 子群中发现最佳个体 =>  所在代数: %d  ", bestfit.generation);
  440.     fprintf(outfp," 适应度:%f  染色体: ", bestfit.fitness);
  441.     writechrom((&bestfit)->chrom);
  442.     fprintf(outfp," 对应的变量值: %f", bestfit.varible);
  443. skip(outfp,1);
  444. fprintf(outfp," 迄今发现最佳个体   =>  所在分层: %d 所在子群: %d  所在代数: %d ", runA,bestfit.subpopulation,genA);
  445. fprintf(outfp," 适应度:%f  染色体: ", maxA);
  446.     writechrom((&bestfit)->chromA);
  447. fprintf(outfp," 对应的变量值: %f", varibleA);
  448. skip(outfp,1);
  449. fprintf(outfp," 迄今发现最小适应度 => %f ",minA);
  450.     skip(outfp,1);
  451.     repchar(outfp,"-",80);
  452.     skip(outfp,1);  
  453. }
  454. void writepop()
  455. {
  456.     struct individual *pind;
  457.     int j;
  458.     for(j=0; j<popsize; j++)
  459.     {
  460.         fprintf(outfp,"%3d)  ",j+1);
  461.         /* 当前代个体 */
  462.         pind = &(oldpop[subpop][j]);
  463.         writechrom(pind->chrom);
  464.         fprintf(outfp,"  %8f | ", pind->fitness);
  465.         /* 新一代个体 */
  466.         pind = &(newpop[subpop][j]);
  467.         fprintf(outfp,"(%2d,%2d)   %2d   ",
  468.         pind->parent[0], pind->parent[1], pind->xsite);
  469.         writechrom(pind->chrom);
  470.         fprintf(outfp,"  %8fn", pind->fitness);
  471.     }
  472. }
  473. void writechrom(chrom)           /* 输出染色体编码 */
  474. unsigned *chrom;
  475. {
  476.     int j, k, stop;
  477.     unsigned mask = 1, tmp;
  478.     for(k = 0; k < chromsize; k++)
  479.     {
  480.         tmp = chrom[k];
  481.         if(k == (chromsize-1))
  482.             stop = lchrom - (k*(8*sizeof(unsigned)));
  483.         else
  484.             stop =8*sizeof(unsigned);
  485.         for(j = 0; j < stop; j++)
  486.         {
  487.             if(tmp&mask)
  488.                 fprintf(outfp,"1");
  489.             else
  490.                 fprintf(outfp,"0");
  491.             tmp = tmp>>1;
  492.         }
  493.     }
  494. }
  495. void preselect()
  496. {
  497.     int j;
  498.     sumfitness = 0;
  499.     for(j = 0; j < popsize; j++) sumfitness += oldpop[subpop][j].fitness;
  500. }
  501. void preselectA()
  502. {
  503. int j;
  504. sumA = 0.0;
  505. for(j = 0; j< subpopnum; j++) sumA += A[j];
  506. }
  507. int select()                    /* 轮盘赌选择*/
  508. {
  509.     extern float randomperc();
  510.     float sum, pick;
  511.     int i;
  512.     pick = randomperc();
  513.     sum = 0;
  514.     if(sumfitness != 0)
  515.     {
  516.         for(i = 0; (sum < pick) && (i < popsize); i++)
  517.             sum += oldpop[subpop][i].fitness/sumfitness;
  518.     }
  519.     else
  520.         i = rnd(1,popsize);
  521.     return(i-1);
  522. }
  523. int selectA()
  524. {
  525. extern float randomperc();
  526.     double sum;
  527. float pick;
  528.     int i;
  529.     pick = randomperc();
  530.     sum = 0.0;
  531.     if(sumA != 0)
  532.     {
  533.         for(i = 0; (sum < pick) && (i < subpopnum); i++)
  534.             sum += A[i]/sumA;
  535.     }
  536.     else
  537.         i = rnd(1,subpopnum);
  538.     return(i-1);
  539. }
  540. void statistics(pop)  /* 计算种群统计数据 */
  541. struct individual *pop;
  542. {
  543.     int i, j;
  544.     sumfitness = 0.0;
  545.     min = pop[0].fitness;
  546.     max = pop[0].fitness;
  547.     /* 计算最大、最小和累计适应度 */
  548.     for(j = 0; j < popsize; j++)
  549.     {
  550.         sumfitness = sumfitness + pop[j].fitness;            
  551.         if(pop[j].fitness > max) max = pop[j].fitness;        
  552.         if(pop[j].fitness < min) min = pop[j].fitness;
  553.         /* new global best-fit individual */
  554.         if(pop[j].fitness > bestfit.fitness)
  555.   {
  556.    for(i = 0; i < chromsize; i++)
  557.     bestfit.chrom[i]      = pop[j].chrom[i];
  558.             bestfit.fitness    = pop[j].fitness;
  559.             bestfit.varible   = pop[j].varible;  
  560.             bestfit.generation = gen;
  561.   }
  562.       }
  563.     /* 计算平均适应度 */
  564. if(bestfit.fitness>=maxA)
  565. {
  566. maxA=bestfit.fitness;
  567. for(i = 0; i < chromsize; i++)
  568. bestfit.chromA[i] = bestfit.chrom[i];
  569. varibleA = bestfit.varible;
  570. bestfit.subpopulation = subpop+1;
  571. runA=run;
  572. genA=bestfit.generation;
  573. }
  574. if(min<=minA) minA = min;
  575.     avg = sumfitness/popsize;
  576. if(subpop!=(subpopnum-1))
  577. A[subpop]=avg;
  578. }
  579. void title()
  580. {
  581.   printf("SGA Optimizer Jean.Timexn");
  582. }
  583. void repchar (outfp,ch,repcount)
  584. FILE *outfp;
  585. char *ch;
  586. int repcount;
  587. {
  588.     int j;
  589.     for (j = 1; j <= repcount; j++) fprintf(outfp,"%s", ch);
  590. }
  591. void skip(outfp,skipcount)
  592. FILE *outfp;
  593. int skipcount;
  594. {
  595.     int j;
  596.     for (j = 1; j <= skipcount; j++) fprintf(outfp,"n");
  597. }
  598. void objfunc(critter)            /* 计算适应度函数值 */
  599. struct individual *critter;
  600. {
  601.     unsigned mask=1;
  602.     unsigned bitpos;
  603.     unsigned tp;
  604.     double pow(), bitpow ;
  605.     int j, k, stop;
  606.     critter->varible = 0.0;
  607.     for(k = 0; k < chromsize; k++)
  608.     {
  609.         if(k == (chromsize-1))
  610.             stop = lchrom-(k*(8*sizeof(unsigned)));
  611.         else
  612.             stop =8*sizeof(unsigned);
  613.         tp = critter->chrom[k];
  614.         for(j = 0; j < stop; j++)
  615.         {
  616.             bitpos = j + (8*sizeof(unsigned))*k;
  617.             if((tp&mask) == 1)
  618.             {
  619.                 bitpow = pow(2.0,(double) bitpos);
  620.                 critter->varible = critter->varible + bitpow;
  621.             }
  622.             tp = tp>>1;
  623.         }
  624.     }
  625.     critter->varible =-1+critter->varible*3/(pow(2.0,(double)lchrom)-1);
  626.     critter->fitness =critter->varible*sin(critter->varible*10*atan(1)*4)+2.0;
  627. }
  628. void  mutation(unsigned *child)   /*变异操作*/
  629. {
  630.     int j, k, stop;
  631.     unsigned mask, temp = 1;
  632.     for(k = 0; k < chromsize; k++)
  633.     {
  634.         mask = 0;
  635.         if(k == (chromsize-1))
  636.             stop = lchrom - (k*(8*sizeof(unsigned)));
  637.         else
  638.             stop = 8*sizeof(unsigned);
  639.         for(j = 0; j < stop; j++)
  640.         {
  641.             if(flip(pmutation))
  642.             {
  643.                 mask = mask|(temp<<j);
  644.                 nmutation++;
  645.             }
  646.         }
  647.         child[k] = child[k]^mask;
  648.     }
  649. }
  650. int crossover (unsigned *parent1, unsigned *parent2, unsigned *child1, unsigned *child2)
  651. /* 由两个父个体交叉产生两个子个体 */
  652. {
  653.     int j, jcross, k;
  654.     unsigned mask, temp;
  655.     if(flip(pcross))
  656.     {
  657.         jcross = rnd(1 ,(lchrom - 1));/* Cross between 1 and l-1 */
  658.         ncross++;
  659.         for(k = 1; k <= chromsize; k++)
  660.         {
  661.             if(jcross >= (k*(8*sizeof(unsigned))))
  662.             {
  663.                 child1[k-1] = parent1[k-1];
  664.                 child2[k-1] = parent2[k-1];
  665.             }
  666.             else if((jcross < (k*(8*sizeof(unsigned)))) && (jcross > ((k-1)*(8*sizeof(unsigned)))))
  667.             {
  668.                 mask = 1;
  669.                 for(j = 1; j <= (jcross-1-((k-1)*(8*sizeof(unsigned)))); j++)
  670.                 {
  671.                     temp = 1;
  672.                     mask = mask<<1;
  673.                     mask = mask|temp;
  674.                 }
  675.                 child1[k-1] = (parent1[k-1]&mask)|(parent2[k-1]&(~mask));
  676.                 child2[k-1] = (parent1[k-1]&(~mask))|(parent2[k-1]&mask);
  677.             }
  678.             else
  679.             {
  680.                 child1[k-1] = parent2[k-1];
  681.                 child2[k-1] = parent1[k-1];
  682.             }
  683.         }
  684.     }
  685.     else
  686.     {
  687.         for(k = 0; k < chromsize; k++)
  688.         {
  689.             child1[k] = parent1[k];
  690.             child2[k] = parent2[k];
  691.         }
  692.         jcross = 0;
  693.     }
  694.     return(jcross);
  695. }
  696. void advance_random()          /* 产生55个随机数 */
  697. {
  698.     int j1;
  699.     double new_random;
  700.     for(j1 = 0; j1 < 24; j1++)
  701.     {
  702.         new_random = oldrand[j1] - oldrand[j1+31];
  703.         if(new_random < 0.0) new_random = new_random + 1.0;
  704.         oldrand[j1] = new_random;
  705.     }
  706.     for(j1 = 24; j1 < 55; j1++)
  707.     {
  708.         new_random = oldrand [j1] - oldrand [j1-24];
  709.         if(new_random < 0.0) new_random = new_random + 1.0;
  710.         oldrand[j1] = new_random;
  711.     }
  712. }
  713. int flip(float prob)          /* 以一定概率产生0或1 */
  714. {
  715.     float randomperc();
  716.     if(randomperc() <= prob)
  717.         return(1);
  718.     else
  719.         return(0);
  720. }
  721. void randomize()            /* 设定随机数种子并初始化随机数发生器 */
  722. {
  723.     int j1;
  724.     for(j1=0; j1<=54; j1++)
  725.       oldrand[j1] = 0.0;
  726.     jrand=0;
  727.     warmup_random(randomseed);
  728. }
  729. double randomnormaldeviate()         /* 产生随机标准差 */
  730. {
  731.     double sqrt(), log(), sin(), cos();
  732.     float randomperc();
  733.     double t, rndx1;
  734.     if(rndcalcflag)
  735.     {   rndx1 = sqrt(- 2.0*log((double) randomperc()));
  736.         t = 6.2831853072 * (double) randomperc();
  737.         rndx2 = rndx1 * sin(t);
  738.         rndcalcflag = 0;
  739.         return(rndx1 * cos(t));
  740.     }
  741.     else
  742.     {
  743.         rndcalcflag = 1;
  744.         return(rndx2);
  745.     }
  746. }
  747. float randomperc()            /*与库函数random()作用相同, 产生[0,1]之间一个随机数 */
  748. {
  749.     jrand++;
  750.     if(jrand >= 55)
  751.     {
  752.         jrand = 1;
  753.         advance_random();
  754.     }
  755.     return((float) oldrand[jrand]);
  756. }
  757. int rnd(low, high)           /*在整数low和high之间产生一个随机整数*/
  758. int low,high;
  759. {
  760.     int i;
  761.     float randomperc();
  762.     if(low >= high)
  763.         i = low;
  764.     else
  765.     {
  766.         i = (randomperc() * (high - low + 1)) + low;
  767.         if(i > high) i = high;
  768.     }
  769.     return(i);
  770. }
  771. void warmup_random(float random_seed)       /* 初始化随机数发生器*/
  772. {
  773.     int j1, ii;
  774.     double new_random, prev_random;
  775.     oldrand[54] = random_seed;
  776.     new_random = 0.000000001;
  777.     prev_random = random_seed;
  778.     for(j1 = 1 ; j1 <= 54; j1++)
  779.     {
  780.         ii = (21*j1)%54;
  781.         oldrand[ii] = new_random;
  782.         new_random = prev_random-new_random;
  783.         if(new_random<0.0) new_random = new_random + 1.0;
  784.         prev_random = oldrand[ii];
  785.     }
  786.     advance_random();
  787.     advance_random();
  788.     advance_random();
  789.     jrand = 0;
  790. }
  791. main()           /*  主程序  */
  792. {
  793.     struct individual **temp;
  794.     FILE   *fopen();
  795.     void   title();
  796.     char   *malloc();
  797.         if((outfp = fopen("output4.txt","w")) == NULL)
  798.         {
  799.            fprintf(stderr,"Cannot open output file %sn","output4.txt");
  800.             exit(-1);
  801.         }
  802.      title();
  803.      maxruns=2;
  804.    for(run=1; run<=maxruns; run++)
  805.    {
  806.  
  807.  subpopnum=20;
  808.  if(run==1)
  809.  {
  810. initialize();
  811. bestfit.subpopulation = 0;
  812. varibleA = 0;
  813.  }
  814.  randomseed = 0;
  815.  ncross=0;
  816.  nmutation=0;
  817.  for(subpop=0;subpop<subpopnum;subpop++)
  818.  {
  819.         /* 初始化随机数发生器 */
  820. randomseed += (float)(1)/(float)(subpopnum+run);
  821. randomize();
  822.     /* 初始化全局计数变量和一些数值*/
  823. nmutation = 0;
  824. ncross = 0;
  825. bestfit.fitness = 0.0;
  826. bestfit.generation = 0;
  827.     /* 初始化种群,并统计计算结果 */
  828. if(run==1)
  829. initpop();
  830. statistics(oldpop[subpop]);
  831. for(gen=0; gen<maxgen; gen++)
  832. {
  833. generation();
  834.             /* 计算新一代种群的适应度统计数据 */
  835. statistics(newpop[subpop]);
  836. temp = oldpop;
  837. oldpop = newpop;
  838. newpop = temp;
  839. }
  840. report();
  841. if(subpop==(subpopnum-1))
  842. {
  843. ncrossA=0;
  844. nmutationA=0;
  845. fprintf(outfp,"n第 %d / %d 次分层优化n", run,maxruns);
  846. /* 选择交叉变异 */
  847. CMTransA();
  848. /* 计算新一代种群的适应度统计数据 */
  849. for(shu = 0; shu<subpopnum; shu++)
  850. statistics(newpop[shu]);
  851. reportA();
  852. temp = oldpop;
  853. oldpop = newpop;
  854. newpop = temp;
  855. }
  856.  }
  857.    }
  858.  freeall();
  859.  fclose(outfp);
  860. }