TSP 代码

来源:互联网 发布:linux top命令怎么用 编辑:程序博客网 时间:2023/09/28 02:28

#include <iostream.h>
#include <stdio.h>
#include <iomanip.h>

#define noedge  10000  //定义noedge大小

int n,   //顶点数
    *x,   //当前解
 *bestx,  //当前最优解
    **a,  //G的邻接矩阵
 bestc;  //当前最优值

void getdata()
{//从文件读取数据
 int i;
 FILE *fp;
 if ((fp=fopen("travel.txt","r"))==NULL)  
 {cout<<"Connot open the file"<<endl;
 return;
 }

    cout<<endl<<"图的邻接矩阵如下:"<<endl;
 fscanf(fp,"%d",&n);

 x=new int [n+1];  

 bestx=new int [n+1];
 a=new int* [n+1];
 bestc=noedge;
 for (i=1;i<=n;i++)
  a[i]=new int[n+1];

 for (i=1;i<=n;i++){
  for (int j=1;j<=n;j++){
   fscanf(fp,"%d",&a[i][j]);
      cout<<setw(5)<<a[i][j];    }
  cout<<endl;
 }
}

bool check(int i,int cc){
    for (int k=1;k<=i-1;k++)
  if ((x[i]==x[k]) || (a[x[i-1]][x[i]]==noedge)||(cc>bestc)) return false;  
    return true;
}

void traveling (int i,int cc){
 int k; 

if (i>n){

  cc+=a[x[n]][1];
  if (a[x[n]][1]!=noedge) {//输出一条回路
      for (k=1;k<=n;k++) cout<<setw(5)<<x[k];
   cout <<setw(5)<<x[1]<<setw(8)<<cc<<endl;
  }

  if (cc<bestc) {//保留当前最小代价和最短路线
   bestc=cc;
      for (k=1;k<=n;k++) bestx[k]=x[k];
   }
  }
 else
  for (int j=1;j<=n;j++){
     x[i]=j;
           if (check(i,cc)){
    cc+=a[x[i-1]][x[i]];
    traveling(i+1,cc);
    cc-=a[x[i-1]][x[i]];
     }
  }
}

void main(){
 getdata();//从文件读取信息

 for ( int i=1;i<=n;i++)  //设置初始路线(起点固定为1)
   bestx[i]=x[i]=i;    //bestx 当前最优解

 cout<<endl<<"可行的周游线路及其代价:"<<endl;

        traveling(2,0);   //从第2个城市开始探索每一条回路
 
 //输出佳回路及其代价
 cout<<endl<<"最佳旅行费用为: "<<bestc<<endl;
 cout<<endl<<"最佳旅行线路为:"<<endl;

    for (i=1;i<=n;i++) cout<<"    "<<bestx[i];
 cout<<"    "<<1<<endl;  //
}

建立一个text,txt文件,输入以下数据

4
 0  30  6  4
30   0  5 10
 6   5  0  20
 4  10  20 0