TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题、货郎担问题。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
问题按贪心求解,每次选择都是局部最优解,最后得到的结果可以认为整体最优解(该处注意贪心使用的条件,可自行百度)。即从初始城市出发,选择与初始城市距离最近的城市为第一次要走的城市,第二次又选择与第一次走的城市距离最近的城市,依次类推,每次得到的都是局部最优解。
具体在下述代码中都有详细注释,直接可见代码。PS:新手请先按注释理解代码,再跟着例子走一遍代码过程基本上就能懂了。
#include<iostream>
#define n 4
using namespace std;
int main() {
int s[n];
int dis[n][n];
int Dtemp;
int sum, m, l, t, k, flag;
m = 1, s[0] = 0, sum = 0;
cout << "依次经过的城市是" << endl;
cout << 0 << " ";
dis[0][1] = 2;dis[0][2] = 6;dis[0][3] = 5;
dis[1][0] = 2;dis[1][2] = 4;dis[1][3] = 3;
dis[2][0] = 6;dis[2][1] = 4;dis[2][3] = 2;
dis[3][0] = 5;dis[3][1] = 3;dis[3][2] = 2;
do {
k = 1, Dtemp = 1000;
do {
t = 0, flag = 0;
do {
if (s[t] == k) {
flag = 1;
break;
}
else t++;
} while (t < m);
if (flag == 0 && dis[k][s[m - 1]] < Dtemp) {
l = k;
Dtemp = dis[k][s[m - 1]];
}
k++;
} while (k < n);
cout << l << " ";
s[m] = l;
m++;
sum += Dtemp;
} while (m < n);
sum += dis[0][l];
cout << "\n" << "最短距离为" << "\n" << sum << endl;
system("pause");
return 0;
}