⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acs4fun.cpp

📁 这是一个用C++编写的
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		if(fit[t2]<globalbestfit)
		{
			globalbestfit=fit[t2];
			for (layer=0;layer<NLayers;layer++)
				globalbestant[layer]=ant[t2][layer];
			for (i=0;i<NVariants;i++)
			{
				globalbestx[i]=x[t2][i];
				globalbestx_real[i]=x_real[t2][i];
			}
			globalbesty=y[t2];
			bestiter=iter+1;		//bestiter从1开始计数,而iter从0开始
			///////////////  write result  ///////////////
			if(bWriteResult==true && bWriteAllData==false)
				if(fit[t2]<MaxRecordFit)
				{
					s=true;
					WriteResult(iter,t2);
				}
		}

		//上面已经把本次迭代中的最优蚂蚁与全局最优蚂蚁相比较
		//现在根据GLOBAL_UPDATE的值来决定全局更新规则用在那种蚂蚁上
		if(GLOBAL_UPDATE==1)
		{
			for (layer=0;layer<NLayers;layer++)   //in ACS, only the global best can be updated!!!???
			{
				ph[layer][globalbestant[layer]]=(1-Alpha)*ph[layer][globalbestant[layer]]+Alpha/globalbestfit;
			}
		}
		else
		{
			if(GLOBAL_UPDATE==2)
			{
				for( layer=0; layer<NLayers;layer++)
					ph[layer][ant[t2][layer]]=(1-Alpha)*ph[layer][ant[t2][layer]]+Alpha/fit[t2];
			}
		}
		if(bWriteResult==true && bWriteAllData==true)
		{
			WriteResult2(t2);	//将当前iteration中最好的蚂蚁的函数值记录到文件中
		}
	}
	time( &endtime );   // Get time in seconds
	if(bWriteResult==true && bWriteAllData==false)
		fprintf(fout,"|**************************** used time = %fsec ****************************|\n",difftime(endtime,starttime));
	if(s==true)
		NRecordedResults++;
}

void CAcs4Fun::calcfit()
{
	int i;

	decode();
	xtrans();
	for(i=0;i<NAnts;i++)
		y[i]=f(x_real[i]);
	ytrans();
}

void CAcs4Fun::decode()
{
	int i,j;
	for (i=0;i<NAnts;i++)
		for (j=0;j<NVariants;j++)
			x[i][j]=decode(ant[i],pointpos,j*NLayers/NVariants,(j+1)*NLayers/NVariants-1);
}

double CAcs4Fun::decode(int xx[],int pointpos,int startpos, int endpos)
{
	int i;
	double t=0;
	for (i=startpos;i<endpos+1;i++)
		t+=xx[i]*pow((double)Radix,(double)pointpos-i+startpos-1);
	return t;
}

void CAcs4Fun::xtrans()
{
	int i,j;
	double k=(xmax_t-xmin_t)/(xmax-xmin);

	for (i=0;i<NAnts;i++)
		for (j=0;j<NVariants;j++)
			x_real[i][j]=(x[i][j]-xmin)*k+xmin_t;
}

void CAcs4Fun::ytrans()
{
	int i;
	double k=(ymax_t-ymin_t)/(ymax-ymin);

	for (i=0;i<NAnts;i++)
		fit[i]=(y[i]-ymin)*k+ymin_t;
}

