📄 gapop1.cpp
字号:
g1.nReal(garealn);
for(int j=0;j<garealn;j++)
{
t=poplb[j]+poprand()*(pophb[j]-poplb[j]);
//t=poplb[j]+poprand()*(0.5-0.0);
g1.vecReal(j,t);
}
}
gareal& gapop1::newinv()
{
double t;
static gareal g1;
g1.nReal(garealn);
for(int j=0;j<garealn;j++)
{
t=poplb[j]+poprand()*(pophb[j]-poplb[j]);
//t=poplb[j]+poprand()*(0.5-0.0);
g1.vecReal(j,t);
}
return g1;
}
void gapop1::avigen()
{
int i,j;
double t;
t=0.;
avigareal.nReal(garealn);
for(i=0;i<garealn;i++)
{
t=0.0;
for(j=0;j<popsize;j++)
{
t=t+garealpop[j].vecReal(i);
}
avigareal.vecReal(i,t/popsize);
// printf("gdsgsd%f \n",avigareal.vecReal(i));
}
t=0.0;
for(j=0;j<popsize;j++) t=t+garealpop[j].Fitness();
avigareal.Fitness(t/popsize);
t=0.0;
for(j=0;j<popsize;j++) t=t+garealpop[j].Objv();
avigareal.Objv(t/popsize);
avigareal.nLe(bestgareal.nLe());
avigareal.nF(bestgareal.nF());
avigareal.nE(bestgareal.nE());
if(bestgareal.nF()>0)
{
for(int i=0;i<bestgareal.nF();i++)
{
t=0.0;
for(j=0;j<popsize;j++) t=t+garealpop[j].vecpf(i);
avigareal.vecpf(i,t/popsize);
}
}
if(bestgareal.nE()>0)
{
for(int i=0;i<bestgareal.nE();i++)
{
t=0.0;
for(j=0;j<popsize;j++) t=t+garealpop[j].vecpe(i);
avigareal.vecpe(i,t/popsize);
}
}
if(bestgareal.nLe()>0)
{
for(int i=0;i<bestgareal.nLe();i++)
{
t=0.0;
for(j=0;j<popsize;j++) t=t+garealpop[j].vecple(i);
avigareal.vecple(i,t/popsize);
}
}
avigareal.State(1);
}
void gapop1::wlast()
{
int i;
fstream fo1;
fo1.open("last.txt",ios::out);//|ios::app
fo1<<popsize<<"\t"<<pcross<<"\t"<<pmutation<<"\n";
fo1<<crossopt.opt1<<"\t"<<crossopt.opt2<<"\t"<<mutopt.opt1<<"\t"<<mutopt.opt2<<"\n";
fo1<<curgen<<"\t"<<maxgen<<"\t"<<bestgen<<"\t"<<endl;
fo1<<objopt1<<endl;
fo1<<garealn<<endl;
// fo1<<"no:\t"<<"hb\t"<<"lb\n";
for(i=0;i<garealn;i++) fo1<<pophb[i]<<"\t"<<poplb[i]<<"\n";
//if(garealpop[0].nF()>0) fo1<<garealpop[0].nF()<<"\t";
// if(garealpop[0].nE()>0)
fo1<<garealpop[0].nE()<<"\t";
// if(garealpop[0].nLe()>0)
fo1<<garealpop[0].nLe()<<"\t";
//fo1<<garealpop[0].State()<<"\t";
fo1<<endl;
//if(garealpop[0].nE()>0||garealpop[0].nLe()>0) fo1<<garealpop[0].Valid()<<"\n";
fo1<<bestgareal;
for(i=0;i<popsize;i++) fo1<<garealpop[i];
fo1<<time(NULL)<<endl;
fo1.close();
}
void gapop1::rlast()
{
int i,j,ne,nle,valid;
double t;
char ss1[40];
time_t t1;
fstream fo1;
fo1.open("last.txt",ios::in);//|ios::app
fo1>>popsize>>pcross>>pmutation;
fo1>>crossopt.opt1>>crossopt.opt2>>mutopt.opt1>>mutopt.opt2;
fo1>>curgen>>maxgen>>bestgen;
fo1>>objopt1;
fo1>>garealn;
// cout<<garealn<<endl;
// fo1>>"no:\t">>"hb\t">>"lb\n";
for(i=0;i<garealn;i++) fo1>>pophb[i]>>poplb[i];
//if(garealpop[0].nF()>0) fo1>>garealpop[0].nF()>>"\t";
// if(garealpop[0].nE()>0) fo1>>garealpop[0].nE()>>"\t";
// if(garealpop[0].nLe()>0) fo1>>garealpop[0].nLe()>>"\t";
// if(garealpop[0].nE()>0||garealpop[0].nLe()>0) fo1>>garealpop[0].Valid()>>"\n";
fo1>>ne>>nle;
bestgareal.nE(ne);
bestgareal.nLe(nle);
bestgareal.nReal(garealn);
bestgareal.State(1);
for(j=0;j<garealn;j++)
{
fo1>>t;
bestgareal.vecReal(j,t);
}
fo1>>t;
bestgareal.Fitness(t);
//cout<<bestgareal.Fitness()<<endl;
fo1>>t;
bestgareal.Objv(t);
/*if(ga1.nF()>0)
{
for(int i=0;i<ga1.nF();i++)
{is>>t;ga1.vecpf(i,t);}
}*/
if(ne>0)
{
for( j=0;j<ne;j++)
{ fo1>>t;bestgareal.vecpe(j,t);}
}
if(nle>0)
{
for( j=0;j<nle;j++)
{fo1>>t;bestgareal.vecple(j,t);}
}
if(ne>0||nle>0)
{
fo1>>valid;
bestgareal.Valid(valid);
}
for(i=0;i<popsize;i++)
{
garealpop[i].nE(ne);
garealpop[i].nLe(nle);
garealpop[i].nReal(garealn);
garealpop[i].State(1);
for(j=0;j<garealn;j++)
{
fo1>>t;
garealpop[i].vecReal(j,t);
}
fo1>>t;
garealpop[i].Fitness(t);
//cout<<garealpop[i].Fitness()<<endl;
fo1>>t;
garealpop[i].Objv(t);
/*if(ga1.nF()>0)
{
for(int i=0;i<ga1.nF();i++)
{is>>t;ga1.vecpf(i,t);}
}*/
if(ne>0)
{
for( j=0;j<ne;j++)
{ fo1>>t;garealpop[i].vecpe(j,t);}
}
if(nle>0)
{
for( j=0;j<nle;j++)
{fo1>>t;garealpop[i].vecple(j,t);}
}
if(ne>0||nle>0)
{
fo1>>valid;
garealpop[i].Valid(valid);
}
}
fo1>>t1;
fo1.close();
sprintf(ss1,"last%d.txt",t1);
rename("last.txt",ss1);
}
void gapop1::repoprun()
{
gareal *pop,gg1,*popmove;
char ss1[40],ss2[40],ss3[40],ss4[40];
int *nc,*nm,*rn,*popn,n;//
int i,j,k,nn;
double *popfit;
int f1,f2,f3,f4;
int ng=1;
int nmove,genmove;
double pmove;
int folast=1;
f1=1;f2=1;f3=0;f4=1;
rlast();
if(curgen==maxgen) exit(0);
int cg=curgen+1;
//cout<<curgen;
genmove=20;
pmove=0.2;
nn=nrun(0);
//na=0;
//init();
//output();
fstream fo1,fo2,fo3,fo4;
sprintf(ss1,"popgen%d.txt",nn);
sprintf(ss2,"popbest%d.txt",nn);
sprintf(ss3,"popgen%d.txt",nn);
sprintf(ss4,"popavg%d.txt",nn);
if(f1==1) fo1.open(ss1,ios::out|ios::app);
if(f2==1)fo2.open(ss2,ios::out|ios::app);
if(f3==1)fo3.open(ss3,ios::out|ios::app);
if(f4==1)fo4.open(ss4,ios::out|ios::app);
/*if(f1==1)
{
fo1<<"\n****************************************************************\n";
fo1<<"\npop info:\n";
fo1<<"popsize="<<popsize<<" maxgen="<<maxgen<<" pcross="<<pcross<<" pmutation="<<pmutation;
fo1<<" garealn="<<garealn<<endl;
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<<"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;
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";
}
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
na=popsize+curgen*(ncross*2+nmutation);
for(curgen=cg;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;*/
//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);//
}*/
curbestgareal=pop[popn[0]];
if(bestgareal.Fitness()>curbestgareal.Fitness())
{
//popcopy(curbestgareal,bestgareal);
bestgareal=curbestgareal;
bestgen=curgen;
}
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;
}
int gapop1::nrun(int w)
{
int i=0;
fstream fo1;
fo1.open("nosum.txt",ios::in|ios::out);
fo1>>i;
if(i<0) i=0;
fo1.close();
if(w==1)
{
i++;
fo1.open("nosum.txt",ios::in|ios::out);
fo1<<i;
fo1.close();
}
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -