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

📄 连续蚁群算法4.cpp

📁 该程序是有关蚁群算法多学科优化的程序
💻 CPP
字号:
#include <iostream.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>

#define  NCMAX   1000
#define  MAXANT  100
#define  N       20
#define  NGR     (MAXANT/5)
#define  PI      3.1415926
#define  A       1.0
#define  GAMA    0.01
#define  KESEI   0.8
#define  PGR     0.9
#define  PMR     0.5
#define  UP      5.12
#define  DOWN    -5.12

int fvalue_number=0;
int keisei_number=0;

void InitialRand()
{
	struct _timeb tstruct;
	_ftime(&tstruct);
	srand(tstruct.time);
}
double randnum()
{
    double g;
	g=((rand()%10000)/10000.0)*(1.0-0.0)+0.0 ;
	return g;
}
double randnum1()
{
	double g;
	g=((rand()%10000)/10000.0)*(UP-DOWN)+DOWN;
	return g;
}
double randnum2()
{
	double g;
	g=((rand()%10000)/10000.0)*(1.0+1.0)-1.0 ;
	return g;
}
double fant_value(double x[N])
{
	int i;
	double a,c,sum=0;
	a=N*A;
	for(i=0;i<N;i++)
	{
		sum=sum+x[i]*x[i]-A*cos(2*PI*x[i]);
	}
	c=sum+a;
	fvalue_number=fvalue_number+1;
	if(fmod(double(fvalue_number),1000.0)==0.0)
	{
		cout<<fvalue_number<<endl;
	}
	return c;
}
void local_serch(double a[MAXANT][N],double fa[MAXANT],double n,double t[MAXANT])
{
	int    i,j;
	double fc[MAXANT],c[MAXANT][N],rand1;
	for(i=0;i<MAXANT;i++)
	{
		if(keisei_number<15)
		{
			for(j=0;j<N;j++)
			{
                rand1=randnum();
				if(rand1<0.5)
				{
					c[i][j]=a[i][j]+randnum()*(UP-a[i][j])*pow((1-double(n)/double(NCMAX)),1.8);
				}
			    else
				{
					c[i][j]=a[i][j]-randnum()*(a[i][j]-DOWN)*pow((1-double(n)/double(NCMAX)),1.8);
				}				
/*			    if(c[i][j]>UP||c[i][j]<DOWN)
				{
					c[i][j]=a[i][j];
				}*/
			}
			fc[i]=fant_value(c[i]);
		    if(fc[i]<fa[i])
			{	
				t[i]=t[i]+GAMA*(fa[i]-fc[i]);
			    for(j=0;j<N;j++)
				{
					a[i][j]=c[i][j];
				}
			    fa[i]=fc[i];
			    keisei_number=0;
			}
		    else
			{
				keisei_number=keisei_number+1;
			}
		}
		else
		{
			for(j=0;j<N;j++)
			{
				a[i][j]=randnum1();
			}
            fa[i]=fant_value(a[i]);
			keisei_number=0;
		}
	}
}
void bad_order(double fa[MAXANT],int b[NGR])
{
	int i,j,ibad=0;
    double bad=fa[0];
	for(i=0;i<NGR;i++)
	{
		for(j=1;j<MAXANT;j++)
		{
			if(fa[j]>bad)
			{
				bad=fa[j];
                ibad=j;
			}
		}	
		b[i]=ibad;
//	    cout<<"  **"<<b[i]<<endl;
		fa[ibad]=-10;
		bad=-10;
	}	
}
void gr_operate(double a[MAXANT][N],double fa[MAXANT],double t[MAXANT],int b[NGR],int n)
{
	int i,j,k,ibest=0;
	double alfa,p;
	double best[N],fbest=fa[0],fb[MAXANT];
	double fvalue,rand1;
	for(i=0;i<N;i++)
	{
		best[i]=a[0][i];
	}
    for(i=1;i<MAXANT;i++)
	{
		if(fa[i]<fbest)
		{
			fbest=fa[i];
			ibest=i;
			for(j=0;j<N;j++)
			{
				best[j]=a[i][j];
			}
		}
	}
	for(i=0;i<MAXANT;i++)
	{
		fb[i]=fa[i];
	}
//	cout<<" ?? "<<fbest<<" ?? "<<ibest<<endl;
    bad_order(fb,b);
	for(i=0;i<NGR;i++)
	{
		p=randnum();
		alfa=randnum();
		k=b[i];
		if(p<PGR)
		{
			for(j=0;j<N;j++)
			{
				rand1=randnum();
				if(rand1<0.5)
				{
					a[k][j]=a[ibest][j]+randnum()*(UP-a[ibest][j])*pow((1-double(n)/double(NCMAX)),1.8);
				}
			    else
				{
					a[k][j]=a[ibest][j]-randnum()*(a[ibest][j]-DOWN)*pow((1-double(n)/double(NCMAX)),1.8);
				}
			
/*				if(a[k][j]>UP||a[k][j]<DOWN)
				{
					a[k][j]=a[ibest][j];
				}*/
			}
            fvalue=fa[k];
			fa[k]=fant_value(a[k]);
			t[k]=t[k]+GAMA*(fvalue-fa[k]);
		}
		else
		{
			for(j=0;j<N;j++)
			{
				a[k][j]=alfa*a[ibest][j]+(1-alfa)*a[k][j];
			}
			fvalue=fa[k];
			fa[k]=fant_value(a[k]);
			t[k]=t[k]+GAMA*(fvalue-fa[k]);
		}
	}
}
int select_xj(double t[MAXANT],int b[NGR])
{	
	int    i,j,k;
	double q[MAXANT],aaa=0,rand,p[MAXANT];
	double  ttt[MAXANT],sum=0;
	for(i=0;i<MAXANT;i++)
	{
		ttt[i]=t[i];
	}
    for(j=0;j<NGR;j++)
	{
        k=b[j];
		ttt[k]=0.0;		
	}
	for(i=0;i<MAXANT;i++)
	{
		sum=sum+ttt[i];
	}
	for(i=0;i<MAXANT;i++)
	{
		p[i]=ttt[i]/sum;
//		cout<<p[i]<<" ";
	}
	for(k=0;k<MAXANT;k++)
	{
		aaa=p[k]+aaa;
		q[k]=aaa;
//		cout<<q[k]<<" ";
	}
	rand=randnum();
//	cout<<endl<<rand<<endl;
	for(j=0;j<MAXANT;j++)
	{
		if(rand<=q[j])
		{
			return j;
			break;
		}
	}
}
void mr_operate(double a[MAXANT][N],double fa[MAXANT],double t[MAXANT],int b[NGR],int n)
{
	int i,j,k,m;
	int flag;
	double alfa,p,r;
	double fvalue,rand1;
	for(i=0;i<MAXANT;i++)
	{
		flag=0;
        for(k=0;k<NGR;k++)
		{
			if(i==b[k])
			{
				flag=1;
			}
		}
//		cout<<flag<<"  ";
		if(flag==0)
		{	
			p=randnum();	
			m=select_xj(t,b);
		    if(p<PMR)
			{
                for(j=0;j<N;j++)
				{
					rand1=randnum();
				    if(rand1<0.5)
					{
						a[i][j]=a[m][j]+randnum()*(UP-a[m][j])*pow((1-double(n)/double(NCMAX)),1.8);		
					}
				    else
					{
						a[i][j]=a[m][j]-randnum()*(a[m][j]-DOWN)*pow((1-double(n)/double(NCMAX)),1.8);
					}				
/*					if(a[i][j]>UP||a[i][j]<DOWN)
					{
						a[i][j]=a[m][j];
					}*/
				}
                fvalue=fa[i];
				fa[i]=fant_value(a[i]);
				t[i]=t[i]+GAMA*(fvalue-fa[i]);
			}
	        else
			{
				alfa=randnum();
                for(j=0;j<N;j++)
				{
					a[i][j]=alfa*a[m][j]+(1-alfa)*a[i][j];
				}
				fvalue=fa[i];
				fa[i]=fant_value(a[i]);
				t[i]=t[i]+GAMA*(fvalue-fa[i]);
			}
		}
	}
}
void diffuse_operate(double t[MAXANT])
{
	int i;
	for(i=0;i<MAXANT;i++)
	{
		t[i]=KESEI*t[i];
	}
}
double select_better(double a[MAXANT][N],double fa[MAXANT],double ant[N])
{
	int i=0,j;
	double fbest=fa[0];
	for(i=0;i<N;i++)
	{
		ant[i]=a[0][i];
	}
	for(i=1;i<MAXANT;i++)
	{
		if(fa[i]<fbest)
		{
			fbest=fa[i];
			for(j=0;j<N;j++)
			{
				ant[j]=a[i][j];
			}
		}
	}
	return fbest;
}
void main()
{
	int i,j,k,m;
	int bb[NGR];
	double ant[MAXANT][N],fant[MAXANT],tao[MAXANT];
	double pp[MAXANT];
	double better_ant[N],better_fant;
	double best_ant[N],best_fant=200,kfinal;
	InitialRand();

	for(i=0;i<MAXANT;i++)
	{
		for(j=0;j<N;j++)
		{
			ant[i][j]=randnum1();
		}
        fant[i]=fant_value(ant[i]);
        tao[i]=5;
	} 
	for(k=0;k<NCMAX;k++)
	{
		local_serch(ant,fant,k,tao);
        gr_operate(ant,fant,tao,bb,k);
        mr_operate(ant,fant,tao,bb,k);
		diffuse_operate(tao);
        better_fant=select_better(ant,fant,better_ant);
		if(better_fant<best_fant)
		{
			best_fant=better_fant;
			for(i=0;i<N;i++)
			{
				best_ant[i]=better_ant[i];
			}
			kfinal=k;
		}
	}
    //cout<<endl;
	cout<<best_fant<<"  "<<kfinal<<endl;
    for(i=0;i<N;i=i+5)
	{
		cout<<best_ant[i]<<"  "<<best_ant[i+1]<<"  "<<best_ant[i+2]<<"  "
			<<best_ant[i+3]<<"  "<<best_ant[i+4]<<endl;
	}
}

⌨️ 快捷键说明

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