void CAcs4Fun::setfun(int n)
{
	xmin=0;xmax=1;
	ymin=0;ymax=1;
	ymin_t=0;ymax_t=1;		// y 默认不做变换
	MaxRecordFit=0;
	switch(n)
	{
	case 1:
		NVariants=30;
		xmin_t=-5;xmax_t=5;
		ymin_t=1;ymax_t=2;		//fit=y+1
		MaxRecordFit=1.0001;
		break;
	case 5:
		NVariants=5;
		xmin_t=-5;xmax_t=10;
		ymin_t=1;ymax_t=2;		//fit=y+1
		MaxRecordFit=1.0001;
		break;
	case 9:
		NVariants=10;
		xmin_t=-5;xmax_t=5;
		ymin_t=0;ymax_t=2;
		MaxRecordFit=1.0001;
		break;
	case 10:
		NVariants=2;
		xmin_t=-10;xmax_t=10;
		ymin_t=1;ymax_t=2;			//fit=y+1
		MaxRecordFit=1.0001;
		break;
	case 11:
		NVariants=2;
		xmin_t=-5;xmax_t=5;
		ymin_t=1;ymax_t=2;		//fit=y+1
		MaxRecordFit=1.0001;
		break;
	case 16:
		NVariants=2;
		xmin_t=-3;xmax_t=3;
		ymin_t=2;ymax_t=3;		//fit=y+2
		MaxRecordFit=0.968472;
		break;
	case 18:
		NVariants=2;
		xmin_t=-2;xmax_t=2;
		ymin_t=0;ymax_t=1;		//fit=y
		MaxRecordFit=3.0001;
		break;
	case 22:
		NVariants=2;
		xmin_t=-100;xmax_t=100;
		ymin_t=1;ymax_t=2;		//fit=y+2
		MaxRecordFit=1.0001;
		break;
	case 23:
		NVariants=1;
		xmin_t=0;xmax_t=1;
		ymin_t=1;ymax_t=0;		//fit=1-y
		MaxRecordFit=0.851;
		break;
	case 24:
		NVariants=2;
		xmin_t=-2;xmax_t=2;
		ymin_t=0;ymax_t=1;
		break;
	case 25:
		NVariants=2;
		xmin_t=-100;xmax_t=100;
		ymin_t=1;ymax_t=2;		//fit=1+y
		MaxRecordFit=1.0001;
		break;
	case 26:
		NVariants=2;
		xmin_t=-20;xmax_t=20;
		ymin_t=1;ymax_t=2;		//fit=1+y
		MaxRecordFit=1.0001;
		break;
	case 27:
		NVariants=100;
		xmin_t=-3;xmax_t=3;
		//ymin_t=100000;ymax_t=99999;		//fit=y
		ymin_t=1;ymax_t=2;
		break;
	case 28:
		NVariants=100;
		xmin_t=-3;xmax_t=3;
		ymin_t=0;ymax_t=1;
		break;
	case 29:
		NVariants=2;
		xmin_t=-4;xmax_t=4;
		ymin_t=9;ymax_t=8;		//fit=9-y
		break;
	}

}

double CAcs4Fun::f(double xx[])
{
	switch(NoFun)
	{
	case 1: return SphereModel(xx);			break;
	case 2: return Schwefel2_22(xx);		break;
	case 3: return Schwefel1_2(xx);			break;
	case 4: return Schwefel2_21(xx);		break;
	case 5: return Rosenbrock(xx);			break;
	case 6: return Step(xx);				break;
	case 7: return QuarticNoise(xx);		break;
	case 8: return Schwefel2_26(xx);		break;
	case 9: return Rastrigin(xx);			break;
	case 10: return Ackley(xx);				break;
	case 11: return Griewank(xx);			break;	//这个与CIAC那篇论文里面的有点不同,有一个+0.1取倒数关系
	case 12: return Penalized(xx);			break;
	case 13: return Penalized2(xx);			break;
	case 14: return Foxholes(xx);			break;
	case 15: return Kowalik(xx);			break;
	case 16: return SixHumpCamelBack(xx);	break;
	case 17: return Branin(xx);				break;
	case 18: return GoldsteinPrice(xx);		break;
	case 19: return Hartman(xx);			break;
	case 20: return Hartman2(xx);			break;
	case 21: return Shekel(xx);				break;
	case 22: return Schaffer(xx);			break;
	case 23: return F_1(xx);				break;
	case 24: return function_test(xx);		break;
	case 25: return B2(xx);					break;
	case 26: return MartinGaddy(xx);		break;
	case 27: return BalujaF3(xx);			break;
	case 28: return BalujaF1(xx);			break;
	case 29: return peeks(xx);				break;
	default: return 0;
	}
}

double CAcs4Fun::SphereModel(double xx[])
{
	double t=0;
	int i;
	for (i=0;i<NVariants;i++)
	{
		t+=(xx[i])*(xx[i]);
	//	t+=fabs(xx[i]-0.01*i);
	}
	return t;

}

double CAcs4Fun::Schwefel2_22(double xx[])
{
	return 0;
}

double CAcs4Fun::Schwefel1_2(double xx[])
{
	return 0;
}

double CAcs4Fun::Schwefel2_21(double xx[])
{
	return 0;
}

double CAcs4Fun::Rosenbrock(double xx[])
{
	double t=0;
	int i;
	for (i=1;i<NVariants;i++)
		t+=(100*(xx[i]-xx[i-1]*xx[i-1])*(xx[i]-xx[i-1]*xx[i-1])+(1-xx[i-1])*(1-xx[i-1]));
	return t;
}

double CAcs4Fun::Step(double xx[])
{
	return 0;
}

double CAcs4Fun::QuarticNoise(double xx[])
{
	return 0;
}

double CAcs4Fun::Schwefel2_26(double xx[])
{
	return 0;
}

double CAcs4Fun::Rastrigin(double xx[])
{
	int i;
	double t=0.0;

	for (i=0;i<NVariants;i++)
	{
		t=t+xx[i]*xx[i]-10*cos(2*PI*xx[i]);
	}
	return t+10*NVariants;
}

