future

promise&&persist

博客园 首页 新随笔 联系 订阅 管理
#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 ) )
        {
            
forint k = 1; k <= n; k++ )  //存储最优路径
                path[k] = a[k];
            Min 
= cur + d[a[n-1]][a[n]] +d[a[n]][1];
        }
    }

    
else
    {
        
forint 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;
    
while1 )
    {
         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;
}

posted on 2009-06-28 18:36  future-lin  阅读(262)  评论(0编辑  收藏  举报