关于tsp问题的动态规划求解的matlab实现

声明

笔者另外加一句话哈,如果有笔者表述不清或写不清楚的地方,欢迎读者来联系和讨论,大家一起进步。
这篇文章的代码是笔者自己用动态规划的思想用matlab实现的,里面的用到了矩阵运算和matlab内置函数的使用,相比c写起来代码少了很多,数学好的看起来应该更加简单易懂。
但是是根据一位大牛的文章写的,这里附上他文章的网址。如果大家想看更详细的分析,可以去他的网站上看。
https://blog.csdn.net/joekwok/article/details/4749713
在这里插入图片描述
话不多说看文章!

题目

TSP问题(旅行商问题)是指旅行家要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的路程最短。
在这里插入图片描述

  • 5
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
TSP问题是指旅行商问题,即给定一组城市和每对城市之间的距离,求解访问每一座城市一次并返回起始城市的最短路径。 动态规划法可以用来解决TSP问题,其主要思路是将问题分解为子问题,并将子问题的解合并起来得到原问题的解。具体来说,可以采用以下步骤: 1. 状态定义:定义状态f[S][i]表示从起点出发,经过集合S中的所有点,最终到达点i的最短路径长度。 2. 状态转移:对于集合S中的每个点j,都可以从集合S-j中的某个点k转移而来,即f[S][i] = min{f[S-j][k] + dis[k][i]},其中dis[k][i]表示点k到点i的距离。 3. 边界条件:当集合S中只有一个点时,f[S][i] = dis[0][i],其中0表示起点。 4. 最终结果:最终结果为f[2^n-1][0],其中n为城市的数量。 下面是一个使用动态规划法解决TSP问题的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 15 #define INF 0x3f3f3f3f int n, m; int dis[MAXN][MAXN]; int f[1 << MAXN][MAXN]; int tsp() { memset(f, INF, sizeof(f)); f[1][0] = 0; for (int S = 1; S < (1 << n); ++S) { if ((S & 1) == 0) continue; for (int i = 0; i < n; ++i) { if ((S >> i) & 1) { for (int j = 0; j < n; ++j) { if ((S ^ (1 << i)) == (1 << j)) { f[S][i] = dis[0][i]; } else if ((S >> j) & 1) { f[S][i] = f[S][i] < f[S ^ (1 << i)][j] + dis[j][i] ? f[S][i] : f[S ^ (1 << i)][j] + dis[j][i]; } } } } } return f[(1 << n) - 1][0]; } int main() { scanf("%d %d", &n, &m); memset(dis, INF, sizeof(dis)); for (int i = 0; i < m; ++i) { int a, b, c; scanf("%d %d %d", &a, &b, &c); dis[a][b] = dis[b][a] = c; } int ans = tsp(); printf("%d\n", ans); return 0; } ``` 其中,dis数组存储了每对城市之间的距离,f数组用于记录状态,tsp函数返回最短路径长度。在主函数中,先读入城市数量和距离信息,然后调用tsp函数计算最短路径长度,并输出结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原创小白变怪兽

帮助原创小白成为怪兽吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值