遗传算法程序.docx
- 文档编号:7447058
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:17
- 大小:16.84KB
遗传算法程序.docx
《遗传算法程序.docx》由会员分享,可在线阅读,更多相关《遗传算法程序.docx(17页珍藏版)》请在冰豆网上搜索。
遗传算法程序
#include
#include
#include
#include
#include
#include
#definePAI3.1415926
#defineMAX_STRING50
#defineMAX_POP2000
#defineN2
structpopulation
{
intchrom[MAX_STRING];
doublex[N+1],eval;
};
typedefstructpopulationPOP;
structbestpopulation
{
intit;
POPmpop;
}mp;
doubleobjfunc(doublex[N+1]);
voidmain(void);
voidinitialize(void);
voidinitdata(void);
voidinitpop(void);
doubledecode1(intchrom[]);
doubledecode2(intchrom[]);
voidstatistics(POPstat[MAX_POP]);
voidprchrom(intflag,POPprpop[MAX_POP]);
voidgeneration(void);
voidselect(void);
voidcrossover(void);
voidmutation(void);
voidrevise(void);/*avoidobstacle*/
voidjudge(void);/*whetherinsideoroutsideobstacle*/
voidsort_newpop(void);
voidsort_oldpop(void);
intrandom(intn)
{
return(rand()%n);
}
doubleobjfunc(doublex[])
{
doublef;
f=0*x[1]+1*x[2];/*whetherthex[2]isneeded*/
return(f);
}
intpop_size,maxgen,gen,m[N+1],mt,sign=-1;
doublepc,pm,ux[N+1],lx[N+1];
POPoldpop[MAX_POP],newpop[MAX_POP];
voidmain(void)
{
inti;
mp.mpop.eval=9999;
gen=0;
srand((unsigned)time(NULL));、
ofstreamfout1("f01.dat");
initialize();
for(i=1;i<=pop_size;i++)
newpop[i]=oldpop[i];
do
{
inti;
gen++;
generation();
statistics(newpop);
sort_newpop();
fout1<<"gen="< for(i=1;i<=20;i++) { fout1<<"v"< fout1< } select(); fout1<<"select"< for(i=1;i<=20;i++) { fout1<<"v"< fout1< } for(i=1;i<=pop_size;i++) oldpop[i]=newpop[i]; }while(gen cout<<"bestchromosome="< cout<<"v("; for(i=1;i<=mt;i++) cout< cout<<")"< cout<<"f("; cout.flags(ios: : fixed);/*以定点方式显示float*/ cout.precision(6);/*当格式为ios: : fixed时,精度为6*/ cout< cout< cout<<""< fout1.close(); } voidinitialize(void) { initdata(); mt=26; initpop(); statistics(oldpop); } voidinitdata(void) { pop_size=1900; pc=0.40; pm=0.70; maxgen=400; } voidinitpop(void) { inti,j; for(i=1;i<=pop_size;i++) { for(j=1;j<=mt;j++) oldpop[i].chrom[j]=random(10); } revise(); for(i=1;i<=pop_size;i++)/*whethertheoldpop[i].x[2]isneeded*/ { oldpop[i].x[1]=decode1(oldpop[i].chrom); oldpop[i].x[2]=decode2(oldpop[i].chrom); oldpop[i].eval=objfunc(oldpop[i].x); } } doubledecode1(intchrom[]) { inti; doublex=0,length=0; for(i=1;i<=mt+1;i++)/*chrom[mt+1]isthelastone*/ { length=sqrt((chrom[i]-chrom[i-1])*(chrom[i]-chrom[i-1])+1); x=x+length; } return(x); } doubledecode2(intchrom[]) { inti; doublex=0,curvity=0; for(i=1;i<=mt;i++)/*chrom[mt]isthelastone*/ { curvity=abs(2*chrom[i]-chrom[i-1]-chrom[i+1]); x=x+curvity; } return(x); } voidstatistics(POPstat[MAX_POP]) { inti,j,npop; doubleminpop; sign=-sign; minpop=stat[1].eval; npop=1; for(i=2;i<=pop_size;i++) { if(minpop>stat[i].eval) { minpop=stat[i].eval; npop=i; } if(mp.mpop.eval>stat[npop].eval) { mp.it=gen; mp.mpop=stat[npop]; cout<<"sign="< cout<<"gen="< cout<<"number="< cout<<"v("; for(j=1;j<=mt;j++) cout< cout<<")"< cout<<"f("; cout.flags(ios: : fixed);/*以定点方式显示float*/ cout.precision(6);/*当格式为ios: : fixed时,精度为6*/ cout< cout< cout<<""< } } } voidgeneration(void) { inti; crossover(); mutation(); for(i=1;i<=pop_size;i++) { newpop[i].x[1]=decode1(newpop[i].chrom); newpop[i].x[2]=decode2(newpop[i].chrom); newpop[i].eval=objfunc(newpop[i].x); } judge();/*whetherinsideoroutsideobstacle*/ } voidselect(void) { inti=1,j=1,t=1; POPtemp[MAX_POP]; sort_oldpop(); sort_newpop(); while(t<=pop_size)/*sortnewpop*/ { if(oldpop[i].eval<=newpop[j].eval) { temp[t++]=oldpop[i++]; } else { temp[t++]=newpop[j++]; } } for(i=1;i<=pop_size;i++) { newpop[i]=temp[i]; } } voidcrossover(void) { inti,j,fl,cpop,pos,tmp[MAX_STRING]; doubler[MAX_POP]; for(i=1;i<=pop_size;i++) { r[i]=(double)rand()/RAND_MAX; } for(fl=0,i=1;i<=pop_size;i++) { if((fl==0)&&(r[i]<=pc)) { cpop=i; fl=1; } elseif((fl==1)&&(r[i]<=pc)) { pos=random(mt-1)+1; for(j=pos+1;j<=mt;j++) { tmp[j]=newpop[cpop].chrom[j]; newpop[cpop].chrom[j]=newpop[i].chrom[j]; newpop[i].chrom[j]=tmp[j]; } fl=0; } } } voidmutation(void) { inti,j,cpop,pos1,pos2,tmp,pos; doubler; POPtempop[MAX_POP]; for(i=1;i<=pop_size;i++) { r=(double)rand()/RAND_MAX; if(r<=pm) { pos=random(mt)+1;/*? ? ? ? ? */ newpop[i].chrom[pos]=random(10); pos=random(mt)+1;/*? ? ? ? ? */ newpop[i].chrom[pos]=random(10); for(j=1;j<=3;j++) { tempop[1].chrom[j]=newpop[i].chrom[j]; } for(j=4;j<=5;j++) { tempop[1].chrom[j]=newpop[i].chrom[j+21]; } for(j=6;j<=9;j++) { tempop[1].chrom[j]=newpop[i].chrom[j-2]; } for(j=10;j<=15;j++) { tempop[1].chrom[j]=newpop[i].chrom[j+7]; } for(j=16;j<=24;j++) { tempop[1].chrom[j]=newpop[i].chrom[j-8]; } for(j=25;j<=26;j++) { tempop[1].chrom[j]=newpop[i].chrom[j-2]; } pos1=random(5)+1;/*1-5*/ pos2=random(5)+1; tmp=tempop[1].chrom[pos1]; tempop[1].chrom[pos1]=tempop[1].chrom[pos2]; tempop[1].chrom[pos2]=tmp; pos1=random(10)+6;/*6-15*/ pos2=random(10)+6; tmp=tempop[1].chrom[pos1]; tempop[1].chrom[pos1]=tempop[1].chrom[pos2]; tempop[1].chrom[pos2]=tmp; pos1=random(9)+16;/*16-24*/ pos2=random(9)+16; tmp=tempop[1].chrom[pos1]; tempop[1].chrom[pos1]=tempop[1].chrom[pos2]; tempop[1].chrom[pos2]=tmp; pos1=random (2)+25;/*25-26*/ pos2=random (2)+25; tmp=tempop[1].chrom[pos1]; tempop[1].chrom[pos1]=tempop[1].chrom[pos2]; tempop[1].chrom[pos2]=tmp; for(j=1;j<=3;j++) { newpop[i].chrom[j]=tempop[1].chrom[j]; } for(j=4;j<=5;j++) { newpop[i].chrom[j+21]=tempop[1].chrom[j]; } for(j=6;j<=9;j++) { newpop[i].chrom[j-2]=tempop[1].chrom[j]; } for(j=10;j<=15;j++) { newpop[i].chrom[j+7]=tempop[1].chrom[j]; } for(j=16;j<=24;j++) { newpop[i].chrom[j-8]=tempop[1].chrom[j]; } for(j=25;j<=26;j++) { newpop[i].chrom[j-2]=tempop[1].chrom[j]; } } } } voidrevise(void)/*obstacleavoidance*/ { inti,j; for(i=1;i<=pop_size;i++) for(j=1;j<=mt;j++) switch(j) { case4: case5: case6: case7: case17: case18: case19: case20: case21: case22: if((0<=oldpop[i].chrom[j])&&(oldpop[i].chrom[j]<=5))/*insideobstacle*/ { oldpop[i].chrom[j]=random(4)+6; } break; case8: case9: case10: case11: case12: case13: case14: case15: case16: if((0<=oldpop[i].chrom[j])&&(oldpop[i].chrom[j]<=7)) { oldpop[i].chrom[j]=random (2)+8; } break; case23: case24: if((0<=oldpop[i].chrom[j])&&(oldpop[i].chrom[j]<=4)) { oldpop[i].chrom[j]=random(5)+5; } break; case1: case2: case3: case25: case26: oldpop[i].chrom[j]=random(10); break; default: break; } } voidjudge(void)/*whetherinsideoroutsideobstacle*/ { inti,j; for(i=1;i<=pop_size;i++) for(j=1;j<=mt;j++) switch(j) { case4: case5: case6: case7: case17: case18: case19: case20: case21: case22: if((0<=newpop[i].chrom[j])&&(newpop[i].chrom[j]<=5))/*insideobstacle*/ { newpop[i].eval=9999; } break; case8: case9: case10: case11: case12: case13: case14: case15: case16: if((0<=newpop[i].chrom[j])&&(newpop[i].chrom[j]<=7)) { newpop[i].eval=9999; } break; case23: case24: if((0<=newpop[i].chrom[j])&&(newpop[i].chrom[j]<=3)) { newpop[i].eval=9999; } break; default: break; } } voidsort_newpop(void)/*newpop+oldpopfrombesttoworst*/ { inti,j,k; doubleminpop; POPtemp[MAX_POP]; for(i=1;i<=pop_size;i++)/*sortnewpop*/ { minpop=newpop[i].eval; k=i+1; for(j=k;j<=pop_size;j++) { if(minpop>newpop[j].eval) { minpop=newpop[j].eval; temp[1]=newpop[j]; newpop[j]=newpop[i]; newpop[i]=temp[1]; } } } } voidsort_oldpop(void)/*newpop+oldpopfrombesttoworst*/ { inti,j,k; doubleminpop; POPtemp[MAX_POP]; for(i=1;i<=pop_size;i++)/*sortnewpop*/ { minpop=oldpop[i].eval; k=i+1; for(j=k;j<=pop_size;j++) { if(minpop>oldpop[j].eval) { minpop=oldpop[j].eval; temp[1]=oldpop[j]; oldpop[j]=oldpop[i]; oldpop[i]=temp[1]; } } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遗传 算法 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)