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

📄 tspgt.cpp

📁 TSPGT(lzybanben)是求解TSP问题是LZY版本
💻 CPP
字号:
// TSPGT.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdlib.h"
#include "time.h"
#include "math.h"
#define CITIES 51
#define CELLNUM 100
#define FILENAME "tsp30.txt"
void RanInit(unsigned int Seed);
double Random(double m_Start,double m_End);
int Random(int i,int j);
void RanInit();

int EvalNum =0;
class CCell
{
public:
	double Fitness;
    bool InverPos(int CityPos1,int CityPos2);
    int GetCityPos(int City);
    void Print();
    double Evaluate();
    bool ValidCell();
    CCell & operator=(CCell & m_1);
    CCell();
    int City[CITIES];
};
//CCell Best;
//void InitCell(int index);
double CityMatrix[CITIES][CITIES];
CCell CellSet[CELLNUM];
CCell TempCell;
void InitCityMatrix();
double zuobiao[CITIES][2];
void GetData();
//void InitCellSet();
//bool Inver(int index1,int index2);
//bool VerCell(int index1,int City1,int City2);
//int Evaluate (int index);
//void InverTemp(int City1Pos,int City2Pos);
//int EvaluateTemp ();
//void PrintTempCell();


//bool ValidTemp();
CCell Best;
int main(int argc, char* argv[])
{
    char tmpbuf[128];
    _strtime( tmpbuf );
    FILE *fp;
	fp= fopen("result.txt","w");
	if (fp==NULL)
    {
        printf("FILE OPEN ERROR\n");
        return 0;
    }
    RanInit();
	GetData();
    InitCityMatrix();  
    Best.Evaluate ();
    for (int kk=0;kk<CELLNUM;kk++)
        CellSet[kk].Evaluate();
    //    InitCellSet();
    int i=0;
	/*
	int Count = 0;
		double preBestF=Best.Fitness;*/
	
    while(EvalNum <1000000)
    {
            TempCell= CellSet[i];
            i++;
            if (i==CELLNUM) i=0;
            //REPEAT
            int C1Pos =Random(0,CITIES-1);
            int C1= TempCell.City[C1Pos];
            int C2;
            int C2Pos;
            while(1)
            {
                if (Random(0.0,1.0)<0.02 )
                {
                    C2 = Random(0,CITIES-1);
                    if (C1==C2){C2=(C2+1)%CITIES;};
                }
                else
                {
                    int P=Random(0,CELLNUM-1);
                    if (P==i)P=(P+1)%CELLNUM;
                    C1Pos= CellSet[P].GetCityPos(C1);
                    C2=CellSet[P].City[(C1Pos+1)%CITIES];
                }
                //判是否在其中
                // Get C1 Position
                C1Pos= TempCell.GetCityPos(C1);
                if ((TempCell.City [(C1Pos+1)%CITIES]==C2)||(TempCell.City [(C1Pos-1+CITIES)%CITIES]==C2))
                    break;
                else //对TempCell倒置
                {
                    C2Pos=TempCell.GetCityPos(C2);
                    TempCell.InverPos(C1Pos,C2Pos);
//                    if (!TempCell.ValidCell())
//                        printf("daozhi zuo!\n");
                }
                C1=C2;
				//把郭涛算法的一段向上移动.
				TempCell.Evaluate();
				if (TempCell.Fitness <CellSet[i].Fitness)
				{
					CellSet[i]=TempCell;
					//                printf("TEMP_________________\n");
					//                TempCell.Print();
					//                printf("Eval:%d\n",TempCell.Fitness);
				};
					
            }  
				//下面的位置是郭涛算法原来位置。
			TempCell.Evaluate();
			if (TempCell.Fitness <CellSet[i].Fitness)
			{
				CellSet[i]=TempCell;
				//                printf("TEMP_________________\n");
				//                TempCell.Print();
				//                printf("Eval:%d\n",TempCell.Fitness);
			};	
			if (TempCell.Fitness<Best.Fitness  )
			{
				Best =TempCell ;	
				printf("BEST***********************EvalNum:%d\n",EvalNum);
				Best.Print(); 
				printf("Eval:%.5f\n",Best.Fitness);
			}
		/*
			preBestF = Best.Fitness;
		            if (TempCell.Fitness<Best.Fitness  )
		            {
		                Best =TempCell ;	
		                printf("BEST***********************EvalNum:%d\n",EvalNum);
		                Best.Print(); 
		                printf("Eval:%.5f\n",Best.Fitness);
		            }
		            if(preBestF!=Best.Fitness)
					{
						Count = 0;
					}
					else
					{
		                Count++;
					}*/
		
  
    } 
	for(i=0;i<CITIES;i++)
	{
        fprintf(fp,"%d ",Best.City[i]);
	}
	fprintf(fp,"%.6f",Best.Evaluate());
	fprintf(fp,"\r\n");
	fclose(fp);
   printf( "BEGIN OS time:\t\t\t\t%s\n", tmpbuf );
    _strtime( tmpbuf );
    printf( "END OS time:\t\t\t\t%s\n", tmpbuf );

return 0;
}
/*
void InverTemp(int City1Pos,int City2Pos)
{
if ((City1Pos >CITIES-1)||(City1Pos >CITIES-1))
{
printf("CITYPOS ERROR!");
printf("CityPos1:%d,CITYPOS2:%d\n",City1Pos,City2Pos);
PrintTempCell();
}

  if (City1Pos<City2Pos)
  {
  City1Pos= City1Pos+1;
  while(1)
  {
  int kk=TempCell[City1Pos]; 
  TempCell[City1Pos]=TempCell[City2Pos];
  TempCell[City2Pos]=kk;
  if ((City2Pos-City1Pos)<=2) break;
  City1Pos=(City1Pos+1);
  City2Pos=(City2Pos-1);
  }
  }
  
    else if (City1Pos>City2Pos)
    {
    City1Pos= City1Pos-1;
    while(1)
    {
    int kk=TempCell[City1Pos]; 
    TempCell[City1Pos]=TempCell[City2Pos];
    TempCell[City2Pos]=kk;
    if ((City1Pos-City2Pos)<=2) break;
    City1Pos=(City1Pos-1);
    City2Pos=(City2Pos+1);
    }
    }    
    return;
    
}*/
/*void InitCell(int index)
{
int Temp[CITIES];
for (int i=0;i<CITIES;i++)
Temp[i]=i;
for (int j=0;j<CITIES;j++)
{
int RndNum =Random(0,CITIES-1);
int SelectedCity;
SelectedCity=-1;
while (SelectedCity==-1)
{
SelectedCity=Temp[RndNum%CITIES];
RndNum++;
}
Temp[(RndNum-1+CITIES)%CITIES]=-1;
CellSet[index][j]=SelectedCity;
TempCell[j]=SelectedCity;
}

}*/
/*void InitCellSet()
{
for (int i=0;i<CELLNUM;i++)
InitCell(i);

  }
  void PrintTempCell()
  {
  for (int k=0;k<CITIES;k++)
  {
  printf("TEMPGene%d:  %d\n",k,TempCell[k]);
  };
  printf("Eval:%d\n",EvaluateTemp());
  }
  bool ValidTemp()
  {
  int Temp[CITIES];
  for (int i=0;i<CITIES;i++)
  Temp[i]=i;
  for (i=0;i<CITIES;i++)
  {
  Temp[TempCell[i]]=-1;
  }
  for (i=0;i<CITIES;i++)
  if (Temp[i]!=-1)
  {
  printf("Temp Error\n");
  return false;
  }
  return true;
}*/

