资源描述:
《遗传算法求解函数极值c语言代码》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、#include"stdio.h"#include"stdlib.h"#include"conio.h"#include"math.h"#include"time.h"#definenum_C12//个体的个数,前6位表示x1,后6位表示x2#defineN100//群体规模为100#definepc0.9//交叉概率为0.9#definepm0.1//变异概率为10%#defineps0.6//进行选择时保留的比例#definegenmax2000//最大代数200intRandomInteger(intlow,inth
2、igh);voidInitial_gen(structunitgroup[N]);voidSort(structunitgroup[N]);voidCopy_unit(structunit*p1,structunit*p2);voidCross(structunit*p3,structunit*p4);voidVaration(structunitgroup[N],inti);voidEvolution(structunitgroup[N]);floatCalculate_cost(structunit*p);voidPr
3、int_optimum(structunitgroup[N],intk);/*定义个体信息*/typedefstructunit{intpath[num_C];//每个个体的信息doublecost;//个体代价值};structunitgroup[N];//种群变量groupintnum_gen=0;//记录当前达到第几代intmain(){inti,j;srand((int)time(NULL));//初始化随机数发生器Initial_gen(group);//初始化种群Evolution(group);//进化:选择
4、、交叉、变异getch();return0;}/*初始化种群*/voidInitial_gen(structunitgroup[N]){inti,j;structunit*p;for(i=0;i<=N-1;i++)//初始化种群里的100个个体{p=&group[i];//p指向种群的第i个个体for(j=0;j<12;j++){p->path[j]=RandomInteger(0,9);//end}Calculate_cost(p);//计算该种群的函数值}//end初始化种群}/*种群进化,进化代数由genmax决定*
5、/voidEvolution(structunitgroup[N]){inti,j;inttemp1,temp2,temp3,temp4,temp5;temp1=N*pc/2;temp2=N*(1-pc);temp3=N*(1-pc/2);temp4=N*(1-ps);temp5=N*ps;for(i=1;i<=genmax;i++){//选择for(j=0;j<=temp4-1;j++){Copy_unit(&group[j],&group[j+temp5]);}//交叉for(j=0;j<=temp1-1;){Cros
6、s(&group[temp2+j],&group[temp3+j]);j+=2;}//变异Varation(group,i);}Sort(group);Print_optimum(group,i-1);//输出当代(第i-1代)种群}/*交叉*/voidCross(structunit*p3,structunit*p4){inti,j,cross_point;intson1[num_C],son2[num_C];for(i=0;i<=num_C-1;i++)//初始化son1、son2{son1[i]=-1;son2[i]
7、=-1;}cross_point=RandomInteger(1,num_C-1);//交叉位随机生成//交叉,生成子代//子代1//子代1前半部分直接从父代复制for(i=0;i<=cross_point-1;i++)son1[i]=p3->path[i];for(i=cross_point;i<=num_C-1;i++)for(j=0;j<=num_C-1;j++)//补全p1{son1[i]=p4->path[j];}//end子代1//子代2//子代1后半部分直接从父代复制for(i=cross_point;i<=
8、num_C-1;i++)son2[i]=p4->path[i];for(i=0;i<=cross_point-1;i++){for(j=0;j<=num_C-1;j++)//补全p1{son2[i]=p3->path[j];}}//end子代2//end交叉for(i=0;i<=num_C-1;i++)