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

Visual C++

  1. /********************************************************************/
  2. /*             基于基本遗传算法的函数最优化(预选择机制)   SGA_Y.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      parent[2];                 /* 父个体  */
  17.     int      *utility;                  /* 特定数据指针变量 */
  18. };
  19. struct bestever                         /* 最佳个体*/
  20. {
  21.     unsigned *chrom;                    /* 最佳个体染色体*/
  22.     double   fitness;                   /* 最佳个体适应度 */
  23.     double   varible;                   /* 最佳个体对应的变量值 */
  24.     int      generation;                /* 最佳个体生成代 */
  25. };
  26.  struct individual *oldpop;             /* 当前代种群 */
  27.  struct individual *newpop;             /* 新一代种群 */
  28.  struct bestever bestfit;               /* 最佳个体 */
  29.  double sumfitness;                     /* 种群中个体适应度累计 */
  30.  double max;                            /* 种群中个体最大适应度 */
  31.  double avg;                            /* 种群中个体平均适应度 */
  32.  double min;                            /* 种群中个体最小适应度 */
  33.  float  pcross;                         /* 交叉概率 */
  34.  float  pmutation;                      /* 变异概率 */
  35.  int    popsize;                        /* 种群大小  */
  36.  int    lchrom;                         /* 染色体长度*/
  37.  int    chromsize;                      /* 存储一染色体所需字节数 */
  38.  int    gen;                            /* 当前世代数 */
  39.  int    maxgen;                         /* 最大世代数   */
  40.  int    run;                            /* 当前运行次数 */
  41.  int    maxruns;                        /* 总运行次数   */
  42.  int    printstrings;                   /* 输出染色体编码的判断,0 -- 不输出, 1 -- 输出 */
  43.  int    nmutation;                      /* 当前代变异发生次数 */
  44.  int    ncross;                         /* 当前代交叉发生次数 */
  45. /* 随机数发生器使用的静态变量 */
  46. static double oldrand[55];
  47. static int jrand;
  48. static double rndx2;
  49. static int rndcalcflag;
  50. /* 输出文件指针 */
  51. FILE *outfp ;
  52. /* 函数定义 */
  53. void advance_random();
  54. int flip(float);rnd(int, int);
  55. void randomize();
  56. double randomnormaldeviate();
  57. float randomperc(),rndreal(float,float);
  58. void warmup_random(float);
  59. void initialize(),initdata(),initpop();
  60. void initreport(),generation(),initmalloc();
  61. void freeall(),nomemory(char *),report();
  62. void writepop(),writechrom(unsigned *);
  63. void preselect();
  64. void statistics(struct individual *);
  65. void title(),repchar (FILE *,char *,int);
  66. void skip(FILE *,int);
  67. int select();
  68. void objfunc(struct individual *);
  69. int crossover (unsigned *, unsigned *, unsigned *, unsigned *);
  70. void mutation(unsigned *);
  71. void initialize()      /* 遗传算法初始化 */
  72. {
  73.     /* 键盘输入遗传算法参数 */
  74.     initdata();
  75.     /* 确定染色体的字节长度 */
  76.     chromsize = (lchrom/(8*sizeof(unsigned)));
  77.     if(lchrom%(8*sizeof(unsigned))) chromsize++;
  78.     /*分配给全局数据结构空间 */
  79.     initmalloc();
  80.     /* 初始化随机数发生器 */
  81.     randomize();
  82.     /* 初始化全局计数变量和一些数值*/
  83.     nmutation = 0;
  84.     ncross = 0;
  85.     bestfit.fitness = 0.0;
  86.     bestfit.generation = 0;
  87.     /* 初始化种群,并统计计算结果 */
  88.     initpop();
  89.     statistics(oldpop);
  90.     initreport();
  91. }
  92. void initdata()           /* 遗传算法参数输入 */
  93. {
  94.    char  answer[2];
  95.    popsize=30;
  96.    if((popsize%2) != 0)
  97.    {
  98. fprintf(outfp, "种群大小已设置为偶数n");
  99. popsize++;
  100.    };
  101.    lchrom=22;
  102.    printstrings=1;
  103.    maxgen=150;
  104.    pcross=0.8;
  105.    pmutation=0.005;
  106. }
  107. void initpop()           /* 随机初始化种群 */
  108. {
  109.     int j, j1, k, stop;
  110.     unsigned mask = 1;
  111.     for(j = 0; j < popsize; j++)
  112.     {
  113.         for(k = 0; k < chromsize; k++)
  114.         {
  115.             oldpop[j].chrom[k] = 0;
  116.             if(k == (chromsize-1))
  117.                 stop = lchrom - (k*(8*sizeof(unsigned)));
  118.             else
  119.                 stop =8*sizeof(unsigned);
  120.             for(j1 = 1; j1 <= stop; j1++)
  121.             {
  122.                oldpop[j].chrom[k] = oldpop[j].chrom[k]<<1;
  123.                if(flip(0.5))
  124.                   oldpop[j].chrom[k] = oldpop[j].chrom[k]|mask;
  125.             }
  126.         }
  127.         oldpop[j].parent[0] = 0;     /* 初始父个体信息 */
  128.         oldpop[j].parent[1] = 0;
  129.         oldpop[j].xsite = 0;
  130.         objfunc(&(oldpop[j]));       /* 计算初始适应度*/
  131.     }
  132. }
  133. void initreport()               /* 初始参数输出 */
  134. {
  135.     void   skip();
  136.     skip(outfp,1);
  137.     fprintf(outfp,"             基本遗传算法参数n");
  138.     fprintf(outfp," -------------------------------------------------n");
  139.     fprintf(outfp,"    种群大小(popsize)     =   %dn",popsize);
  140.     fprintf(outfp,"    染色体长度(lchrom)    =   %dn",lchrom);
  141.     fprintf(outfp,"    最大进化代数(maxgen)  =   %dn",maxgen);
  142.     fprintf(outfp,"    交叉概率(pcross)      =   %fn",pcross);
  143.     fprintf(outfp,"    变异概率(pmutation)   =   %fn",pmutation);
  144.     fprintf(outfp," -------------------------------------------------n");
  145.     skip(outfp,1);
  146.     fflush(outfp);
  147. }
  148. void generation()
  149. {
  150.   int mate1, mate2, jcross, i=0, j = 0;
  151.   /*  每代运算前进行预选 */
  152.   preselect();
  153.   /* 选择, 交叉, 变异 */
  154.   do
  155.     {
  156.       /* 挑选交叉配对 */
  157.       mate1 = select();
  158.       mate2 = select();
  159.       /* 交叉和变异 */
  160.       jcross = crossover(oldpop[mate1].chrom, oldpop[mate2].chrom, newpop[j].chrom, newpop[j+1].chrom);
  161.       mutation(newpop[j].chrom);
  162.       mutation(newpop[j+1].chrom);
  163.       /* 解码, 计算适应度 */
  164.   objfunc(&(oldpop[mate1]));
  165.   objfunc(&(oldpop[mate2]));
  166.       objfunc(&(newpop[j]));
  167.   objfunc(&(newpop[j+1]));
  168.   /* 子代全部优于父代 */
  169.   if((newpop[j].fitness>oldpop[mate1].fitness)&&(newpop[j].fitness>oldpop[mate2].fitness)&&(newpop[j+1].fitness>oldpop[mate1].fitness)&&(newpop[j+1].fitness>oldpop[mate2].fitness))
  170.   {
  171.   
  172.   }
  173.   /* 子代全部劣于父代 */
  174.   else if((newpop[j].fitness<oldpop[mate1].fitness)&&(newpop[j].fitness<oldpop[mate2].fitness)&&(newpop[j+1].fitness<oldpop[mate1].fitness)&&(newpop[j+1].fitness<oldpop[mate2].fitness))
  175.   {
  176.   for(i=0;i<chromsize;i++)
  177.   {
  178. newpop[j].chrom[i]=oldpop[mate1].chrom[i];
  179. newpop[j+1].chrom[i]=oldpop[mate2].chrom[i];
  180.   }
  181.   }
  182.   /* 子代中有一个比父代优秀 */
  183.   else
  184.   {
  185.   if(oldpop[mate1].fitness>=oldpop[mate2].fitness)
  186.   {
  187.   if(newpop[j].fitness>=newpop[j+1].fitness)
  188.   {
  189.   for(i=0;i<chromsize;i++)
  190.   {
  191.  newpop[j+1].chrom[i]=oldpop[mate1].chrom[i];
  192.   }
  193.   }
  194.   else
  195.   {
  196.   for(i=0;i<chromsize;i++)
  197.   {
  198.  newpop[j].chrom[i]=oldpop[mate1].chrom[i];
  199.   }
  200.   }
  201.   }
  202.   else
  203.   {
  204.   if(newpop[j].fitness>=newpop[j+1].fitness)
  205.   {
  206.   for(i=0;i<chromsize;i++)
  207.   {
  208.  newpop[j+1].chrom[i]=oldpop[mate2].chrom[i];
  209.   }
  210.   }
  211.   else
  212.   {
  213.   for(i=0;i<chromsize;i++)
  214.   {
  215.  newpop[j].chrom[i]=oldpop[mate2].chrom[i];
  216.   }
  217.   }
  218.   }
  219.   }
  220.   /*记录亲子关系和交叉位置 */
  221.       newpop[j].parent[0] = mate1+1;
  222.   newpop[j].xsite = jcross;
  223.   newpop[j].parent[1] = mate2+1;
  224.   newpop[j+1].parent[0] = mate1+1;
  225.   newpop[j+1].xsite = jcross;
  226.   newpop[j+1].parent[1] = mate2+1;
  227.       j = j + 2;
  228.     }
  229.   while(j < (popsize-1));
  230. }
  231. void initmalloc()              /*为全局数据变量分配空间 */
  232. {
  233.   unsigned nbytes;
  234.   char  *malloc();
  235.   int j;
  236.   /* 分配给当前代和新一代种群内存空间 */
  237.   nbytes = popsize*sizeof(struct individual);
  238.   if((oldpop = (struct individual *) malloc(nbytes)) == NULL)
  239.     nomemory("oldpop");
  240.   if((newpop = (struct individual *) malloc(nbytes)) == NULL)
  241.     nomemory("newpop");
  242.   /* 分配给染色体内存空间 */
  243.   nbytes = chromsize*sizeof(unsigned);
  244.   for(j = 0; j < popsize; j++)
  245.     {
  246.       if((oldpop[j].chrom = (unsigned *) malloc(nbytes)) == NULL)
  247. nomemory("oldpop chromosomes");
  248.       if((newpop[j].chrom = (unsigned *) malloc(nbytes)) == NULL)
  249. nomemory("newpop chromosomes");
  250.     }
  251.   if((bestfit.chrom = (unsigned *) malloc(nbytes)) == NULL)
  252.     nomemory("bestfit chromosome");
  253. }
  254. void freeall()               /* 释放内存空间 */
  255. {
  256.   int i;
  257.    for(i = 0; i < popsize; i++)
  258.     {
  259.       free(oldpop[i].chrom);
  260.       free(newpop[i].chrom);
  261.     }
  262.   free(oldpop);
  263.   free(newpop);
  264.   free(bestfit.chrom);
  265.    }
  266. void nomemory(string)        /* 内存不足,退出*/
  267.   char *string;
  268. {
  269.   fprintf(outfp,"malloc: out of memory making %s!!n",string);
  270.   exit(-1);
  271. }
  272. void report()                /* 输出种群统计结果 */
  273. {
  274.     void  repchar(), skip();
  275.     void  writepop(), writestats();
  276.     repchar(outfp,"-",80);
  277.     skip(outfp,1); 
  278.     if(printstrings == 1)
  279.     {
  280.         repchar(outfp," ",((80-17)/2));
  281.         fprintf(outfp,"模拟计算统计报告  n");
  282.         fprintf(outfp, "世代数 %3d", gen);
  283.         repchar(outfp," ",(80-28));
  284.         fprintf(outfp, "世代数 %3dn", (gen+1));
  285.         fprintf(outfp,"个体  染色体编码");
  286.         repchar(outfp," ",lchrom-5);
  287.         fprintf(outfp,"适应度    父个体 交叉位置  ");
  288.         fprintf(outfp,"染色体编码 ");
  289.         repchar(outfp," ",lchrom-5);
  290.         fprintf(outfp,"适应度n");
  291.         repchar(outfp,"-",80);
  292.         skip(outfp,1);
  293.         writepop(outfp);
  294.         repchar(outfp,"-",80);
  295.         skip(outfp,1);
  296.      }
  297.     fprintf(outfp,"第 %d 代统计: n",gen);
  298.     fprintf(outfp,"总交叉操作次数 = %d, 总变异操作数 = %dn",ncross,nmutation);
  299.     fprintf(outfp," 最小适应度:%f 最大适应度:%f  平均适应度 %fn", min,max,avg);
  300.     fprintf(outfp," 迄今发现最佳个体 =>  所在代数: %d  ", bestfit.generation);
  301.     fprintf(outfp," 适应度:%f  染色体:", bestfit.fitness);
  302.     writechrom((&bestfit)->chrom);
  303.     fprintf(outfp," 对应的变量值: %f", bestfit.varible);
  304.     skip(outfp,1);
  305.     repchar(outfp,"-",80);
  306.     skip(outfp,1);  
  307. }
  308. void writepop()
  309. {
  310.     struct individual *pind;
  311.     int j;
  312.     for(j=0; j<popsize; j++)
  313.     {
  314.         fprintf(outfp,"%3d)  ",j+1);
  315.         /* 当前代个体 */
  316.         pind = &(oldpop[j]);
  317.         writechrom(pind->chrom);
  318.         fprintf(outfp,"  %8f | ", pind->fitness);
  319.         /* 新一代个体 */
  320.         pind = &(newpop[j]);
  321.         fprintf(outfp,"(%2d,%2d)   %2d   ",
  322.         pind->parent[0], pind->parent[1], pind->xsite);
  323.         writechrom(pind->chrom);
  324.         fprintf(outfp,"  %8fn", pind->fitness);
  325.     }
  326. }
  327. void writechrom(chrom)           /* 输出染色体编码 */
  328. unsigned *chrom;
  329. {
  330.     int j, k, stop;
  331.     unsigned mask = 1, tmp;
  332.     for(k = 0; k < chromsize; k++)
  333.     {
  334.         tmp = chrom[k];
  335.         if(k == (chromsize-1))
  336.             stop = lchrom - (k*(8*sizeof(unsigned)));
  337.         else
  338.             stop =8*sizeof(unsigned);
  339.         for(j = 0; j < stop; j++)
  340.         {
  341.             if(tmp&mask)
  342.                 fprintf(outfp,"1");
  343.             else
  344.                 fprintf(outfp,"0");
  345.             tmp = tmp>>1;
  346.         }
  347.     }
  348. }
  349. void preselect()
  350. {
  351.     int j;
  352.     sumfitness = 0;
  353.     for(j = 0; j < popsize; j++) sumfitness += oldpop[j].fitness;
  354. }
  355. int select()                    /* 轮盘赌选择*/
  356. {
  357.     extern float randomperc();
  358.     float sum, pick;
  359.     int i;
  360.     pick = randomperc();
  361.     sum = 0;
  362.     if(sumfitness != 0)
  363.     {
  364.         for(i = 0; (sum < pick) && (i < popsize); i++)
  365.             sum += oldpop[i].fitness/sumfitness;
  366.     }
  367.     else
  368.         i = rnd(1,popsize);
  369.     return(i-1);
  370. }
  371. void statistics(pop)  /* 计算种群统计数据 */
  372. struct individual *pop;
  373. {
  374.     int i, j;
  375.     sumfitness = 0.0;
  376.     min = pop[0].fitness;
  377.     max = pop[0].fitness;
  378.     /* 计算最大、最小和累计适应度 */
  379.     for(j = 0; j < popsize; j++)
  380.     {
  381.         sumfitness = sumfitness + pop[j].fitness;            
  382.         if(pop[j].fitness > max) max = pop[j].fitness;        
  383.         if(pop[j].fitness < min) min = pop[j].fitness;         
  384.         /* new global best-fit individual */
  385.         if(pop[j].fitness > bestfit.fitness)
  386.   {
  387.    for(i = 0; i < chromsize; i++)
  388.     bestfit.chrom[i]      = pop[j].chrom[i];
  389.             bestfit.fitness    = pop[j].fitness;
  390.             bestfit.varible   = pop[j].varible;  
  391.             bestfit.generation = gen;
  392.   }
  393.       }
  394.     /* 计算平均适应度 */
  395.     avg = sumfitness/popsize;
  396. }
  397. void title()
  398. {
  399.   printf("SGA Optimizer Jean.Timexn");
  400. }
  401. void repchar (outfp,ch,repcount)
  402. FILE *outfp;
  403. char *ch;
  404. int repcount;
  405. {
  406.     int j;
  407.     for (j = 1; j <= repcount; j++) fprintf(outfp,"%s", ch);
  408. }
  409. void skip(outfp,skipcount)
  410. FILE *outfp;
  411. int skipcount;
  412. {
  413.     int j;
  414.     for (j = 1; j <= skipcount; j++) fprintf(outfp,"n");
  415. }
  416. void objfunc(critter)            /* 计算适应度函数值 */
  417. struct individual *critter;
  418. {
  419.     unsigned mask=1;
  420.     unsigned bitpos;
  421.     unsigned tp;
  422.     double pow(), bitpow ;
  423.     int j, k, stop;
  424.     critter->varible = 0.0;
  425.     for(k = 0; k < chromsize; k++)
  426.     {
  427.         if(k == (chromsize-1))
  428.             stop = lchrom-(k*(8*sizeof(unsigned)));
  429.         else
  430.             stop =8*sizeof(unsigned);
  431.         tp = critter->chrom[k];
  432.         for(j = 0; j < stop; j++)
  433.         {
  434.             bitpos = j + (8*sizeof(unsigned))*k;
  435.             if((tp&mask) == 1)
  436.             {
  437.                 bitpow = pow(2.0,(double) bitpos);
  438.                 critter->varible = critter->varible + bitpow;
  439.             }
  440.             tp = tp>>1;
  441.         }
  442.     }
  443.     critter->varible =-1+critter->varible*3/(pow(2.0,(double)lchrom)-1);
  444.     critter->fitness =critter->varible*sin(critter->varible*10*atan(1)*4)+2.0;
  445. }
  446. void  mutation(unsigned *child)   /*变异操作*/
  447. {
  448.     int j, k, stop;
  449.     unsigned mask, temp = 1;
  450.     for(k = 0; k < chromsize; k++)
  451.     {
  452.         mask = 0;
  453.         if(k == (chromsize-1))
  454.             stop = lchrom - (k*(8*sizeof(unsigned)));
  455.         else
  456.             stop = 8*sizeof(unsigned);
  457.         for(j = 0; j < stop; j++)
  458.         {
  459.             if(flip(pmutation))
  460.             {
  461.                 mask = mask|(temp<<j);
  462.                 nmutation++;
  463.             }
  464.         }
  465.         child[k] = child[k]^mask;
  466.     }
  467. }
  468. int crossover (unsigned *parent1, unsigned *parent2, unsigned *child1, unsigned *child2)
  469. /* 由两个父个体交叉产生两个子个体 */
  470. {
  471.     int j, jcross, k;
  472.     unsigned mask, temp;
  473.     if(flip(pcross))
  474.     {
  475.         jcross = rnd(1 ,(lchrom - 1));/* Cross between 1 and l-1 */
  476.         ncross++;
  477.         for(k = 1; k <= chromsize; k++)
  478.         {
  479.             if(jcross >= (k*(8*sizeof(unsigned))))
  480.             {
  481.                 child1[k-1] = parent1[k-1];
  482.                 child2[k-1] = parent2[k-1];
  483.             }
  484.             else if((jcross < (k*(8*sizeof(unsigned)))) && (jcross > ((k-1)*(8*sizeof(unsigned)))))
  485.             {
  486.                 mask = 1;
  487.                 for(j = 1; j <= (jcross-1-((k-1)*(8*sizeof(unsigned)))); j++)
  488.                 {
  489.                     temp = 1;
  490.                     mask = mask<<1;
  491.                     mask = mask|temp;
  492.                 }
  493.                 child1[k-1] = (parent1[k-1]&mask)|(parent2[k-1]&(~mask));
  494.                 child2[k-1] = (parent1[k-1]&(~mask))|(parent2[k-1]&mask);
  495.             }
  496.             else
  497.             {
  498.                 child1[k-1] = parent2[k-1];
  499.                 child2[k-1] = parent1[k-1];
  500.             }
  501.         }
  502.     }
  503.     else
  504.     {
  505.         for(k = 0; k < chromsize; k++)
  506.         {
  507.             child1[k] = parent1[k];
  508.             child2[k] = parent2[k];
  509.         }
  510.         jcross = 0;
  511.     }
  512.     return(jcross);
  513. }
  514. void advance_random()          /* 产生55个随机数 */
  515. {
  516.     int j1;
  517.     double new_random;
  518.     for(j1 = 0; j1 < 24; j1++)
  519.     {
  520.         new_random = oldrand[j1] - oldrand[j1+31];
  521.         if(new_random < 0.0) new_random = new_random + 1.0;
  522.         oldrand[j1] = new_random;
  523.     }
  524.     for(j1 = 24; j1 < 55; j1++)
  525.     {
  526.         new_random = oldrand [j1] - oldrand [j1-24];
  527.         if(new_random < 0.0) new_random = new_random + 1.0;
  528.         oldrand[j1] = new_random;
  529.     }
  530. }
  531. int flip(float prob)          /* 以一定概率产生0或1 */
  532. {
  533.     float randomperc();
  534.     if(randomperc() <= prob)
  535.         return(1);
  536.     else
  537.         return(0);
  538. }
  539. void randomize()            /* 设定随机数种子并初始化随机数发生器 */
  540. {
  541.     float randomseed;
  542.     int j1;
  543.     for(j1=0; j1<=54; j1++)
  544.       oldrand[j1] = 0.0;
  545.     jrand=0;
  546.     randomseed=0.5;
  547.     warmup_random(randomseed);
  548. }
  549. double randomnormaldeviate()         /* 产生随机标准差 */
  550. {
  551.     double sqrt(), log(), sin(), cos();
  552.     float randomperc();
  553.     double t, rndx1;
  554.     if(rndcalcflag)
  555.     {   rndx1 = sqrt(- 2.0*log((double) randomperc()));
  556.         t = 6.2831853072 * (double) randomperc();
  557.         rndx2 = rndx1 * sin(t);
  558.         rndcalcflag = 0;
  559.         return(rndx1 * cos(t));
  560.     }
  561.     else
  562.     {
  563.         rndcalcflag = 1;
  564.         return(rndx2);
  565.     }
  566. }
  567. float randomperc()            /*与库函数random()作用相同, 产生[0,1]之间一个随机数 */
  568. {
  569.     jrand++;
  570.     if(jrand >= 55)
  571.     {
  572.         jrand = 1;
  573.         advance_random();
  574.     }
  575.     return((float) oldrand[jrand]);
  576. }
  577. int rnd(low, high)           /*在整数low和high之间产生一个随机整数*/
  578. int low,high;
  579. {
  580.     int i;
  581.     float randomperc();
  582.     if(low >= high)
  583.         i = low;
  584.     else
  585.     {
  586.         i = (randomperc() * (high - low + 1)) + low;
  587.         if(i > high) i = high;
  588.     }
  589.     return(i);
  590. }
  591. void warmup_random(float random_seed)       /* 初始化随机数发生器*/
  592. {
  593.     int j1, ii;
  594.     double new_random, prev_random;
  595.     oldrand[54] = random_seed;
  596.     new_random = 0.000000001;
  597.     prev_random = random_seed;
  598.     for(j1 = 1 ; j1 <= 54; j1++)
  599.     {
  600.         ii = (21*j1)%54;
  601.         oldrand[ii] = new_random;
  602.         new_random = prev_random-new_random;
  603.         if(new_random<0.0) new_random = new_random + 1.0;
  604.         prev_random = oldrand[ii];
  605.     }
  606.     advance_random();
  607.     advance_random();
  608.     advance_random();
  609.     jrand = 0;
  610. }
  611. main(argc,argv)           /*  主程序  */
  612. int argc;
  613. char *argv[];
  614. {
  615.     struct individual *temp;
  616.     FILE   *fopen();
  617.     void   title();
  618.     char   *malloc();
  619.     //if()
  620. argv[1]="output";
  621. if((outfp = fopen(argv[1],"w")) == NULL)
  622.         {
  623.            fprintf(stderr,"Cannot open output file %sn",argv[1]);
  624.             exit(-1);
  625.         }
  626.      title();
  627.      maxruns=10;
  628.      for(run=1; run<=maxruns; run++)
  629.     {
  630.         initialize();
  631.         for(gen=0; gen<maxgen; gen++)
  632.         {
  633.          fprintf(outfp,"n第 %d / %d 次运行: 当前代为 %d, 共 %d 代n", run,maxruns,gen,maxgen);
  634.             /* 产生新一代 */
  635.             generation();
  636.             /* 计算新一代种群的适应度统计数据 */
  637.             statistics(newpop);
  638.             /* 输出新一代统计数据 */
  639.             report();
  640.             temp = oldpop;
  641.             oldpop = newpop;
  642.             newpop = temp;
  643.         }
  644.         freeall();
  645.     }
  646. }