void InitCityMatrix()
{
   
    for(int i=0;i<CITIES;i++)
       for(int j=0;j<CITIES;j++)
        {
            CityMatrix[i][j]=sqrt((zuobiao[i][0]-zuobiao[j][0])*(zuobiao[i][0]-zuobiao[j][0])+
				(zuobiao[i][1]-zuobiao[j][1])*(zuobiao[i][1]-zuobiao[j][1]));
			CityMatrix[i][j]=(int)(CityMatrix[i][j]+0.5);
	   }
}

/*int Evaluate (int index)
{
int temp=0;
for(int i=0;i<CITIES;i++)
{
temp+=CityMatrix[CellSet[index][i]][CellSet[index][(i+1)%CITIES]];
}
return temp;
}

  int EvaluateTemp ()
  {
  int temp=0;
  for(int i=0;i<CITIES;i++)
  {
  temp+=CityMatrix[TempCell[i]][TempCell[(i+1)%CITIES]];
  }
  return temp;
  }
*/
#include "time.h"
void RanInit(unsigned int Seed)
{
    srand(Seed);
}
double Random(double m_Start,double m_End)
{
    if ((m_End - m_Start ) <0.00000000001)
        return 0.0;
    return (m_Start + (m_End - m_Start) * rand() /RAND_MAX);
    
}
int Random(int i,int j)
{
    return (i + rand() % (j -i+1));
}
void RanInit()
{
    srand(time(NULL));
}



