📄 gapop1.cpp
字号:
fo1<<"popsize="<<popsize<<" maxgen="<<maxgen<<" pcross="<<pcross<<" pmutation="<<pmutation;
fo1<<" garealn="<<garealn<<endl;
fo1<<"cross and mutation opt:"<<crossopt.opt1<<"\t"<<crossopt.opt2<<"\t"<<mutopt.opt1<<"\t"<<mutopt.opt2<<"\n";
fo1<<"no:\t"<<"hb\t"<<"lb\n";
for(i=0;i<garealn;i++) fo1<<"no"<<i<<":\t"<<pophb[i]<<"\t"<<poplb[i]<<"\n";
fo1<<"\n****************************************************************\n";
}
if(f2==1)
{
fo2<<"\n****************************************************************\n";
fo2<<"\npop info:\n";
fo2<<"popsize="<<popsize<<" maxgen="<<maxgen<<" pcross="<<pcross<<" pmutation="<<pmutation;
fo2<<" garealn="<<garealn<<endl;
fo2<<"cross and mutation opt:"<<crossopt.opt1<<"\t"<<crossopt.opt2<<"\t"<<mutopt.opt1<<"\t"<<mutopt.opt2<<"\n";
fo2<<"no:\t"<<"hb\t"<<"lb\n";
for(i=0;i<garealn;i++) fo2<<"no"<<i<<":\t"<<pophb[i]<<"\t"<<poplb[i]<<"\n";
fo2<<"\n****************************************************************\n";
}
if(f4==1)
{
fo4<<"\n****************************************************************\n";
fo4<<"\npop info:\n";
fo4<<"popsize="<<popsize<<" maxgen="<<maxgen<<" pcross="<<pcross<<" pmutation="<<pmutation;
fo4<<" garealn="<<garealn<<endl;
fo1<<"cross and mutation opt:"<<crossopt.opt1<<"\t"<<crossopt.opt2<<"\t"<<mutopt.opt1<<"\t"<<mutopt.opt2<<"\n";
fo4<<"no:\t"<<"hb\t"<<"lb\n";
for(i=0;i<garealn;i++) fo4<<"no"<<i<<":\t"<<pophb[i]<<"\t"<<poplb[i]<<"\n";
fo4<<"\n****************************************************************\n";
avigen();
fo4<<curgen<<"\t"<<avigareal;
}
if(f1==1) fo1<<"0\n";
if(f1==1) for(i=0;i<popsize;i++) fo1<<garealpop[i];
if(f3==1)
{
fo3<<"\n****************************************************************\n";
fo3<<"\npop info:\n";
fo3<<"popsize="<<popsize<<" maxgen="<<maxgen<<" pcross="<<pcross<<" pmutation="<<pmutation;
fo3<<" garealn="<<garealn<<endl;
fo3<<"no:\t"<<"hb\t"<<"lb\n";
for(i=0;i<garealn;i++) fo3<<"no"<<i<<":\t"<<pophb[i]<<"\t"<<poplb[i]<<"\n";
fo3<<"\n****************************************************************\n";
fo3<<"\n\ninit pop:\n\n";
for(i=0;i<popsize;i++) fo3<<garealpop[i];
}
int neclit=4<popsize/3?4:popsize/3;//
ncross=(int)(pcross*popsize+1)/2;
if(ncross*2>popsize) ncross-=popsize%2;
nc=new int[ncross*2];
// nmutation=int(ceil(pmutation*popsize*garealn));
nmutation=int(ceil(pmutation*popsize));
nm=new int[nmutation];
rn=new int[popsize+1];
n=ncross*2+nmutation+popsize;
nmove=int(pmove*popsize);
pop=new gareal[n+1];
popn=new int[n+1];
popfit=new double[n+1];
popmove=new gareal[nmove+1];
//maxgen
for(curgen=1;curgen<=maxgen;curgen++)
{
//cout<<curgen<<"************************\n";
if(ng==1) printf("gen:%d***************************\n",curgen);
//cross
if(f3==1)fo3<<"\ngen:"<<curgen<<endl;
if(f3==1)fo3<<"\ncross\n\n";
if(neclit>=ncross*2)
{
//for(i=0;i<ncross*2;i++) nc[i]=i;
poprandn(ncross*2,ncross*2,nc);
}
else
{
poprandn(popsize,ncross*2-neclit,nc);
for(i=0;i<neclit;i++) nc[ncross*2-i-1]=i;
//for(i=0;i<ncross;i++)
{
// if(nc[i]==nc[2*ncross-i]) nc[i]=(rand()%popsize+nc[i])%popsize;
}
}
//poprandn(popsize,ncross*2,nc);
//for(i=0;i<ncross*2;i++) nc[i]=rn[i];
if(f3==1) fo3<<"ncross="<<ncross<<"\n"<<endl;
for(i=0;i<ncross;i++)
{
j=nc[2*i];k=nc[2*i+1];
//j=nc[i];k=nc[2*ncross-i-1];
if(j==k) j=(rand()%popsize+j)%popsize;
cross(garealpop[j],garealpop[k],pop[2*i],pop[2*i+1]);
if(f3==1)fo3<<"\n"<<j<<"\t"<<k<<"\t"<<2*i<<"\t"<<2*i+1<<endl;
if(f3==1)fo3<<garealpop[j]<<garealpop[k]<<pop[2*i]<<pop[2*i+1];
//objfunc(pop[2*i]);
//objfunc(pop[2*i+1]);
}
//mutation
if(f3==1)fo3<<"\nmutation:\n\n";
if(f3==1) fo3<<"nmutation="<<nmutation<<"\n"<<endl;
j=ncross*2;
//poprandn(popsize*garealn,nmutation,nm);
//popsort(nmutation,nm);
poprandn(popsize,nmutation,nm);
if(nmutation>0)
{
//for(i=0;i<nmutation;i++) nm[i]=rn[i];
for(i=0;i<nmutation;i++)
{
k=nm[i];
if(k<j)
{
mutation(pop[k],pop[j+i]);
if(f3==1)fo3<<pop[k]<<pop[j+i];
}
else
{
mutation(garealpop[k],pop[j+i]);
if(f3==1)fo3<<garealpop[k]<<pop[j+i];
}
// k=nm[i]/garealn;
// int mi=nm[i]%garealn;
/* if(f3==1)fo3<<"\n"<<k<<"\t"<<mi<<"\n";
if(i>0&&k==nm[i-1]/popsize)
{
mutation(pop[j+i-1],mi,pop[j+i]);
//mutation(pop[j+i-1],pop[j+i]);
if(f3==1)fo3<<pop[j+i-1]<<pop[j+i];
}
else
{
if(k<j)
{
mutation(pop[k],mi,pop[j+i]);
if(f3==1)fo3<<pop[k]<<pop[j+i];
}
else
{
mutation(garealpop[k],mi,pop[j+i]);
if(f3==1)fo3<<garealpop[k]<<pop[j+i];
}
}*/
//objfunc(pop[j+i]);*/
}
}
/*else
{
k=rn[0];%
mutation(garealpop[k],pop[j]);
objfunc(pop[j]);
}*/
//
k=2*ncross+nmutation;
//compute fitness
/*for(i=0;i<k;i++)
{
if(curgen>maxgen/3)
{
if(i==0) objfunc(pop[i]);
else
{
j=compare(pop[i],pop,i);
if(j==-1) objfunc(pop[i]);
else
{
pop[i]=pop[j];
pop[i].State(1);
}
}
}
else
objfunc(pop[i]);
}*/
objfunc(pop,k);
for(i=0;i<popsize;i++)
pop[k+i]=garealpop[i];//popcopy(garealpop[i],pop[k+i]);
for(i=0;i<n;i++)
popfit[i]=pop[i].Fitness();
/*for(i=0;i<n;i++) cout<<popfit[i]<<"\t";
cout<<endl;*/
if(f3==1) fo3<<"\n pop fitness:\n";
if(f3==1)for(i=0;i<n;i++) fo3<<popfit[i]<<"\t";
if(f3==1)fo3<<"\n";
popsort(popfit,n,popn);
if(f3==1) fo3<<"\n pop fitness sort:\n";
if(f3==1)for(i=0;i<n;i++) fo3<<popn[i]<<"\t";
if(f3==1)fo3<<"\n";
/*cout<<"***************************"<<endl;
for(i=0;i<n;i++) cout<<popfit[i]<<"\t";
cout<<endl;*/
curbestgareal=pop[popn[0]];
if(bestgareal.Fitness()>curbestgareal.Fitness())
{
//popcopy(curbestgareal,bestgareal);
bestgareal=curbestgareal;
bestgen=curgen;
}
//select
if(f3==1)fo3<<"\n\nselect popsize:\n\n";
for(i=0;i<neclit;i++)
{
j=popn[i];
//popcopy(pop[j],garealpop[i]);
garealpop[i]=pop[j];
}
poprandn(n-neclit,popsize-neclit,rn);
if(f3==1)
{
fo3<<"s1:\n";
for(i=0;i<popsize-neclit;i++) fo3<<rn[i]<<"\t";
fo3<<endl;
popsort(popsize-neclit,rn);
fo3<<"s2:\n";
for(i=0;i<popsize-neclit;i++) fo3<<rn[i]<<"\t";
fo3<<endl;
fo3<<"last:\n";
}
for(i=0;i<popsize-neclit;i++)
{
j=rn[i]+neclit;
//popcopy(pop[j],garealpop[i+neclit]);
garealpop[neclit+i]=pop[popn[j]];
if(f3==1) fo3<<popn[j]<<"\t";
}
if(f3==1) fo3<<endl;
//
//popcopy(pop[popn[0]],curbestgareal); //curbestgareal=pop[0];
/*for(i=0;i<popsize;i++) //
{
j=popn[i];
garealpop[i]=pop[j];
}*/
// move
/*
if(curgen%genmove==0)
{
for(i=0;i<nmove;i++)
popmove[i]=newinv();
objfunc(popmove,nmove);
for(i=0;i<nmove;i++)
garealpop[popsize-i-1]=popmove[i];
for(i=0;i<popsize;i++) popfit[i]=garealpop[i].Fitness(); //
popsort(popfit,popsize,popn);//
}*/
if(f2==1) fo2<<curgen<<"\t"<<bestgen<<"\t"<<bestgareal;
//output();
if(f1==1)
{
if(curgen%50==0)
{
fo1<<curgen<<"\n";
for(i=0;i<popsize;i++) fo1<<garealpop[i];
}
}
if(f3==1)
{
fo3<<"\nselect pop info:\n\n";
for(i=0;i<popsize;i++) fo3<<garealpop[i];
fo3<<"\ncurbest gareal: "<<curbestgareal;
fo3<<"\nbest gareal: "<<bestgareal;
}
if(f4==1)
{
avigen();
fo4<<curgen<<"\t"<<avigareal;
}
if(curgen%10==0) wlast();
}
if(f1==1)fo1.close();
if(f2==1)fo2.close();
if(f3==1) fo3.close();
if(f4==1) fo4.close();
delete []rn;
delete []nc;
delete []nm;
delete []pop;
delete []popn;
delete []popfit;
delete []popmove;
}
void gapop1::output()
{
fstream fout;
int i;
if(curgen==0)
fout.open("ga313.txt",ios::out);//ios::in|
else
fout.open("ga313.txt",ios::app);//ios::in|ios::out|
if(curgen%1==0)
{
fout<<"当前代数";
for(i=0;i<garealn;i++) fout<<" 当前代最佳值"<<i;
fout<<"当前代最佳适用值"<<" 当前代最佳目标函数值"<<endl;
fout<<curgen<<"\t"<<curbestgareal;
fout<<"最佳代数";
for(i=0;i<garealn;i++) fout<<" 最佳值"<<i;
fout<<"最佳适用值"<<"最佳目标函数值"<<endl;
fout<<bestgen<<"\t"<<bestgareal;
/* fout<<"个体号";
for(i=0;i<garealn;i++) fout<<"\t数值"<<i;
fout<<"\t适用值"<<"\t目标函数值"<<endl;
for(i=0;i<popsize;i++)
{
fout<<i<<"\t";
//for(int j=0;j<garealn;j++) fout<<garealpop[i].vecReal(j)<<"\t";
//fout<<garealpop[i].Fitness()<<endl;
fout<<garealpop[i];
}*/
}
//fout<<curgen<<"\t"<<bestgareal;
fout.close();
}
void gapop1::popsort(double *s1,int n,int *r1)//[0]=min
{
int i,j,*s;
double *ss,t;
ss=new double[n];
s=new int[n];
for(i=0;i<n;i++) ss[i]=s1[i];
for(i=0;i<n;i++) s[i]=1;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(s1[i]>s1[j])
{
t=s1[i];
s1[i]=s1[j];
s1[j]=t;
}
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(s1[i]==ss[j]&&s[j]==1) { r1[i]=j;s[j]=0;break;}
delete []ss;
delete []s;
}
void gapop1::popsort(int n,int *s1)//[0]=min
{
int i,j,t;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(s1[i]>s1[j])
{
t=s1[i];
s1[i]=s1[j];
s1[j]=t;
}
}
}
}
/*void gapop1::popcopy(gareal &p1, gareal &p2)
{
p2=p1;
}*/
void gapop1::sgapop()
{
}
double gapop1::bintoreal(double vh, double vl, int n, char *cbin)
{
//double tt[]={1.,2.,4.,8.,16.,32.,64.,128.,256.,512.,1024.,2048.,4096.,8192.,16384.,32768.,65536.};
double r=0.;
// int nw=16;
double s1,s2;
s1=0.;
if(n>64) return 0.;
double t=0.5;
for(int i=n-1;i>=0;i--)
{
t=t*2.;
if(cbin[i]!='\0') s1=s1+int(cbin[i]-'0')*t;
// if(n<=nw) s1=s1+int(cbin[i]-'0')*tt[n-i-1];
// else s1=s1+int(cbin[i]-'0')*tt[nw]*tt[n-nw-i-1];
}
//if(n<nw+1) s2=tt[n];
//else s2=tt[nw]*tt[n-nw];
s2=t*2.;
r=s1/s2;
r=vl+(vh-vl)*r;
return r;
}
void gapop1::realtobin(double vh, double vl,double v, int n, char *cbin)
{
double r=0.;
if(vh!=vl) r=(v-vl)/(vh-vl);
else r=0.;
for(int i=0;i<n;i++)
{
r=r*2;
if(r>=1.) {cbin[i]='1';r=r-1.;}
else {cbin[i]='0';}
}
}
int gapop1::compare(gareal &g1, gareal &g2)
{
int i;
for(i=0;i<g1.nReal();i++)
{
if(fabs(g1.vecReal(i)-g2.vecReal(i))>0.0001) { return 0;break;}
}
return 1;
}
int gapop1::compare(gareal *g1, gareal *g2)
{
int i,r;
r=1;
for(i=0;i<g1->nReal();i++)
{
if(fabs(g1->vecReal(i)-g2->vecReal(i))>0.0001) { r=0;break;}
}
return r;
}
int gapop1::compare(gareal &g1, gareal *pg, int n)
{
int i;
for(i=0;i<n;i++)
{
if(compare(g1,pg[i])==1) { return i;break;}
}
return -1;
}
void gapop1::objfunc(gareal *ga1, int n)
{
int i,j,n1,valid,state;
FILE *output;
fstream fo;
double *pler,*plel,*per,*pel;
int ne,nle;
double s,ss,r;
n1=ga1[0].nReal();
ne=0; per=new double[ne];pel=new double[ne];
if(testf>0)
{
for(int j=0;j<n;j++) objfunc(ga1[j]);
}
else
{
output = fopen("da1.txt","w"); //输出数据
fprintf(output,"%d\n",n);
for(i=0;i<n;i++)
{
for(j=0;j<n1;j++) fprintf(output,"%8.1f",ga1[i].vecReal(j));
fprintf(output,"\n");
}
fclose(output);
//调用ANSYS计算
int result=system("ansys100.exe -b -p ane3fl -i opt10main.txt -o EX1_11.txt");
// printf("Solution finished...\n");
output = fopen("EX1_11.txt","w");
fprintf(output,"\n");
fclose(output);
/*output = fopen("reda.txt","r");
fscanf(output," %f",&t);
s=(double)t;
fscanf(output," %f",&t);
s1=(double)t;
fscanf(output," %f",&t);
s2=(double)t;
fclose(output);*/
fo.open("rda10.txt",ios::in); //读入数据
nle=11;
pler=new double[nle];plel=new double[nle];
pler[0]=51.8;
for(i=1;i<nle;i++) pler[i]=172.5;
for(i=0;i<n;i++)
{
/* fo>>s>>s1>>s2;
printf("%d %12.1f %7.3f %7.3f \n",na,s,s1,s2);
na++;
valid=1; state=0;
ga1[i].nLe(2);
ga1[i].vecple(0,(51.8-s1));
ga1[i].vecple(1,(172.25-s2));
ss=s;
if(objopt1=1) r=0.5+0.5*curgen/maxgen;
else r=1.0;
if(s1>51.8) {s=s+s*(s1-51.8)*s1*r/(2*51.8);valid=0; }
if(s2>172.25) {s=s+s*(s2-172.25)*s2*r/(2*172.25);valid=0;}*/
valid=1; state=0;
ga1[i].nLe(nle);
fo>>ss;
for(j=0;j<nle;j++) fo>>plel[j];
printf("%d %12.1f %7.3f \n",na,ss,plel[0]);
na++;
if(objopt1=1) r=0.5+0.5*curgen/maxgen;
else r=1.0;
s=1.0;
for(j=0;j<nle;j++)
{
ga1[i].vecple(j,pler[j]-plel[j]);
if(plel[j]>pler[j])
{
s=s+(plel[j]-pler[j])*plel[j]*r/(nle*pler[j]);
valid=0;
}
}
s=s*ss;
ga1[i].Fitness(s);
ga1[i].Objv(ss);
ga1[i].Valid(valid);
ga1[i].State(state);
}
fo.close();
}
}
void gapop1::newinv(gareal &g1)
{
double t;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -