回溯法解TSP问题C++实现

#include <iostream>  

#include <climits>  

using namespace std;  

#define N 25  

int d[N][N];  

int x[N],best[N];  

int cc,n;  

int bestc=INT_MAX;  

int sum;  

 

void backtrack(int t)  

{                  

    if(t>n)  //到叶子节点

    {  

        if(d[x[n]][x[1]] > 0 && cc+d[x[n]][x[1]] < bestc || bestc==0)  //推销员到的最后一个城市与出发的城市之间有路径,且当前总距离比当前最优值小  

        {  

            bestc=cc+d[x[n]][x[1]];  

            sum++;

            for(int j=1; j<=n; j++)  

                best[j]=x[j];

            cout<<“更新最优解:”<<endl;

            for(int j=1; j<=n; j++)  

                cout<<best[j]<<” “;

            cout<<best[1];

            cout<<“距离为:”<<bestc<<endl;  

        }  

    }  

    else  

    {  

        for(int i=t;i<=n;i++)  //搜索扩展结点的左右分支,即所有与当前所在城市临近的城市

        {   

            if(d[x[t-1]][x[i]] > 0 && cc + d[x[t-1]][x[i]] < bestc || bestc==0)  //若果第t-1个城市与第t个城市之间有路径且可以得到更短的路线  

            {  

                swap(x[t],x[i]);  

                cc+=d[x[t-1]][x[t]];  

                cout<<“当前状态:”<<endl;

                for(int j=1; j<t; j++)  

                     cout<<x[j]<<” “;

                cout<<“距离为:”<<cc<<endl;

                backtrack(t+1);  

                cc-=d[x[t-1]][x[t]];  

                swap(x[t],x[i]);  

            }  

            else{

                swap(x[t],x[i]);  

                cc+=d[x[t-1]][x[t]];  

                cout<<“当前状态:”<<endl;

                for(int j=1; j<=t; j++)  

                    cout<<x[j]<<” “;

                cout<<“距离为:”<<cc<<“剪枝”<<endl;

                cc-=d[x[t-1]][x[t]];  

                swap(x[t],x[i]);  

            }

        }  

    }  

}  

 

int main()   

{  

    int i,j;  

    cout<<“输入节点数”<<“\n”;

    while(cin>>n)  

    {  

        sum=0;  

/*        FILE* f = fopen(“table.csv”,”r”);

        for(i=1;i<=n;i++)  {

            for(j=1;j<=n;j++)  

                fscanf(f,”%d,”,d[i][j]);

            fscanf(f,”\n”);

        }*/

        cout<<“输入邻接矩阵”<<“\n”;

        for(i=1;i<=n;i++)  

            for(j=1;j<=n;j++)  

                cin>>d[i][j];

        cout<<“\n从1出发”<<“\n”;

        for(i=1;i<=n;i++)  

            x[i]=i;  

        backtrack(2);

        cout<<“\n从2出发”<<“\n”<<“\n”;

        x[1]=2;x[2]=1;x[3]=3;x[4]=4;

        backtrack(2);

        cout<<“\n从3出发”<<“\n”<<“\n”;

        x[1]=3;x[2]=1;x[3]=2;x[4]=4;

        backtrack(2);

        cout<<“\n从4出发”<<“\n”<<“\n”;

        x[1]=4;x[2]=1;x[3]=2;x[4]=3;

        backtrack(2);

        if(sum==0)  

            cout<<“No Solution”<<endl;  

        else{  

            cout<<“\n最终最优解为:”<<endl;

            for(int j=1; j<=n; j++)  

                cout<<best[j]<<” “;

            cout<<best[1];

            cout<<“距离为:”<<bestc<<endl;  

        }

    }  

    return 0;  

}

    原文作者:回溯法
    原文地址: https://blog.csdn.net/l1140694748/article/details/80833280
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