Beispiel #1
0
//微粒飞翔,产生新一代微粒
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;
		}
	}
}
Beispiel #2
0
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;
			}
		}
	}
}