基于基本遗传算法的函数最优化.docx
- 文档编号:4689302
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:16
- 大小:18.05KB
基于基本遗传算法的函数最优化.docx
《基于基本遗传算法的函数最优化.docx》由会员分享,可在线阅读,更多相关《基于基本遗传算法的函数最优化.docx(16页珍藏版)》请在冰点文库上搜索。
基于基本遗传算法的函数最优化
/**************************************************************/
/*基于基本遗传算法的函数最优化*/
/**************************************************************/
#include
#include
#include
#include
#include
#include
#include"graph.c"
#include"operator.c"
#definePOP_SIZE25/*种群大小*/
#defineG_LENGTH8/*染色体长度*/
#defineC_RATE0.2/*交叉概率*/
#defineM_RATE0.01/*变异概率*/
#defineXMAX255/*函数变量最大值*/
#defineX1350/*函数图形区窗口左上点X坐标*/
#defineY140/*函数图形区窗口左上点Y坐标*/
#defineXR1255/*函数图形区窗口长度*/
#defineYR1200/*函数图形区窗口高度*/
#defineX2360/*适应度图形区窗口左上点X坐标*/
#defineY2280/*适应度图形区窗口左上点Y坐标*/
#defineXR2250/*适应度图形区窗口长度*/
#defineYR2100/*适应度图形区窗口宽度*/
#defineSTEP2/*适应度图形区X方向步长*/
voidinitialize_gene(gene,pop_size,g_length)
/*种群中个体遗传基因型的初始化*/
unsignedchar*gene;/*遗传基因*/
intpop_size;/*种群大小*/
intg_length;/*个体染色体长度*/
{
inti,j;
randomize();
for(i=0;i for(j=0;j *(gene+i*g_length+j)=random (2); } intgene_to_pheno(gene,g_length) /*基因型到表现型的变换--解码*/ unsignedchar*gene;/*基因型*/ intg_length;/*染色体长度*/ { inti,pheno; pheno=0; for(i=0;i pheno=pheno*2+*(gene+i); return(pheno); } voidcalc_fitness(gene,fitness,pop_size,g_length,func,max_fit,avg_fit) /*计算种群中个体的适应度*/ unsignedchar*gene;/*个体的遗传基因*/ double*fitness;/*个体的适应度*/ double*func;/*评价函数*/ double*max_fit,*avg_fit;/*最大适应度与平均适应度*/ intpop_size;/*种群大小*/ intg_length;/*个体染色体长度*/ { unsignedchar*g;/*个体的遗传基因指针变量*/ intpheno;/*个体的表现型*/ inti,j; doublef; *max_fit=0.0; *avg_fit=0.0; f=(double)pop_size; for(i=0;i { g=gene+i*g_length; pheno=gene_to_pheno(g,g_length); *(fitness+i)=*(func+pheno); if(*(fitness+i)>*max_fit) *max_fit=*(fitness+i); *avg_fit=*avg_fit+*(fitness+i)/f; } } voidsga_reproduction(gene,fitness,new_gene,new_fitness,pop_size,g_length) /*基于个体的适应度评价进行新一代个体的选择(轮盘赌方法),选择后分别将新的基因型和适应度代入到新个体中*/ unsignedchar*gene;/*当前代的个体遗传基因型*/ unsignedchar*new_gene;/*新一代的个体遗传基因型*/ double*fitness;/*当前代的个体适应度*/ double*new_fitness;/*新一代的个体适应度*/ intpop_size;/*种群大小*/ intg_length;/*染色体长度*/ { doublesum_of_fitness; doubleborder; doubler;/*轮盘上的选择位置变量*/ inti,j; intnum; sum_of_fitness=0.0; for(i=0;i sum_of_fitness=sum_of_fitness+*(fitness+i); for(i=0;i { r=sum_of_fitness*(random(10001)/10000.0); num=0; border=*fitness; while(border { num++; border=border+*(fitness+num); } for(j=0;j *(new_gene+i*g_length+j)=*(gene+num*g_length+j); *(new_fitness+i)=*(fitness+num); } } voidsga_crossover(gene,pop_size,g_length,c_rate) /*基本遗传算法的交叉操作--单点交叉*/ unsignedchar*gene;/*遗传基因*/ intpop_size;/*种群大小*/ intg_length;/*个体染色体长度*/ doublec_rate;/*交叉概率*/ { unsignedchar*gene1;/*父个体1的遗传基因指针变量*/ unsignedchar*gene2;/*父个体1的遗传基因指针变量*/ unsignedcharwork;/*中间变量*/ inti,j; intc_pos;/*交叉位置变量*/ doubler;/*随机数变量*/ for(i=0;i { r=random(10001)/10000.0; if(r<=c_rate) { gene1=gene+g_length*i; gene2=gene1+g_length; c_pos=random(g_length-2)+1; for(j=c_pos;j {work=*(gene1+j); *(gene1+j)=*(gene2+j); *(gene2+j)=work; } } } } voidsga_mutation(gene,pop_size,g_length,m_rate) /*基本遗传算法的变异操作--个体遗传基因按小概率翻转*/ unsignedchar*gene;/*遗传基因*/ intpop_size;/*种群大小*/ intg_length;/*染色体长度*/ doublem_rate;/*变异概率*/ { inti,j; doubler; for(i=0;i { for(j=0;j r=random(10001)/10000.0; if(r<=m_rate)/*变异发生判断*/ { if(*(gene+g_length*i+j)==0) *(gene+g_length*i+j)=1; else *(gene+g_length*i+j)=0; } } } voidmake_function(func,xmax) /*生成一个函数,用于最优化计算的目标函数(最大化)*/ /*f=∑ai*sin(x*bi+ci)其中ai∈[0,0.35]的均匀随机数 bi∈[2*pi,5*2*pi]/xmax的均匀随机数 ci∈[0,2*pi]的均匀随机数 x∈[0,xmax]为优化变量 i=1,2,3*/ double*func;/*函数值*/ intxmax;/*变量最大值 { intx,i; doublea[3],b[3],c[3]; doublepi=3.141592; doublefxmax,fx,f_value; doublef_min,f_max,f_mid,f_range; doubledbl; randomize(); fxmax=(double)xmax; for(i=0;i<3;i++)/*优化函数为三个三角函数之和*/ { a[i]=0.35*(random(10001)/10000.0); b[i]=(4*(random(10001)/10000.0)+1)*2.0*pi/fxmax; c[i]=2.0*pi*(random(10001)/10000.0); } f_min=1.0; f_max=0.0; for(x=0;x<=xmax;x++)/*将优化函数正规化为[0,1]区间数*/ { fx=(double)x; f_value=0.0; for(i=0;i<3;i++) { dbl=b[i]*fx+c[i]; f_value=f_value+a[i]*sin(dbl); } f_value=f_value+0.5; if(f_value>f_max)f_max=f_value; if(f_value *(func+x)=(double)f_value; } f_range=f_max-f_min; f_mid=(f_max+f_min)/2.0; for(x=0;x<=xmax;x++) { f_value=(*(func+x)-f_mid)/f_range+0.5; if(f_value>1.0)f_value=1.0; elseif(f_value<0.0)f_value=0.0; *(func+x)=f_value; } } voidg_draw_func(func,xmax) /*绘制优化函数的图形*/ double*func;/*函数值*/ intxmax;/*变量最大值*/ { intx,y,x_old,y_old,i; doublef; g_rectangle(X1+1,Y1+1,X1+XR1-1,Y1+YR1-1,0,1); g_rectangle(X1+1,Y1-12,X1+XR1,Y1-1,8,1); g_rectangle(X1,Y1,X1+XR1,Y1+YR1,6,0); x_old=X1; y_old=Y1+YR1-(int)(*func*YR1); f=XR1/(double)xmax; for(i=1;i<=xmax;i++) { x=X1+(int)(i*f); y=Y1+YR1-(int)(*(func+i)*YR1); g_line(x_old,y_old,x,y,12); x_old=x; y_old=y; } } voidg_init_grph(func,xmax) /*初始化画面的图形*/ double*func;/*函数值*/ intxmax;/*变量最大值*/ { intx,y,x_old,y_old,i; charc[5]; /*初始化函数图形区*/ g_rectangle(320,0,639,399,8,1); g_rectangle(321,1,638,16,8,1); disp_hz16("基于基本遗传算法的函数最优化",370,1,15); disp_hz16("g(x)",X1-30,Y1-18,15); disp_hz16("1.0",X1-30,Y1,15); disp_hz16("0",X1-10,Y1+YR1,15); disp_hz16("x",X1+XR1+10,Y1+YR1-20,15); disp_hz16("XMAX",X1+XR1-10,Y1+YR1,15); g_draw_func(func,xmax); /*初始化适应度图形区*/ g_rectangle(X2,Y2,X2+XR2,Y2+YR2,0,1); g_rectangle(X2,Y2,X2+XR2,Y2+YR2,6,0); setcolor(15); disp_hz16("最大适应度",X2+5,Y2-18,15); g_line(X2+90,Y2-10,X2+110,Y2-10,11); setcolor(15); disp_hz16("平均适应度",X2+120,Y2-18,15); g_line(X2+205,Y2-10,X2+225,Y2-10,9); setcolor(15); disp_hz16("世代数",X2+168,Y2+YR2+10,15); g_text(X2-30,Y2,15,"1.0"); /*g_text(X2-30,Y2+YR2,15,"0.0");*/ } voidg_plot_grph(num,gene,fitness,pop_size,g_length,func,xmax,max_fit,m_f_old,avg_fit,a_f_old,gen_num) /*随世代进化更新图形*/ unsignedchar*gene;/*遗传基因*/ double*fitness;/*适应度*/ double*func;/*函数值*/ doublemax_fit,m_f_old;/*当前代最大适应度,上一代最大适应度*/ doubleavg_fit,a_f_old;/*当前代平均适应度,上一代平均适应度*/ intnum;/*当前世代数*/ intpop_size;/*种群大小*/ intg_length;/*染色体长度*/ intxmax;/*变量最大值*/ intgen_num;/*最大世代数*/ { inti,j,x,y,x_old,y_old; doublef; unsignedchar*g; charc[10]; /*显示当前世代种群中个体的遗传基因*/ if(num==gen_num-1) { for(i=0;i { printf("Indv.%2d: ",i+1); for(j=0;j printf("%d",*(gene+i*g_length+j)); printf("==>Fitness%.4f\n",*(fitness+i)); } printf("Max_fit=%f\n",max_fit); printf("Avg_fit=%f\n",avg_fit); } /*显示个体在函数图形区中的位置*/ g_draw_func(func,xmax); f=XR1/(double)xmax; for(i=0;i { g=gene+i*g_length; j=gene_to_pheno(g,g_length); x=X1+(int)(j*f); y=Y1+YR1-*(func+j)*YR1; g_line(x,y-10,x,y,15); } /*适应度曲线的更新*/ if(num! =1&&num<=XR2/STEP) { if(num%10==0)/*每隔10代更新一次*/ { x=X2+(num-1)*STEP; g_line(x,Y2+1,x,Y2+YR2-1,1); sprintf(c,"%d",num); if(num<100||num%20==0) g_text(x-8,Y2+YR2,15,c); } x_old=X2+(num-1)*STEP; x=x_old+STEP; y_old=Y2+YR2-(int)(m_f_old*YR2); y=Y2+YR2-(int)(max_fit*YR2); g_line(x_old,y_old,x,y,11); y_old=Y2+YR2-(int)(a_f_old*YR2); y=Y2+YR2-(int)(avg_fit*YR2); g_line(x_old,y_old,x,y,9); } } voidgeneration(gene,fitness,pop_size,g_length,c_rate,m_rate,new_gene,new_fitness,func,xmax) /*世代进化的模拟*/ unsignedchar*gene;/*当前世代的个体遗传基因型*/ unsignedchar*new_gene;/*新一代的个体遗传基因型*/ double*fitness;/*当前世代的个体适应度*/ double*new_fitness;/*新一代的个体适应度*/ double*func;/*优化函数*/ doublec_rate,m_rate;/*交叉概率和变异概率*/ intpop_size,g_length;/*种群大小与染色体长度*/ {intgen_max;/*最大模拟世代数*/ inti,j,k; doublemax_fit,avg_fit;/*当前代最大适应度和平均适应度*/ doublem_f_old,a_f_old;/*新一代最大适应度和平均适应度*/ charchoice[3]; setcolor(15); disp_hz16("输入最大模拟世代数: ",10,1,20); gscanf(170,1,4,0,3,"%s",choice); gen_max=atoi(choice); m_f_old=0.0; a_f_old=0.0; for(i=0;i { if(i==gen_max-1) { printf("\n"); printf("************Gen.%d*************\n",i+1); } calc_fitness(gene,fitness,pop_size,g_length,func, &max_fit,&avg_fit); sga_reproduction(gene,fitness,new_gene,new_fitness, pop_size,g_length); for(j=0;j { *(fitness+j)=*(new_fitness+j); for(k=0;k *(gene+g_length*j+k)=*(new_gene+g_length*j+k); } sga_crossover(gene,pop_size,g_length,c_rate); sga_mutation(gene,pop_size,g_length,m_rate); g_plot_grph(i,gene,fitness,pop_size,g_length,func, xmax,max_fit,m_f_old,avg_fit,a_f_old,gen_max); m_f_old=max_fit; a_f_old=avg_fit; } } main()/*主程序*/ { /*当前代的个体遗传基因型与新一代的个体遗传基因型*/ unsignedchargene[POP_SIZE][G_LENGTH],new_gene[POP_SIZE][G_LENGTH]; /*当前代的个体适应度与新一代个体的适应度*/ doublefitness[POP_SIZE],new_fitness[POP_SIZE]; /*优化函数*/ doublefunc[XMAX+1]; /*初始化图形设置*/ g_init(); /*生成优化函数*/ make_function(func,XMAX); /*初始化显示画面*/ g_init_grph(func,XMAX); /*初始化种群*/ initialize_gene(gene,POP_SIZE,G_LENGTH); /*世代进化模拟*/ generation(gene,fitness,POP_SIZE,G_LENGTH, C_RATE,M_RATE,new_gene,new_fitness,func,XMAX); setcolor(9); disp_hz16("回车键结束",350,430,20); getch(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 基本 遗传 算法 函数 优化