#include<iostream>
#include<cmath>
#include <ctime>
#include<vector>
#include<stack>
#include<iomanip>
using namespace std;
#define INF 0x7fffffff
struct point
{
int x,y;
}p[40];
int n; //TSP点数
double d[40][40]; //点的距离
double Min; //最优解
double cur; //当前值
int path[40]; //结果路径
int a[40]; //过程路径
//////////////////////////////////////////////////
//随机生成TSP的点并求出之间的距离
void init()
{
srand(time(NULL));
memset(d,0,sizeof(d));
int i,j;
int x,y;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
d[i][j] = INF;
a[i] = i;
}
Min = INF;
cur = 0.0;
i = 1;
while(1)
{
if( i == n+1 ) break;
x = rand()%500;
y = rand()%500;
int flag = 0;
for( j = 1 ; j < i ; j++)
{
if( x == p[j].x || y == p[j].y )
{
flag = 1;
break;
}
}
if( flag == 0 )
{
p[i].x = x;
p[i].y = y;
i++;
}
}
for( i = 1; i <= n; i++ )
{
for(j = 1; j <= n; j++ )
{
d[i][j] = sqrt( (p[i].x-p[j].x)*(p[i].x-p[j].x) + (p[i].y-p[j].y)*(p[i].y-p[j].y) );
}
}
}
////////////////////////////////////////////////////
//回溯法搜索TSP路径和最优值
void dfs(int i)
{
if( i == n ) //找到最优路径
{
if( d[a[n-1]][a[n]] != INT_MAX && d[a[n]][1] != INT_MAX &&
( cur + d[a[n-1]][a[n]] +d[a[n]][1] < Min || Min == INF ) )
{
for( int k = 1; k <= n; k++ ) //存储最优路径
path[k] = a[k];
Min = cur + d[a[n-1]][a[n]] +d[a[n]][1];
}
}
else
{
for( int j = i; j <= n; j++) //寻求路径子树
{
if( d[a[i-1]][a[j]] != INT_MAX && ( cur + d[a[i-1]][a[j]] < Min || Min == INF ) )
{
swap(a[i],a[j]);
cur = cur + d[a[i-1]][a[i]];
dfs(i+1);
cur = cur - d[a[i-1]][a[i]];
swap(a[i],a[j]);
}
}
}
}
int main()
{
int i,j;
int chioce;
cout<<" 回溯法求解TSP问题 "<<endl;
while( 1 )
{
cout<<" 1.回溯法求解TSP "<<endl;
cout<<" 2.退出程序 "<<endl;
cin>>chioce;
if( chioce == 1)
{
cout << "请输入TSP的点数 " << endl;
cin>>n;
cout<<endl;
init();
cout<<"路线矩阵:"<<endl;
for( i = 1; i <= n; i++ )
{
for(j = 1; j <= n; j++ )
{
printf("%.0lf\t",d[i][j]);
}
cout << endl;
}
dfs(2); //回溯搜索
path[n+1] = 1;
printf("长度: %lf\n路径:", Min);
for( i = 1 ; i <= n+1 ; i++ )
cout << path[i] << " ";
cout<<endl;
}
else
break;
}
return 0;
}
#include<cmath>
#include <ctime>
#include<vector>
#include<stack>
#include<iomanip>
using namespace std;
#define INF 0x7fffffff
struct point
{
int x,y;
}p[40];
int n; //TSP点数
double d[40][40]; //点的距离
double Min; //最优解
double cur; //当前值
int path[40]; //结果路径
int a[40]; //过程路径
//////////////////////////////////////////////////
//随机生成TSP的点并求出之间的距离
void init()
{
srand(time(NULL));
memset(d,0,sizeof(d));
int i,j;
int x,y;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
d[i][j] = INF;
a[i] = i;
}
Min = INF;
cur = 0.0;
i = 1;
while(1)
{
if( i == n+1 ) break;
x = rand()%500;
y = rand()%500;
int flag = 0;
for( j = 1 ; j < i ; j++)
{
if( x == p[j].x || y == p[j].y )
{
flag = 1;
break;
}
}
if( flag == 0 )
{
p[i].x = x;
p[i].y = y;
i++;
}
}
for( i = 1; i <= n; i++ )
{
for(j = 1; j <= n; j++ )
{
d[i][j] = sqrt( (p[i].x-p[j].x)*(p[i].x-p[j].x) + (p[i].y-p[j].y)*(p[i].y-p[j].y) );
}
}
}
////////////////////////////////////////////////////
//回溯法搜索TSP路径和最优值
void dfs(int i)
{
if( i == n ) //找到最优路径
{
if( d[a[n-1]][a[n]] != INT_MAX && d[a[n]][1] != INT_MAX &&
( cur + d[a[n-1]][a[n]] +d[a[n]][1] < Min || Min == INF ) )
{
for( int k = 1; k <= n; k++ ) //存储最优路径
path[k] = a[k];
Min = cur + d[a[n-1]][a[n]] +d[a[n]][1];
}
}
else
{
for( int j = i; j <= n; j++) //寻求路径子树
{
if( d[a[i-1]][a[j]] != INT_MAX && ( cur + d[a[i-1]][a[j]] < Min || Min == INF ) )
{
swap(a[i],a[j]);
cur = cur + d[a[i-1]][a[i]];
dfs(i+1);
cur = cur - d[a[i-1]][a[i]];
swap(a[i],a[j]);
}
}
}
}
int main()
{
int i,j;
int chioce;
cout<<" 回溯法求解TSP问题 "<<endl;
while( 1 )
{
cout<<" 1.回溯法求解TSP "<<endl;
cout<<" 2.退出程序 "<<endl;
cin>>chioce;
if( chioce == 1)
{
cout << "请输入TSP的点数 " << endl;
cin>>n;
cout<<endl;
init();
cout<<"路线矩阵:"<<endl;
for( i = 1; i <= n; i++ )
{
for(j = 1; j <= n; j++ )
{
printf("%.0lf\t",d[i][j]);
}
cout << endl;
}
dfs(2); //回溯搜索
path[n+1] = 1;
printf("长度: %lf\n路径:", Min);
for( i = 1 ; i <= n+1 ; i++ )
cout << path[i] << " ";
cout<<endl;
}
else
break;
}
return 0;
}