📄 禁忌搜索.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 + -