贪心求解TSP问题

    ## 问题的描述 ##
    TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题、货郎担问题。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
    ## 算法的描述##
    问题按贪心求解,每次选择都是局部最优解,最后得到的结果可以认为整体最优解(该处注意贪心使用的条件,可自行百度)。即从初始城市出发,选择与初始城市距离最近的城市为第一次要走的城市,第二次又选择与第一次走的城市距离最近的城市,依次类推,每次得到的都是局部最优解。
    ## 算法的步骤 ##
    具体在下述代码中都有详细注释,直接可见代码。PS:新手请先按注释理解代码,再跟着例子走一遍代码过程基本上就能懂了。
/*
回到起点的TSP
N座城市,分别以0,1……N-1表示
贪心计算,每次取局部最优,最后得到结果可认为是整体最优
从起始城市0出发,第一次不计0,相当于选择只有城市1……N-1,共N-1种选择
*/
/*
该问题的距离也可键盘输入城市数量和各城市间的距离
*/
#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;  //sum最短距离和,m表示已走了几座城市,flag标志已走过的城市,1为走过,0未走过
    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; //将已访问过的城市存入s[n]中,即第m次走的城市s,m/s的取值都为1……N-1
        m++;
        sum += Dtemp; //最后一次之后只走完所有城市,还没有回到起点
    } while (m < n);
    sum += dis[0][l];
    cout << "\n" <<  "最短距离为" << "\n" << sum << endl;
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值