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

Visual C++

  1. // Genetic Algorithm
  2. // For Example 2.1 (2-1.tex) in "Uncertain Programming" by B. Liu
  3. // Written by Microsoft Visual C++
  4. // Copyright by USLab at Tsinghua University
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <math.h>
  8. #include "USLab.h"
  9. static void  initialization(void);
  10. static void  evaluation(int gen);
  11. static void  selection(void);
  12. static void  crossover(void);
  13. static void  mutation(void);
  14. static void  f(void);
  15. static int   constraint_check(double x[]);
  16. #define N 3  // number of variables
  17. #define M 1  // number of objectives
  18. int   TYPE=1; // 1=max;-1=min
  19. int   GEN=200; // maximum generation number
  20. int   POP_SIZE=30;
  21. double P_MUTATION=0.2;
  22. double P_CROSSOVER=0.3;
  23. double OBJECTIVE[31][M+1], q[31], CHROMOSOME[31][N+1];
  24. static void f(void)
  25. {
  26. double x1,x2,x3;
  27. int i;
  28. for(i = 1; i <= POP_SIZE; i++) {
  29. x1 = CHROMOSOME[i][1];
  30. x2 = CHROMOSOME[i][2];
  31. x3 = CHROMOSOME[i][3];
  32. OBJECTIVE[i][1] = (x1*x1*x2*x3*x3)/(2*x1*x1*x1*x3*x3+
  33.   3*x1*x1*x2*x2+2*x2*x2*x3*x3*x3+x1*x1*x1*x1*x2*x2*x3*x3);
  34. }
  35. for(i=1;i<=POP_SIZE;i++)
  36.   OBJECTIVE[i][0]= OBJECTIVE[i][1];
  37. }
  38. static int constraint_check(double x[])
  39. {
  40. double a;
  41. int n;
  42. for(n=1;n<=N;n++) if(x[n]<=0) return 0;
  43. a = x[1]*x[1]+x[2]*x[2]+x[3]*x[3];
  44. if(a<1||a>4) return 0;
  45. return 1;
  46. }
  47. static void initialization(void)
  48. {
  49.   double x[N+1];
  50.   int i,j;
  51.   for(i=1; i<=POP_SIZE; i++){
  52.   mark:
  53.   for(j=1; j<=N; j++) x[j]=myu(0,2);
  54.   if(constraint_check(x)==0) goto mark;
  55.   for(j=1; j<=N; j++) CHROMOSOME[i][j]=x[j];
  56.   }
  57. }
  58. main()
  59. {
  60.   int i, j;
  61.   double a;
  62.   //srand(100);
  63.   q[0]=0.05; a=0.05;
  64.   for(i=1; i<=POP_SIZE; i++) {a=a*0.95; q[i]=q[i-1]+a;}
  65.   initialization();
  66.   evaluation(0);
  67.   for(i=1; i<=GEN; i++) {
  68.   selection();
  69.   crossover();
  70.   mutation();
  71.   evaluation(i);
  72.   printf("nGeneration NO.%dn", i);
  73.   printf("x=(");
  74.   for(j=1; j<=N; j++) {
  75.   if(j<N) printf("%3.4f,",CHROMOSOME[0][j]);
  76.   else printf("%3.4f",CHROMOSOME[0][j]);
  77.   }
  78.   if(M==1) printf(")nf=%3.4fn", OBJECTIVE[0][1]);
  79.   else {
  80.       printf(")nf=(");
  81.       for(j=1; j<=M; j++) {
  82.      if(j<M) printf("%3.4f,", OBJECTIVE[0][j]);
  83.      else printf("%3.4f", OBJECTIVE[0][j]);
  84.   }
  85.           printf(")  Aggregating Value=%3.4fn",OBJECTIVE[0][0]);
  86.   }
  87.   }
  88.   printf("n");
  89.   return 1;
  90. }
  91. static void evaluation(int gen)
  92. {
  93.   double a;
  94.   int   i, j, k, label;
  95.   f();
  96.   if(gen==0){
  97.  for(k=0; k<=M; k++) OBJECTIVE[0][k]=OBJECTIVE[1][k];
  98.  for(j = 1; j <= N; j++) CHROMOSOME[0][j]=CHROMOSOME[1][j];
  99.   }
  100.   for(i=0; i<=POP_SIZE; i++){
  101.   label=0;  a=OBJECTIVE[i][0];
  102.   for(j=i+1; j<=POP_SIZE; j++)
  103.  if((TYPE*a)<(TYPE*OBJECTIVE[j][0])) {
  104.  a=OBJECTIVE[j][0];
  105.  label=j;
  106.  }
  107.   if(label!=0) {
  108.  for(k=0; k<=M; k++) {
  109.  a=OBJECTIVE[i][k];
  110.  OBJECTIVE[i][k]=OBJECTIVE[label][k];
  111.  OBJECTIVE[label][k]=a;
  112.  }
  113.  for(j=1; j<=N; j++) {
  114.  a=CHROMOSOME[i][j];
  115.  CHROMOSOME[i][j]=CHROMOSOME[label][j];
  116.  CHROMOSOME[label][j]=a;
  117.  }
  118.   }
  119.   }
  120. }
  121. static void selection()
  122. {
  123.   double r, temp[31][N+1];
  124.   int   i, j, k;
  125.   for(i=1; i<=POP_SIZE; i++) {
  126.   r=myu(0, 0.785);
  127.   for(j=0; j<=POP_SIZE; j++) {
  128.   if(r<=q[j]) {
  129.   for(k=1; k<=N; k++) temp[i][k]=CHROMOSOME[j][k];
  130.   break;
  131.   }
  132.   }
  133.   }
  134.   for(i=1; i<=POP_SIZE; i++)
  135.  for(k=1; k<=N; k++)
  136.  CHROMOSOME[i][k]=temp[i][k];
  137. }
  138. static void crossover()
  139. {
  140.   int   i, j, jj, k, pop;
  141.   double r, x[N+1], y[N+1];
  142.   pop=POP_SIZE/2;
  143.   for(i=1; i<=pop; i++) {
  144.  if(myu(0,1)>P_CROSSOVER) continue;
  145.  j=(int)myu(1,POP_SIZE);
  146.  jj=(int)myu(1,POP_SIZE);
  147.  r=myu(0,1);
  148.  for(k=1; k<=N; k++) {
  149.  x[k]=r*CHROMOSOME[j][k]+(1-r)*CHROMOSOME[jj][k];
  150.  y[k]=r*CHROMOSOME[jj][k]+(1-r)*CHROMOSOME[j][k];
  151.  }
  152.  if(constraint_check(x)==1)
  153.  for(k=1; k<=N; k++) CHROMOSOME[j][k]=x[k];
  154.  if(constraint_check(y)==1)
  155.  for(k=1; k<=N; k++) CHROMOSOME[jj][k]=y[k];
  156.   }
  157. }
  158. static void mutation(void)
  159. {
  160.   int i, j, k;
  161.   double x[N+1], y[N+1], infty, direction[N+1];
  162.   double INFTY=10, precision=0.0001;
  163.   for(i=1; i<=POP_SIZE; i++) {
  164.   if(myu(0,1)>P_MUTATION) continue;
  165.   for(k=1; k<=N; k++) x[k] = CHROMOSOME[i][k];
  166.   for(k=1; k<=N; k++)
  167.   if(myu(0,1)<0.5) direction[k]=myu(-1,1);
  168.   else direction[k]=0;
  169.   infty=myu(0,INFTY);
  170.   while(infty>precision) {
  171.   for(j=1; j<=N; j++) y[j]=x[j]+infty*direction[j];
  172.   if(constraint_check(y)==1) {
  173.  for(k=1; k<=N; k++) CHROMOSOME[i][k]=y[k];
  174.  break;
  175.   }
  176.   infty=myu(0,infty);
  177.   }
  178.   }
  179. }