double CAcs4Fun::Ackley(double xx[])
{
	int i;
	double t1=0,t2=0;
	for (i=0;i<NVariants;i++)
	{
		t1+=xx[i]*xx[i]/NVariants;
		t2+=cos(2*PI*xx[i])/NVariants;
	}
	return -20*exp(-0.2*sqrt(t1))-exp(t2)+20+2.71828;
}

double CAcs4Fun::Griewank(double xx[])
{
	int i;
	double t1=0,t2=1;
	for (i=0;i<NVariants;i++)
	{
		t1+=1.0/4000.0*xx[i]*xx[i];
		t2*=cos(xx[i]/sqrt((double)i+1));
	}
	return t1-t2+1;
}

double CAcs4Fun::Penalized(double xx[])
{
	return 0;
}

double CAcs4Fun::Penalized2(double xx[])
{
	return 0;
}

double CAcs4Fun::Foxholes(double xx[])
{
	return 0;
}

double CAcs4Fun::Kowalik(double xx[])
{
	return 0;
}

double CAcs4Fun::SixHumpCamelBack(double xx[])
{
	return 4*xx[0]*xx[0]-2.1*pow(xx[0],4)+pow(xx[0],6)/3+xx[0]*xx[1]-4*xx[1]*xx[1]+4*pow(xx[1],4);
}

double CAcs4Fun::Branin(double xx[])
{
	return 0;
}

double CAcs4Fun::GoldsteinPrice(double xx[])
{
	return (1+pow(xx[0]+xx[1]+1,2)*(19-14*xx[0]+3*xx[0]*xx[0]-14*xx[1]+6*xx[0]*xx[1]+3*xx[1]*xx[1]))*(30+pow(2*xx[0]-3*xx[1],2)*(18-32*xx[0]+12*xx[0]*xx[0]+48*xx[1]-36*xx[0]*xx[1]+27*xx[1]*xx[1]));
}

double CAcs4Fun::Hartman(double xx[])
{
	return 0;
}

double CAcs4Fun::Hartman2(double xx[])
{
	return 0;
}

double CAcs4Fun::Shekel(double xx[])
{
	return 0;
}

double CAcs4Fun::Schaffer(double xx[])
{
	return (pow(sin(sqrt(xx[0]*xx[0]+xx[1]*xx[1])),2)-0.5)/pow(1+0.001*(xx[0]*xx[0]+xx[1]*xx[1]),2)+0.5;
}

double CAcs4Fun::F_1(double xx[])
{
	return fabs((1-xx[0])*xx[0]*xx[0]*sin(200*PI*xx[0]));
}

double CAcs4Fun::function_test(double xx[])
{
	return 100*(xx[0]*xx[0]-xx[1])*(xx[0]*xx[0]-xx[1])+(1-xx[0])*(1-xx[0]);
}

void CAcs4Fun::WriteResult(int iter, int antNo)
{
	int i;
	fprintf(fout,"Iter = %d, Best Y = %f,\tX=[",iter,y[antNo]);
//	fprintf(fout,"Fit =%f,\t",fit[antNo]);
	for (i=0;i<NVariants-1;i++)
	{
		fprintf(fout,"%lf,\t",x_real[antNo][i]);
	}
	fprintf(fout,"%lf",x_real[antNo][i]);
	fprintf(fout,"]\n");
}

double CAcs4Fun::B2(double xx[])
{
	return xx[0]*xx[0]+2*xx[1]*xx[1]-0.3*cos(3*PI*xx[0])-0.4*cos(4*PI*xx[1])+0.7;
}

double CAcs4Fun::MartinGaddy(double xx[])
{
	return (xx[0]-xx[1])*(xx[0]-xx[1])+pow((xx[0]+xx[1]-10)/3,2);
}

double CAcs4Fun::BalujaF3(double xx[])
{
	int i;
	double t=0;
	for (i=0;i<NVariants;i++)
		t+=fabs(0.024*(i+2)-xx[i]);
	//return 1/(t+0.00001);
	return t;
}

double CAcs4Fun::BalujaF1(double xx[])
{
	int i;
	double t1,t=0;
	t1=xx[0];
	t=fabs(xx[0])*2;
	for (i=1;i<NVariants;i++)
	{
		t+=fabs(xx[i]-t1);
		t1=xx[i]+t1;
	}
	return t;
}

double CAcs4Fun::peeks(double xx[])
{
	return 3*(1-xx[0])*(1-xx[0])*exp(-xx[0]*xx[0]-(xx[1]+1)*(xx[1]+1)-10*(xx[0]/5-pow(xx[0],3)-pow(xx[1],5)))-10*(xx[0]/5-pow(xx[0],3)-pow(xx[1],5))*exp(-xx[0]*xx[0]-xx[1]*xx[1])-1/3*exp(-pow(xx[0]+1,2)-xx[1]*xx[1]);

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -