贪心求解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;
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
贪心算法是一种算法策略,它在解决问题时总是做出在当前看来是最好的择。贪心算法不一定能得到整体最优解,但可以得到局部最优解。对于TSP问题(旅行商问题),贪心算法可以应用于求解思想。其基本思想是从某一个城市开始,每次择一个最近的城市,直到所有的城市都被走过一遍,并确保经过的路径总距离最短。这种贪心策略称为最近邻点策略。最近邻点策略的算法设计如下:从某城市出发,每次在未经过的城市中择最近的一个,直到经过了所有的城市,最后回到出发城市。这个算法的时间复杂度为O(n^2),因为每次择都需要查找满足贪心条件的最短边。然而,最近邻点策略无法保证得到最优解,尤其是当图中顶点较多且边的代价值分布不均匀时。在这种情况下,最近邻点策略只能给出较好的近似解,但无法保证近似程度。另一种贪心策略是最短链接策略。它的思想是在整个图的范围内择最短边加入解集合,同时要保证加入解集合的边最终形成一个哈密顿回路。最短链接策略的算法设计如下:每次从剩余边集合中择最短的边加入解集合,同时满足边是剩余边集合中代价最小的边、加入解集合后不产生回路和分枝。同样地,最短链接策略也不能保证得到最优解。因此,贪心算法可以用于求解TSP问题,但结果可能只是近似解,并不一定是最优解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [利用贪心算法求解TSP问题(C语言实现)](https://blog.csdn.net/mahoon411/article/details/105940729)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [数学建模贪心算法(贪婪算法)求解TSP问题(C语言程序源码亲测可行)](https://download.csdn.net/download/mahoon411/12393733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [用贪心法解决TSP问题](https://blog.csdn.net/wmy01234/article/details/106020551)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值