TSP(Traveling Salesman Problem)-----浅谈旅行商问题(动态规划,回溯实现)
1.什么是TSP问题
一个售货员必须访问n个城市,这n个城市是一个完全图,售货员需要恰好访问所有城市的一次,并且回到最终的城市。
城市于城市之间有一个旅行费用,售货员希望旅行费用之和最少。
完全图:完全图是一个简单的无向图,其中每对不同的顶点之间都恰连有一条边相连。

2.TSP问题前提
回朔法:把所有的解列出来,形成一棵树,利用剪枝深度优先进行遍历,遍历的过程记录和寻找最优解。(剪枝就是把一条再深搜下去也不是最优解的分支剪去)。
动态规划:把一个大问题拆分成小问题,把小问题的最优结果通过表保留,在新问题需要用到的时候可以直接获取。
PS:下面的图,文字中出现1,2,3,4分别表示城市1,城市2,城市3,城市4
3.回朔法实现TSP问题
上面提到回朔法就是把所有的解列出来,形成一棵树,上面的例子形成的树如下:我们假设城市1为起点

上面介绍回溯法就是把所有解列出来,然后剪枝深搜。那么我们需要解决的就是剪枝深搜了。剪枝深搜中最麻烦的就是找到何时剪枝的条件了。
首先我们假设不知道剪枝条件,先模拟深搜跑一遍。

从1深搜到4回到1,花费11,记录这个数值。接下来回溯,继续深搜。一步一步深搜的时候,遇到了一个特殊的时候:

还记得我们之前记录的最短花费为11吗,1->2->4->3 花费已经11了,3回到1,还需要进行花费,不管花费多少,反正已经比我之前找出来的要大了,那这个时候我再深搜下去就没什么意义了,所以可以进行剪枝。我不继续找了,直接回溯。
所以剪枝条件出来了: 走下一步的距离 + 之前已经走过的距离的总和 >之前算出的最短路径 。
4.动态规划实现TSP
上面介绍了动态规划就是把大问题分解成小问题。我们现在的大问题是从1 经过2,3,4 回到1花费最少,那么我们把他分解一下。
我们从1出发有三种方案



1、 从1出发,到2,然后再从2出发,经过[3,4]这几个城市,然后回到1,使得花费最少。
2、 从1出发,到3,然后再从3出发,经过[2,4]这几个城市,然后回到1,使得花费最少。
3、 从1出发,到4,然后再从4出发,经过[2,3]这几个城市,然后回到1,使得花费最少。
上面也提到了最优结果通过表来保留:设置一个二维的动态规划表dp , dp[1]{2,3,4}表示从1号城市出发,经过2,3,4 回到1花费最少。
要求上面三个方案的最小值意味:(D12表示1到2的距离,其他同理)
dp[1] [{2,3,4}] = min{ D12+dp[2]{3,4} ,D13+dp[3]{2,4} , D14+dp[4]{2,3}}
由于D12,D13,D14是已知的,那么我们现在的目的就是求dp[2]{3,4},dp[3]{2,4},dp[4]{2,3},
照猫画虎,我们可以列出:(这里只列出dp[2]{3,4} ,其他两个类似)
dp[2]{3,4} = min{ D23+dp[3]{4} ,D24+dp[4][3}}
dp[3]{4}]= D43+dp[4]{}
dp[4]{}=D41
那么经过慢慢的分解,我们知道了我们已知了从4到1的最小花费,那么就可以推出从3出发经过4回到1的花费。。。。。。。从而推出我们所要求的最优解。
5.时间复杂度分析
回溯法:
动态规划法:
TSP(Traveling Salesman Problem)-----浅谈旅行商问题(动态规划,回溯实现)的更多相关文章
- 【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 文章声明 此文章部分资料和代码整合自网上,来源太多已经无法查明出处,如侵犯您的权利,请联系我删除. 01 什么是旅行商问题(TS ...
- 多线程动态规划算法求解TSP(Traveling Salesman Problem) 并附C语言实现例程
TSP问题描述: 旅行商问题,即TSP问题(Travelling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ...
- 旅行商问题(Traveling Salesman Problem,TSP)的+Leapms线性规划模型及c++调用
知识点 旅行商问题的线性规划模型旅行商问题的+Leapms模型及CPLEX求解C++调用+Leapms 旅行商问题 旅行商问题是一个重要的NP-难问题.一个旅行商人目前在城市1,他必须对其余n-1个城 ...
- MIP经典问题:旅行商问题 (traveling salesman problem)
*本文主要记录和分享学习到的知识,算不上原创. *参考文献见链接. 旅行商问题.背包问题都是0-1规划问题中最为经典的问题. 通常来说,当我们学习并熟悉一种求解混合整数问题的技巧时,可以用这种技巧来求 ...
- Complexity and Tractability (3.44) - The Traveling Salesman Problem
Copied From:http://csfieldguide.org.nz/en/curriculum-guides/ncea/level-3/complexity-tractability-TSP ...
- 浅谈动态规划(Dynamic Programming)
利用Leetcode#198打劫家舍 浅谈动态规划 Origin:https://leetcode-cn.com/problems/house-robber/ 题目本身不难,就是一个动态规划的问题.在 ...
- Speeding Up The Traveling Salesman Using Dynamic Programming
Copied From:https://medium.com/basecs/speeding-up-the-traveling-salesman-using-dynamic-programming-b ...
- 浅谈P/NP问题
克雷数学研究所(Clay Mathematics Institute,CMI)是在1998年由商人兰顿·克雷(Landon T. Clay)和哈佛大学数学家亚瑟·杰夫(Arthur Jaffe)创立, ...
- PAT-1150(Travelling Salesman Problem)旅行商问题简化+模拟图+简单回路判断
Travelling Salesman Problem PAT-1150 #include<iostream> #include<cstring> #include<st ...
随机推荐
- java实现多线程使用多个代理ip的方式爬取网页页面内容
项目的目录结构 核心源码: package cn.edu.zyt.spider; import java.io.BufferedInputStream; import java.io.FileInpu ...
- TCPDF说明文档
TCPDF说明文档 一.首先调用TCPDF文件 require_once('tcpdf.php'); 二.实例化TCPDF类 页面方向(P =肖像,L =景观).测量(mm).页面格式 $pdf = ...
- java 的基本数据类型及转换
数据类型精度: byte 8 位short 16 位int 32 位long 64 位float 32 位double 64 位char 16 位 boolean 占几位要看 jvm 的具体实现, 虽 ...
- APP研发录笔记
一.消灭全局变量 在内存不足时,系统会回收一部分闲置的资源,由于App被切换到后台,所以之前存放的全局变量很容易被回收,这时再切换到前台继续使用,会报空指针崩溃.想彻底解决这个问题,就要使用序列化. ...
- #Java学习之路——基础阶段(第四篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- [Swift]LeetCode170.两数之和III - 数据结构设计 $ Two Sum III - Data structure design
Design and implement a TwoSum class. It should support the following operations:add and find. add - ...
- [Swift]LeetCode293. 翻转游戏 $ Flip Game
You are playing the following Flip Game with your friend: Given a string that contains only these tw ...
- [Swift]LeetCode327. 区间和的个数 | Count of Range Sum
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- PHP算法之冒泡排序
//冒泡排序 //①思路,先比较出第一次,找一个最大的值,排到最后; //②重复count遍之后,就能得到排序; //③优化,每一次循环之后不需要再次全部重复; $array = [11,5,4,58 ...
- Python面试真题第四节
81.举例说明SQL注入和解决办法 82.s="info:xiaoZhang 33 shandong",用正则切分字符串输出['info', 'xiaoZhang', '33', ...