• 大小: 3KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-07
  • 语言: C/C++
  • 标签: 遗传算法  

资源简介

该程序实现了用遗传算法求y=x*sin(10*PI*x)+2.0的最大值,若需求其他函数最值,稍作修改即可。

资源截图

代码片段和文件信息

/*
用遗传算法求y=x*sin(10*pi*x)+2的最大值  -1=精确到6位小数
pow(221)<3*1000000编码的二进制长度为22 
*/
#include 
#include 
#include 
#include 
#include 

#define N 3000000
#define PI 3.14159265
#define MAX(ab) ((a)>(b)?(a):(b))

#define SIZE  50
#define MAXGEN  50
#define P_CORSS 0.75
#define P_MUTATION 0.05

#define LEN 22

typedef struct node
{
  char x[LEN];
  double fitnessfitsum;
}node;

node cur[SIZE]next[SIZE]maxmin;

double randd()
{
  return (double)rand()/RAND_MAX;
}
int randi(int k)
{
  return (int)(randd()*k+0.5);
}

//计算当前种群中各个个体的适应度 
void cal_fitness()
{
  int ijk;
  double d;
  for(i=0;i  {
    k=0;
    for(j=LEN-1;j>=0;j--) k=(k<<1)+cur[i].x[j];
    d=(double)k/N*3-1;
    cur[i].fitness=d*sin(10*PI*d)+2;
    cur[i].fitsum=i>0?(cur[i].fitness+cur[i-1].fitsum):(cur[0].fitness);
  }
}

void init()
{
  int tmp;
  for(int i=0;i  {
    tmp=randi(N);
    for(int j=0;j    {
      cur[i].x[j]=tmp%2;
      tmp=tmp>>1;
    }
  }
  cal_fitness();
}

int sel()
{
  double p=randd();
  double sum=cur[SIZE-1].fitsum;
  for(int i=0;i  {
    if(cur[i].fitsum/sum>p) return i;
  }
}

//换代 
void tran()
{
  int ijpos;
  //找当前种群最优个体 
  max=cur[0];
  for(i=1;i  {
    if(cur[i].fitness>max.fitness)  max=cur[i];
  }
  for(int k=0;k  {
   

评论

共有 条评论