遗传算法的VC++实现精品毕业设计完整版Word文档格式.docx

上传人:b****6 文档编号:17589669 上传时间:2022-12-07 格式:DOCX 页数:15 大小:28.95KB
下载 相关 举报
遗传算法的VC++实现精品毕业设计完整版Word文档格式.docx_第1页
第1页 / 共15页
遗传算法的VC++实现精品毕业设计完整版Word文档格式.docx_第2页
第2页 / 共15页
遗传算法的VC++实现精品毕业设计完整版Word文档格式.docx_第3页
第3页 / 共15页
遗传算法的VC++实现精品毕业设计完整版Word文档格式.docx_第4页
第4页 / 共15页
遗传算法的VC++实现精品毕业设计完整版Word文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

遗传算法的VC++实现精品毕业设计完整版Word文档格式.docx

《遗传算法的VC++实现精品毕业设计完整版Word文档格式.docx》由会员分享,可在线阅读,更多相关《遗传算法的VC++实现精品毕业设计完整版Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

遗传算法的VC++实现精品毕业设计完整版Word文档格式.docx

/*同济大学计算机系王小平2000年5月*/

#include<

stdio.h>

stdlib.h>

graphics.h>

math.h>

time.h>

string.h>

#include"

graph.c"

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<

pop_size;

i++)

for(j=0;

j<

g_length;

j++)

*(gene+i*g_length+j)=random

(2);

}

intgene_to_pheno(gene,g_length)

/*基因型到表现型的变换--解码*/

/*基因型*/

/*染色体长度*/

{

inti,pheno;

pheno=0;

pheno=pheno*2+*(gene+i);

return(pheno);

}

voidcalc_fitness(gene,fitness,pop_size,g_length,func,max_fit,avg_fit)

/*计算种群中个体的适应度*/

/*个体的遗传基因*/

double*fitness;

/*个体的适应度*/

double*func;

/*评价函数*/

double*max_fit,*avg_fit;

/*最大适应度与平均适应度*/

unsignedchar*g;

/*个体的遗传基因指针变量*/

intpheno;

/*个体的表现型*/

doublef;

*max_fit=0.0;

*avg_fit=0.0;

f=(double)pop_size;

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*new_gene;

/*新一代的个体遗传基因型*/

/*当前代的个体适应度*/

double*new_fitness;

/*新一代的个体适应度*/

doublesum_of_fitness;

doubleborder;

doubler;

/*轮盘上的选择位置变量*/

intnum;

sum_of_fitness=0.0;

i++)/*轮盘赌的选择循环*/

sum_of_fitness=sum_of_fitness+*(fitness+i);

r=sum_of_fitness*(random(10001)/10000.0);

num=0;

border=*fitness;

while(border<

r)

num++;

border=border+*(fitness+num);

*(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)

/*基本遗传算法的交叉操作--单点交叉*/

doublec_rate;

/*交叉概率*/

unsignedchar*gene1;

/*父个体1的遗传基因指针变量*/

unsignedchar*gene2;

unsignedcharwork;

/*中间变量*/

intc_pos;

/*交叉位置变量*/

/*随机数变量*/

pop_size-1;

i=i+2)

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)

/*基本遗传算法的变异操作--个体遗传基因按小概率翻转*/

doublem_rate;

/*变异概率*/

=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*/

/*函数值*/

intxmax;

/*变量最大值<

XMAX*/

intx,i;

doublea[3],b[3],c[3];

doublepi=3.141592;

doublefxmax,fx,f_value;

doublef_min,f_max,f_mid,f_range;

doubledbl;

fxmax=(double)xmax;

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;

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<

f_min)f_min=f_value;

*(func+x)=(double)f_value;

f_range=f_max-f_min;

f_mid=(f_max+f_min)/2.0;

x++)

f_value=(*(func+x)-f_mid)/f_range+0.5;

1.0)f_value=1.0;

elseif(f_value<

0.0)f_value=0.0;

*(func+x)=f_value;

voidg_draw_func(func,xmax)

/*绘制优化函数的图形*/

/*变量最大值*/

intx,y,x_old,y_old,i;

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;

{

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)

/*初始化画面的图形*/

charc[5];

/*初始化函数图形区*/

g_rectangle(320,0,639,399,8,1);

g_rectangle(321,1,638,16,8,1);

disp_hz16("

基于基本遗传算法的函数最优化"

370,1,15);

g(x)"

X1-30,Y1-18,15);

1.0"

X1-30,Y1,15);

0"

X1-10,Y1+YR1,15);

x"

X1+XR1+10,Y1+YR1-20,15);

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);

最大适应度"

X2+5,Y2-18,15);

g_line(X2+90,Y2-10,X2+110,Y2-10,11);

平均适应度"

X2+120,Y2-18,15);

g_line(X2+205,Y2-10,X2+225,Y2-10,9);

世代数"

X2+168,Y2+YR2+10,15);

g_text(X2-30,Y2,15,"

);

/*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)

/*随世代进化更新图形*/

/*适应度*/

/*函数值*/

doublemax_fit,m_f_old;

/*当前代最大适应度,上一代最大适应度*/

doubleavg_fit,a_f_old;

/*当前代平均适应度,上一代平均适应度*/

intnum;

/*当前世代数*/

intgen_num;

/*最大世代数*/

inti,j,x,y,x_old,y_old;

charc[10];

/*显示当前世代种群中个体的遗传基因*/

if(num==gen_num-1)

printf("

Indv.%2d:

"

i+1);

%d"

*(gene+i*g_length+j));

==>

Fitness%.4f\n"

*(fitness+i));

Max_fit=%f\n"

max_fit);

Avg_fit=%f\n"

avg_fit);

/*显示个体在函数图形区中的位置*/

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,"

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)

/*世代进化的模拟*/

/*当前世代的个体遗传基因型*/

/*当前世代的个体适应度*/

/*优化函数*/

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];

输入最大模拟世代数:

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;

gen_max;

if(i==gen_max-1)

\n"

************Gen.%d*************\n"

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);

*(fitness+j)=*(new_fitness+j);

for(k=0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1