TSP问题的两种实现方式(贪心和动态规划)

本文探讨了旅行商问题(TSP),一个经典的计算机科学问题,目标是最小化遍历n个城市并返回起点的路径长度。虽然没有统一的最优解,但文章介绍了两种算法实现:贪心算法和动态规划。每种方法的注释详尽,能够得到各自算法下的最优解,但结果可能存在差异。
摘要由CSDN通过智能技术生成

题目
TSP问题(旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。
这个问题迄今为止各种算法只是求当前情况下的最优情况,无法得出统一的求解方式。
下面是两种不同的算法实现,注释部分给的很详细。

//动态规划和贪心法求解tsp问题
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;

#define inf 1000000
/*
    贪心法使用最近邻接点策略,来求解tsp问题。
    大致的思路是:
    P[]:存储所经历的点的一维数组,初始化为一个结点即结点0,P[i]=j代表第i步是经历第j个节点
    V[]:存储未经历的点的一维数组,初始化为除结点0外的全部结点,V[i]=i代表第i个节点,一旦某个节点被选进P,那么该节点的值设置为inf,即V[i]=inf
    path[]:存储路线的,初始化为inf,path[i]=j:第i步要走的路的长度是j
    邻接矩阵中两点之间没有路用路经长为inf表示
    1.确定好出发点
    2.把出发点作为第0个点,重新对邻接矩阵进行构造,构造成一个以出发点为第0个点的邻接矩阵
    3.设定当前走到的结点是p
    4.从V中遍历寻找一个最优的结点v,使得p和v的距离最近:这个判断要包括:p和v之间有路,而且dis(p,v)<=dis(p,x),x表示V中和v不同的任意一点
    5.P=P+v,V=V-v。path[i]=distance(p,v)
    6.如果V不空,则执行第3步;如果V空,则程序结束。返回结果即可
*/
//传入的参数中二维指针martix代表邻接矩阵,而num代表城市的数目
void greedPath(double martix[][5], int num){
   
    //首先是初始化工作
    double path[num]={
   0};
    int V[num]={
   0};
    for(int i=0;i<num;i++){
   
        if(i==0){
   
            V[i]=inf;
        }else
        {
   
            V[i]=i;
        }
    }
    int P[num]={
   0};
    //下面是主要代码部分
    /*
        要考虑P和V中的顶点怎么表示,每执行到第i步,当前的顶点p就用顶点P[i]表示,
        每执行到第i步,V中的顶点就要减少i个,但是我们不知道前i-1步从V中剔除的顶点是什么,所以每次遍历的时候就要
        再多一层遍历,遍历V数组,并进行判断:当前遍历到的该节点没有被剔除而且和p[i]之间有路可走而且这条路的长度是不是最小的
    */
   for(int i=0;i<num-1;i++){
   
       double min=inf;
       //从第1个顶点开始遍历判断
       for(int j=1;j<num;j++){
   
           //有路,而且没有被剔除
            if(martix[P[i]]
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值