Written by Robert_Wang in Southwest University of Science And Technology.
TSP问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出。问题描述如下:
有若干个城市,任何两个城市之间的距离都是确定的,现要求一旅行商从某城市出发必须经过每一个城市且只在一个城市逗留一次,最后回到出发的城市,问如何事先确定一条最短的线路已保证其旅行的费用最少?
贪心算法:又称贪婪算法(greedy algorithm),该算法是指:在对问题求解时,总是做出当前情况下的最好选择,否则将来可能会后悔,故名“贪心”。这是一种算法策略,每次选择得到的都是局部最优解。选择的策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
针对TSP问题,使用贪心算法的求解的过程为:
1.从某一个城市开始,每次选择一个城市,直到所有的城市被走完。
2.每次在选择下一个城市的时候,只考虑当前情况,保证迄今为止经过的路径总距离最小。
#include<iostream>
using namespace std;
int main()
{
int i,j,k;
int n;
cin>>n;
int s[n];//记录遍历的顺序
int D[n][n];
for(i=0; i<n; i++){//输入两个城市之间的顺序
for(j=0; j<n; j++){
cin>>D[i][j];
}
}
int sum = 0;//记录距离
int Dtemp = 10000;
int l;
int flag = 0;
i = 1;
s[0] = 0;//代表第一个城市已经被访问
do{
k = 1;Dtemp = 10000;
do{
l = 0;flag = 0;
do{
if(s[l] == k){
flag = 1;
break;
}
else l++;
}while(l<i);
if(flag == 0 && D[k][s[i-1]] <Dtemp){
j = k;//保留距离i-1最短的城市
Dtemp = D[k][s[i-1]];//保留最短的距离
}
k++;
}while(k<n);
s[i] = j;//将访问的城市记录
cout<<Dtemp<<endl;
sum+=Dtemp;//距离累加
i++;
}while(i<n);
sum+=D[0][j];
cout<<D[0][j]<<endl;
cout<<"最短路径为:";
for(i=0; i<n; i++){
cout<<s[i]<<" ";
}
cout<<endl;
cout<<"最短距离为:"<<sum<<endl;
return 0;
}