/*
bool Inver(int index1,int index2)
{
int RndNum= Random(0,CITIES-1);
if(index1==index2)
{
int RndNum2= Random(0,CITIES-1);
if(RndNum==RndNum2)RndNum2++;
return VerCell(index1,RndNum,RndNum2);
}
int City2;
for (int i=0;i<CITIES;i++)
{
if (CellSet[index2][i]==RndNum)
{
City2=CellSet[index2][i+1];
break;
}
}
return VerCell(index1,RndNum,City2);
}

  bool VerCell(int index1,int City1,int City2)
  {
  for (int k=0;k<CITIES;k++)
  TempCell[k]=CellSet[index1][k];
  int i=0;
  int j=0;
  while (TempCell[i]!=City1) i++;
  while (TempCell[j]!=City1) j++;
  if((i==j+1)||(i=j-1)) return true;
  if (i>j)
  {
  i--;
  while(i-- > j++)
  {
  int kk=TempCell[i]; 
  TempCell[i]=TempCell[j];
  TempCell[j]=kk;
  }
  }
  if (i<j)
  {
  j--;
  while(i++ > j--)
  {
  int kk=TempCell[i]; 
  TempCell[i]=TempCell[j];
  TempCell[j]=kk;
  }
  }
  return false;
  }
*/

CCell::CCell()
{
    int Temp[CITIES];
    for (int i=0;i<CITIES;i++)
        Temp[i]=i;
    for (int j=0;j<CITIES;j++)
    {
        int RndNum =Random(0,CITIES-1);
        int SelectedCity;
        SelectedCity=-1;
        while (SelectedCity==-1)
        {
            SelectedCity=Temp[RndNum%CITIES];
            RndNum++;
        }
        Temp[(RndNum-1+CITIES)%CITIES]=-1;
        this->City[j]=SelectedCity;
    }
}

bool CCell::ValidCell()
{
    int Temp[CITIES];
    for (int i=0;i<CITIES;i++)
        Temp[i]=i;
    for (i=0;i<CITIES;i++)
    {
        Temp[City[i]]=-1;
    }
    for (i=0;i<CITIES;i++)
        if (Temp[i]!=-1)
        {
            printf("Temp Error\n");
            return false;
        };
        return true;
}

double CCell::Evaluate()
{
    EvalNum++;
    double temp=0;
    for(int i=0;i<CITIES;i++)
    {
        temp+=CityMatrix[City[i]][City[(i+1)%CITIES]];
    }
    Fitness= temp;
    return temp;
}

void CCell::Print()
{
    for (int k=0;k<CITIES;k++)
    {
        printf("Gene%d:  %d\n",k,this->City[k]);
    };
}

int CCell::GetCityPos(int mCity)
{
    for (int i=0;i<CITIES;i++)
    {
        if (this->City[i]==mCity) return i; 
    }
    printf("CITYPOS ERROR");
    return -1;
    //    ASSERT(FALSE);
}

bool CCell::InverPos(int CityPos1, int CityPos2)
{
/*    if ((City1Pos >CITIES-1)||(City1Pos >CITIES-1))
{
printf("CITYPOS ERROR!");
printf("CityPos1:%d,CITYPOS2:%d\n",City1Pos,City2Pos);
Print();
}
    */
    if (CityPos1<CityPos2)
    {
        CityPos1= CityPos1+1;
        while(1)
        {
            int kk=this->City[CityPos1]; 
            this->City[CityPos1]=this->City[CityPos2];
            this->City[CityPos2]=kk;
            if ((CityPos2-CityPos1)<=2) break;
            CityPos1=(CityPos1+1);
            CityPos2=(CityPos2-1);
        }
    }
    
    else if (CityPos1>CityPos2)
    {
        CityPos1= CityPos1-1;
        while(1)
        {
            int kk=this->City[CityPos1]; 
            this->City[CityPos1]=this->City[CityPos2];
            this->City[CityPos2]=kk;
            if ((CityPos1-CityPos2)<=2) break;
            CityPos1=(CityPos1-1);
            CityPos2=(CityPos2+1);
        }
    }    
    return true;
}

