⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ga01.c

📁 基因演算法
💻 C
字号:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

#define	M	4
#define	N	10
int farm[M][N];
int temp[2][N];
double a=0.0;
double b=32;
double x_value[M];
double f_value[M];
double x_temp[2];
double f_temp[2];

void setup()
{
  time_t t;
  int j, k;
  srand((unsigned) time(&t));
  for (j=0; j<M; j++) {
    for (k=0; k<N; k++) {
      farm[j][k] = rand() % 2;
    }
  }
}

void compute_f_value(int i)
{
  int j,k;
  double m, x;
  m=0.0;
  for (j=0; j<N; j++) {
    k=j;
    m=m+farm[i][N-j-1]*pow(2.0,k);
  }
  x_value[i]=a+m*(b-a)/(pow(2.0,N)-1.0);
  x=x_value[i];
  f_value[i]=x*x;
}

void compute_f_temp(int i)
{
  int j,k;
  double m, x;
  m=0.0;
  for (j=0; j<N; j++) {
    k=j;
    m=m+temp[i][N-j-1]*pow(2.0,k);
  }
  x_temp[i]=a+m*(b-a)/(pow(2.0,N)-1.0);
  x=x_temp[i];
  f_temp[i]=x*x;
}

void crossing()
{
  int r1, r2, r3, j;
  r1=rand()%M;
  r2=rand()%M;
  while (r2 == r1) {
    r2=rand()%M;
  }
  for (j=0; j<N; j++) {
    temp[0][j]=farm[r1][j];
    temp[1][j]=farm[r2][j];
  }
  r3=rand()%(N-2) + 1;
  for (j=r3; j<N; j++) {
    temp[0][j]=farm[r2][j];
    temp[1][j]=farm[r1][j];
  }
  compute_f_temp(0);
  compute_f_temp(1);
  if (f_temp[0] > f_value[r1]) {
    for (j=0; j<N; j++) {
      farm[r1][j]=temp[0][j];
    }
  }
  if (f_temp[1] > f_value[r2]) {
    for (j=0; j<N; j++) {
      farm[r2][j]=temp[1][j];
    }
  }
}

void mutate()
{
  int rn, rm;
  double a1, a2;
  rn=rand()%N;
  rm=rand()%M;
  a1=f_value[rm];
  farm[rm][rn]=1-farm[rm][rn];
  compute_f_value(rm);
  a2=f_value[rm];
  if (a1 > a2) farm[rm][rn]=1-farm[rm][rn];
}

void print_farm()
{
  int i,j;
  for (i=0; i<M; i++) {
    printf("farm[%2d]= ", i);
    for (j=0; j<N; j++) {
      printf("%d  ",farm[i][j]);
    }
    printf("\n");
  }
  printf("\n");
}

void print_value()
{
  int i;
  for (i=0; i<M; i++) {
    compute_f_value(i);
    printf("x_value[%2d]=%8.4f  ",i,x_value[i]);
    printf("f_value[%2d]=%8.4f\n",i,f_value[i]);
  }
  printf("\n");
}

void print_max()
{
  int i;
  double x_max, f_max;
  x_max=x_value[0];
  f_max=f_value[0];
  for (i=1; i<M; i++) {
    if (f_value[i] > f_max) {
      x_max=x_value[i];
      f_max=f_value[i];
    }
  }
  printf("x_max=%8.4f  f_max=%8.4f\n\n", x_max, f_max);
}


int main(void)
{
  int i,j;
  setup();
  print_farm();
  printf("=== GA Run Before ===\n");
  print_value();

  for (i=0; i<1100; i++) {
    crossing();
    mutate();
  }
  printf("=== GA Run After ===\n");
  print_value();
  print_max();

  getchar();
  return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -