//微粒飞翔,产生新一代微粒 void PSO::ParticleFly() { static double FitBak[100];//用来存放备份的适合度值 if(!Particle) { return; } static int tt=(unsigned)time(NULL); srand((unsigned)time(NULL)*tt++); static int kk=2;//迭代次数 double W; W=W_max-kk*(W_max-W_min)/IteorMax; kk++; //整个群体飞向新的位置 for(int i=0;i<PNum;i++) { for(int j=0;j<Particle[i].Dim;j++) { Particle[i].V[j]=W*Particle[i].V[j]+ rand()/(double)RAND_MAX*C1*(Particle[i].XBest[j]-Particle[i].X[j])+ rand()/(double)RAND_MAX*C2*(Particle[GBestIndex].XBest[j]-Particle[i].X[j]); } for(int j=0;j<Particle[i].Dim;j++) { if(Particle[i].V[j]>Vmax[j]) { Particle[i].V[j]=Vmax[j]; } if(Particle[i].V[j]<-Vmax[j]) { Particle[i].V[j]=-Vmax[j]; } } for(int j=0;j<Particle[i].Dim;j++) { Particle[i].X[j]+=Particle[i].V[j];//修改坐标 if(Particle[i].X[j]>Xup[j]) { Particle[i].X[j]=Xup[j]; } if(Particle[i].X[j]<Xdown[j]) { Particle[i].X[j]=Xdown[j]; } } } //计算各微粒的适合度 CalFit(); for(int i=0;i<PNum;i++) { FitBak[i]=Particle[i].Fit; } //设置个体的最好位置 for(int i=0;i<PNum;i++) { if(Particle[i].Fit>=Particle[i].FitBest) { Particle[i].FitBest=Particle[i].Fit; for(int j=0;j<Particle[i].Dim;j++) { Particle[i].XBest[j]=Particle[i].X[j]; } } } //设置群体中新的最优个体 GBestIndex=0; for(int i=0;i<PNum;i++) { if( (Particle[i].FitBest>=Particle[GBestIndex].FitBest) && i!=GBestIndex) { GBestIndex=i; } } }
void GA::Generate() { res = Schedule(); //crash和reward都是要最小最好,crash代表冲突个数,reward代表占用的半天的个数 res.crash_ = mxcrash; res.reward_ = mxcrash; Init(); int t1 = clock(), t2 = t1, t3 = t1; int mxoff = timeout; int prvcrash = mxcrash; cout << "start generate\n"; cout << t1 << endl; //system("PAUSE"); while (t2 - t1 < mxoff) { //会把0组的选择结果送到1组当中,再传回来 Select(); cout << "selected\n"; Mutate(); cout << "mutated\n"; //cross之后会把1组的结果送到0组当中 Cross(); cout << "crossed\n"; //test(generation[1]); //generation[0] = generation[1]; //test(generation[0]); Modify(); cout << "modify\n"; //break; CalFit(); break; int micrash = 11111; for (int i = 0; i < population_; i++) { Transform(generation[0][i]); micrash = min(micrash, generation[0][i].crash_); } if (res.crash_ == 0)break; if (res.crash_ != prvcrash) { prvcrash = res.crash_; pof_mutate_ = c_pof_cross_; pof_mutate_gene_ = c_pof_mutate_gene_; t3 = clock(); } t2 = clock(); cout << res.crash_ << ' ' << micrash << ' ' << res.reward_ << ' ' << t1 << ' ' << t2 << ' ' << t3 << "\n"; //遇上局部最优解无法逃出 if (t2 - t3 > loctimeout) { //重新设定起点,但是不必要重新回到起点 pof_mutate_ *= step; pof_mutate_gene_ *= step; pof_mutate_ = min(mx_pof_mutate_, pof_mutate_); pof_mutate_gene_ = min(mx_pof_mutate_gene_, pof_mutate_gene_); t3 = clock(); } //初始化不够好或者产生的结果太糟糕也要重新初始化 if (micrash > max(crashout, res.crash_ * 2)) { Init(); t1 = clock(); t3 = t1; } else { //如果运行时间太长 if (t2 - t1 > mxoff && mxoff == timeout) { Init(); t1 = clock(); t3 = t1; } } } }