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

📄 禁忌搜索.cpp

📁 该软件是有关禁忌搜索的程序
💻 CPP
字号:
#include <iostream.h>
#include <math.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#define  N      5
#define  PI     3.1415926
#define  MH     24   //MMAX**(0.5)+3
#define  NH     7
#define  MMAX   500
#define  LMAX   1000
#define  LMAX1  500
#define  LMAX2  500
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 a;
	a=((rand()%10000)/10000.0)*(2.12+2.12)-2.12 ;
	return a;
}
double fx_value(double x[N])
{
	int i;
	double sum=0,value;
	for(i=0;i<N;i++)
	{
		sum=sum+x[i]*x[i]-2*cos(2*PI*x[i]);
	}
	value=2*N+sum;
	return value;
}
double fx_matrix(double xii[N],double xjj[N])
{
	int i;
	double fvalue;
    for(i=0;i<N;i++)
	{
		xjj[i]=xii[i]+2*(randnum()-0.5);//在较大的范围内搜索
		if(xjj[i]>2.12||xjj[i]<-2.12)    
		{
 //           xjj[i]=xii[i];     //当产生的邻域值超过可行解
			xjj[i]=randnum1();
		}                    //范围时令其不变
	}
    fvalue=fx_value(xjj);
	return fvalue;
}
double fx_m(double xii[N],double xjj[N])
{
	int i;
	double fvalue;
    for(i=0;i<N;i++)
	{
		xjj[i]=xii[i]+0.4*(randnum()-0.5);//在较大的范围内搜索
		if(xjj[i]>2.12||xjj[i]<-2.12)    
		{
            xjj[i]=xii[i];     //当产生的邻域值超过可行解
		}                    //范围时令其不变
	}
    fvalue=fx_value(xjj);
	return fvalue;
}
double fx_m2(double xii[N],double xjj[N])
{
	int i;
	double fvalue;
    for(i=0;i<N;i++)
	{
		xjj[i]=xii[i]+0.04*(randnum()-0.5);//在较大的范围内搜索
		if(xjj[i]>2.12||xjj[i]<-2.12)    
		{
            xjj[i]=xii[i];     //当产生的邻域值超过可行解
		}                    //范围时令其不变
	}
    fvalue=fx_value(xjj);
	return fvalue;
}
void initialnum(double a[MH][NH])
{
	int i,j;
	for(i=0;i<MH;i++)
	{
		for(j=0;j<NH-2;j++)
		{
			a[i][j]=0;
		}
		a[i][NH-2]=40;
		a[i][NH-1]=0;
	}
}
void h_matrix(double a[MH][NH],double b[N],double fbesttt)
{
	int m,n;
	for(m=0;m<MH;m++)
		{
			if(a[m][NH-1]==0)
			{
				for(n=0;n<N;n++)
				{
					a[m][n]=b[n];
				}
				a[m][N]=fbesttt;
				a[m][N+1]=24;
				break;
			}
		}
		for(m=0;m<MH;m++)
		{
			if(a[m][NH-1]>0)
			{
				a[m][NH-1]=a[m][NH-1]-1;
			}
		}
}
void h_view(double a[MH][NH])
{
	int i,j;
	for(i=0;i<MH;i++)
	{
		for(j=0;j<NH;j++)
		{
			cout<<a[i][j]<<"  ";
		}
		cout<<endl;
	}
}
void best_view(double a[N],double b)
{
	int i;
	cout<<"    "<<b<<endl;
	for(i=0;i<N;i++)
	{
		cout<<a[i]<<"   ";
	}
	cout<<endl<<endl;
}
void main()
{
	int i,j,k,l,m,n,hi=0;
	double xi[N],xj[N],h[MH][NH],fbest,fvalue,fx;	
	double xbest[N],fmin=40,xmin[N],hfmin=40;
	InitialRand();
	initialnum(h);
	for(i=0;i<N;i++)
	{
		xi[i]=randnum1();
		xbest[i]=xi[i];	
	}
	fbest=fx_value(xbest);
    for(l=0;l<LMAX;l++)
	{
		for(j=0;j<MMAX;j++)
		{
			fx=fx_matrix(xbest,xj);
			if(fx<fmin)
			{
				fmin=fx;
				for(k=0;k<N;k++)
				{
					xmin[k]=xj[k];
				}
			}
		}
		for(k=0;k<MH;k++)
		{
			if(h[k][NH-2]<hfmin)
			{
				hfmin=h[k][NH-2];
				   hi=k;
			}
		}
		if(fmin<hfmin)
		{
			fbest=fmin;
			for(k=0;k<N;k++)
			{
				xbest[k]=xmin[k];
			}
		}
		if(fmin>=hfmin)
		{
			fbest=hfmin;
			for(k=0;k<N;k++)
			{
				xbest[k]=h[hi][k];
			}
		}
		h_matrix(h,xbest,fbest);		
	}
	cout<<endl<<"粗粒度寻找结果,H矩阵:"<<endl;
	h_view(h);
	cout<<"粗粒度寻找结果,最好值:"<<endl;
    best_view(xbest,fbest);
///////////////////////////////////////////
//////////////////////////////////////////
	for(l=0;l<LMAX1;l++)
	{
		for(j=0;j<MMAX;j++)
		{
			fx=fx_m(xbest,xj);
			if(fx<fmin)
			{
				fmin=fx;
				for(k=0;k<N;k++)
				{
					xmin[k]=xj[k];
				}
			}
		}
		for(k=0;k<MH;k++)
		{
			if(h[k][NH-2]<hfmin)
			{
				hfmin=h[k][NH-2];
				   hi=k;
			}
		}
		if(fmin<hfmin)
		{
			fbest=fmin;
			for(k=0;k<N;k++)
			{
				xbest[k]=xmin[k];
			}
		}
		if(fmin>=hfmin)
		{
			fbest=hfmin;
			for(k=0;k<N;k++)
			{
				xbest[k]=h[hi][k];
			}
		}		
		h_matrix(h,xbest,fbest);		
	}
	cout<<endl<<"中粒度寻找结果,H矩阵:"<<endl;
	h_view(h);
	cout<<"中粒度寻找结果,最好值:"<<endl;
    best_view(xbest,fbest);
////////////////////////////////////
///////////////////////////////
    	for(l=0;l<LMAX2;l++)
	{
		for(j=0;j<MMAX;j++)
		{
			fx=fx_m2(xbest,xj);
			if(fx<fmin)
			{
				fmin=fx;
				for(k=0;k<N;k++)
				{
					xmin[k]=xj[k];
				}
			}
		}
		for(k=0;k<MH;k++)
		{
			if(h[k][NH-2]<hfmin)
			{
				hfmin=h[k][NH-2];
				   hi=k;
			}
		}
		if(fmin<hfmin)
		{
			fbest=fmin;
			for(k=0;k<N;k++)
			{
				xbest[k]=xmin[k];
			}
		}
		if(fmin>=hfmin)
		{
			fbest=hfmin;
			for(k=0;k<N;k++)
			{
				xbest[k]=h[hi][k];
			}
		}		
		h_matrix(h,xbest,fbest);		
	}
	cout<<endl<<"细粒度寻找结果,H矩阵:"<<endl;
	h_view(h);
	cout<<"细粒度寻找结果,最优值:"<<endl;
	best_view(xbest,fbest);
}

⌨️ 快捷键说明

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