找回密码
 注册
Simdroid-非首页
查看: 145|回复: 4

[2. C/C++/C#] 用C语言编写的基本遗传算法程序

[复制链接]
发表于 2011-2-21 14:07:14 | 显示全部楼层 |阅读模式 来自 大连理工大学
这是《遗传算法原理及应用》(周明 孙树栋)中的程序,我进行了一些改动,希望大家有用

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

#define PopSize 400              //种群数量   
#define CHROMLENGTH 20           //染色体长度
#define Pc 0.9                   //交叉概率
#define Pm 0.01                 //变异概率

struct individual      //种群个体结构      
{
    int chrom[CHROMLENGTH];      //染色体编码
double x1,x2;                //解码后的变量
double value;                //目标函数值
double fitness;              //个体适应度
};
struct individual population[PopSize];  //种群
struct individual SoFaBest;              //用于保留最优个体
int best_Index,worst_Index;

void  GenerateInitialPopulation();         //生成初始种群函数
void  Decode();                            //解码函数
void  VALUE();
void  fitness();
void  findBestAndWorst();
void  GenerateNextPopulation();
void  SelectionOperator();                 //选择操作
void  CrossoverOperator();                 //交叉操作
void  MutationOperator();                  //变异操作
void  SaveTheBest();                    //最优个体保存策略操作     
void main()
{
int i,j,flag,generation;
        GenerateInitialPopulation();          //生成初始种群
Decode();
VALUE();
fitness();
findBestAndWorst();
SoFaBest=population[best_Index];
        flag=1;
        generation=0;
while(flag)
{
  GenerateNextPopulation();
  generation=generation+1;
  Decode();
     VALUE();
     fitness();
     findBestAndWorst();
  if(SoFaBest.fitness<population[best_Index].fitness)   
  {
   SoFaBest=population[best_Index];//如果当前最优个体比目前为止出现在最优个体还好,就替换
  }
  if(SoFaBest.value>3905.9) {flag=0;}
  printf("第%5d 代,最优个体%f\n",generation,SoFaBest.value);
}
}

void GenerateInitialPopulation()  
/*******************************************************************************
                     该函数用于生成初始种群
*******************************************************************************/
{
int i,j;
double p;
srand(time(NULL));
        for(i=0;i<opSize;i++)
{
  for(j=0;j<CHROMLENGTH;j++)
  {
   p=(500+rand()%10000)/10000.0;//生成随机数,???好像有问题???
   if(p<0.5){
    population.chrom[j]=1;
   
   }
   else population.chrom[j]=0;
  }
}

}

void  Decode()
/*******************************************************************************
                             用于解码
*******************************************************************************/
{
int i,j;
for(i=0;i<;PopSize;i++)
{
  population.x1=0.0;
        population.x2=0.0;
  for(j=0;j<CHROMLENGTH/2;j++)
  {
   if(population.chrom[j]==1)
                population.x1=population.x1+pow(2,j);
  }
  for(j=CHROMLENGTH/2;j<CHROMLENGTH;j++)
  {
   if(population.chrom[j]==1)
                population.x2=population.x2+pow(2,j-10);
  }
  population.x1=4.096*population.x1/1023-2.048;
        population.x2=4.096*population.x2/1023-2.048;
}
}
void VALUE()
/*********************************************************************************
                          用于计算目标函数的值
*********************************************************************************/
{
int i;
for(i=0;i<;PopSize;i++)
{
  population.value=100*(population.x1*population.x1-population.x2)*(population.x1*population.x1-population.x2)+(1-population.x1)*(1-population.x1);
}
}

void  fitness()
{
int i;
for(i=0;i<;PopSize;i++)
{
  population.fitness=population.value;
}
}

void  findBestAndWorst()
/****************************************************************************************
                                 找出最优个体和最差个体的编号,放如a中
*****************************************************************************************/
{
double best,worst;
int i;
best=worst=population[0].fitness;
best_Index=worst_Index=0;
for(i=0;i<;PopSize;i++)
{
  if(population.fitness>best)
  {
   best=population.fitness;
   best_Index=i;
  }
  if(population.fitness<worst)
  {
   worst=population.fitness;
   worst_Index=i;
  }
}
}

void  GenerateNextPopulation()
/****************************************************************************************
                                 用于生成下一代种群的函数
*****************************************************************************************/
{
   SaveTheBest();     //将目前最优个体放入目前种群中
      SelectionOperator();  //对当前种群进行选择操作
      CrossoverOperator();  //对当前种群进行单点交叉操作
      MutationOperator();   //对当前种群进行变异操作
}

void  SelectionOperator()
/****************************************************************************************
                                 选择函数
*****************************************************************************************/
{
int i,index;
double p,sum=0.0;
double cfitness[PopSize];
struct individual newpopulation[PopSize];
for(i=0;i<;PopSize;i++)
{
  sum=sum+population.fitness;
}
for (i=0;i<;PopSize;i++)
{
  cfitness=population.fitness/sum;
}
for(i=1;i<;PopSize;i++)
{
  cfitness=cfitness[i-1]+cfitness;
}
for(i=0;i<;PopSize;i++)
{
  p=rand()%1000/1000.0;
  index=0;
  while (p>cfitness[index])
  {
   index++;
  }
  newpopulation=population[index];
}
for(i=0;i<;PopSize;i++)
{
  population=newpopulation;
}
}
void CrossoverOperator()
/****************************************************************************************
                                 交叉函数
*****************************************************************************************/
{
int i,j;
int index[PopSize];
int point,temp;
double p;
int ch;
for (i=0;i<;PopSize;i++)
{
  index=i;
}
for (i=0;i<;PopSize;i++)
{
  point=(int)(rand()%(PopSize-i));
  temp=index;
  index=index[point+i];
  index[point+i]=temp;
}
for(i=0;i<;PopSize-1;i+=2)
{
  p=rand()%1000/1000.0;
  if(p<;Pc)
  {
   point=(int)(rand()%(CHROMLENGTH-1))+1;
   for(j=point;j<CHROMLENGTH;j++)
   {
    ch=population[index].chrom[j];
    population[index].chrom[j]=population[index[i+1]].chrom[j];
                population[index[i+1]].chrom[j]=ch;
   }
  }
}
}
void MutationOperator()
/****************************************************************************************
                                 变异函数
*****************************************************************************************/
{
int i,j;
double p;
for(i=0;i<;PopSize;i++)
{
  for(j=0;j<CHROMLENGTH;j++)
  {
   p=rand()%10000/10000.0;
   if(p<;Pm)
   {
    population.chrom[j]=(population.chrom[j]==0)?1:0;
   
   }
  }
}
}

void  SaveTheBest()
/****************************************************************************************
                                 最优选择策略函数
*****************************************************************************************/
{
population[worst_Index]=SoFaBest;
}
 楼主| 发表于 2011-2-21 14:08:50 | 显示全部楼层 来自 大连理工大学
Simdroid开发平台
我晕,popsize都成表情了
回复 不支持

使用道具 举报

发表于 2011-2-21 22:03:28 | 显示全部楼层 来自 天津红桥区
好东西呀,我正在学习中……
我网上下载了一些基本的资料
这个看起来有点复杂,慢慢看中
回复 不支持

使用道具 举报

发表于 2011-7-13 14:33:37 | 显示全部楼层 来自 四川成都
很好!很强大!!!!
回复 不支持

使用道具 举报

发表于 2011-7-13 21:12:09 | 显示全部楼层 来自 陕西西安
还可以,谢谢楼主
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-11-1 11:36 , Processed in 0.039739 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表