資源簡介
該程序實現了用遺傳算法求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 ??{
???
評論
共有 條評論