CCell & CCell::operator =(CCell &m_1)
{
    for (int i=0;i<CITIES;i++)
        this->City[i]= m_1.City[i];
    this->Fitness = m_1.Fitness ;
    return *this;
}

void GetData()
{
	double tt[10000];
	FILE *fp;
	fp= fopen(FILENAME,"rt");
	if (fp==NULL)
    {
        printf("FILE OPEN ERROR\n");
        return ;
    }
	char *FileContence=new char[100000];
	int i=0;
	char ch;
	while((ch=fgetc(fp))!=EOF)
	{
		FileContence[i++]=ch;
	}
	fclose(fp);
    int top=0;
	i=0;
	double a;
    ch=FileContence[top++];
    while (ch!='t')
	{   
		if (ch=='-')
		{
			ch=FileContence[top++];
			if (ch>='0' && ch<='9') 
			{
				a=ch-'0';
				ch=FileContence[top++];
				while (ch>='0' && ch<='9')
				{
					a=a*10+ch-'0';
					ch=FileContence[top++];
				}
				if (ch=='.')
				{
					int k=1;
					ch=FileContence[top++];
					while (ch>='0' && ch<='9')
					{
						a=a+(ch-'0')/(10.00*k); //有错误,无法得到小数
						k=k*10;
						ch=FileContence[top++];
					}
				}
				if (ch=='e' || ch=='E')
				{
					ch = FileContence[top++];
					if (ch =='-')
					{  
						ch = FileContence[top++];
						while (ch == '0')
						{
							ch = FileContence[top++];
						}
						if (ch>'0' && ch<='9')
						{
							int xh=ch-'0';
							while (xh>0)
							{
								a=a/10;
								xh--;
							}
						}
					}
					else
					{
						ch = FileContence[top++];
						while (ch == '0')
						{
							ch = FileContence[top++];
						}
						if (ch>'0' && ch<='9')
						{
							int xh=ch-'0';
							while (xh>0)
							{
								a=a*10;
								xh--;
							}
						}
						ch=FileContence[top++];
					}
				}
			}
			tt[i++]=-a;
		}
		else if  (ch!='-' && ch>='0' && ch<='9')
		{  
			if (ch>='0' && ch<='9') 
			{
				a=ch-'0';
				ch=FileContence[top++];
				while (ch>='0' && ch<='9')
				{
					a=a*10+ch-'0';
					ch=FileContence[top++];
				}
				if (ch=='.')
				{
					int k=1;
					ch=FileContence[top++];
					while (ch>='0' && ch<='9')
					{
						a=a+(ch-'0')/(10.0*k);
						k=k*10;
						ch=FileContence[top++];
					}
				}
				if (ch=='e' || ch=='E')
				{
					
					ch = FileContence[top++];
					if (ch =='-')
					{  
						ch = FileContence[top++];
						while (ch == '0')
						{
							ch = FileContence[top++];
						}
						if (ch>'0' && ch<='9')
						{
							int xh=ch-'0';
							while (xh>0)
							{
								a=a/10;
								xh--;
							}
						}
					}
					else
					{
                        ch = FileContence[top++];
						while (ch == '0')
						{
							ch = FileContence[top++];
						}
						if (ch>'0' && ch<='9')
						{
							int xh=ch-'0';
							while (xh>0)
							{
								a=a*10;
								xh--;
							}
						}
						ch=FileContence[top++];
					}
				}
				
			}
			tt[i++]=a;
		}
		else
		{
			ch=FileContence[top++];
		}
	}
    int k=0;
	for (int m=0;m<=(int(i/3)+1)-1;m++)  
	{
		k++;
		zuobiao[m][0]=tt[k++];
		zuobiao[m][1]=tt[k++];
		if (k>=i)
			break;
	}
	return ;	
}

⌨️ 快捷键说明

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