旅行商问题

旅行商问题所描述的是这样一个场景:

有一个商品推销员,要去若干个城市推销商品。该推销员从一个城市出发,需要经过所有城市后,回到出发地。每个城市之间都有道路连通,且距离各不相同,推销员应该如何选择路线,使得总行程最短呢?

这个问题看起来很简单,却很难找到一个真正高效的求解算法。其中最容易想到的,是使用穷举法:

把所有可能的路线穷举出来,计算出每一条路线的总行程:

A-B-C-D-E-F-G-H-I

A-B-C-D-E-F-G-I-H

A-B-C-D-E-F-H-G-I

A-B-C-D-E-F-H-I-G

A-B-C-D-E-F-I-H-G

A-B-C-D-E-F-I-G-H

......

......

像上面这样排列组合,从所有路线中找出总行程最短的路线。显然,这个方法的时间复杂度是O(n!),随着城市数量的增长,花费的运算时间简直不可想象!

后来,人们想出了许多相对优化的解决方案,比如动态规划法、分枝定界法(这个算法很有意思,以后会专门写一篇漫画来详细介绍)......但是,这些算法的时间复杂度仍然是指数级的,并没有让性能问题得到根本的解决。

P和NP

NP到底是什么意思呢?

我们曾经学习过许许多多的算法,这些算法的时间复杂度都可以用多项式来表示,比如:

归并排序的时间复杂度是O(nlogn)

冒泡排序的时间复杂度是O(n^2)

Floyd算法的时间复杂度是O(n^3)

尽管这些算法的运行时间有数量级上的差别,但是它们的时间复杂度都可以用O(n^k)来表示,k是一个常数。

因此,这些算法都是多项式时间算法,能用多项式时间算法解决的问题被称为P问题( Polynomial)。

人们常说,能用钱解决的问题都不是问题,在计算机科学家眼中,能用多项式时间解决的问题都不是问题。

然而,世间还存在许多变态的问题,是无法(至少是暂时无法)在多项式时间内解决的,比如一些算法的时间复杂度是O(2^n),甚至O(n!)。

随着问题规模n的增长,计算量的增长速度是非常恐怖的。这类问题被称为NP问题(Non-deterministic Polynomial),意思是“不确定是否能用多项式时间解决”。

有些科学家认为,所有的NP问题终究都可以在多项式时间内解决,只是我们暂时还没有找到方法;也有些科学家认为,某些NP问题永远无法在多项式时间内解决。

这个业界争论可以用一个公式来表达:

NP = P?

归约和NPC

这里所说的NPC问题可不是游戏当中的NPC,它究竟是什么意思呢?要想理解NPC问题,我们需要先了解归约的概念。

归约,可以简单理解成问题之间的转化。例如问题Q是一个一元一次方程的求解问题:3x+6 = 12,这个问题可以转化成一个一元二次问题Q':0x^2+3x+6 = 12。

显然,问题Q并不比问题Q'更难解决,只要有办法解决Q',就一定能够解决Q。对于这种情况,我们可以说问题Q归约于问题Q'。

同时,这种归约可以逐级传递,比如问题A归约于问题B,问题B归约于问题C,问题C归约于问题D,那么我们可以说问题A归约于问题D。

在NP问题之间,也可以存在归约关系。我们把众多的NP问题层层归约,必定会得到一个或多个“终极问题”,这些归约的终点就是所谓的NPC问题(NP-complete),也可以翻译成PC完全问题。上面所讲的旅行商问题,被科学家证明属于NPC问题。

就数量上而言,NP问题远比P问题要多,而NP之中的NPC问题也仅占极少数,所以P、NP、NPC之间的关系可以用下图来表示:

俗话说擒贼先擒王,只要有朝一日,我们能够找到NPC问题的多项式时间算法,就能够解决掉所有的NP问题!但遗憾的是,至今还没有人能够找到可行的方法,很多人认为这些问题是无解的。

回到最初的问题:

既然是工程问题,我们与其钻牛角尖寻求最优解,不如用小得多的代价寻求次优解。

最简单的办法是使用贪心算法,先选择距离起点最近的城市A,再选择距离A城市最近的城市B... 以此类推,每一步都保证局部最优。

这样规划出的路线虽然未必是全局最优,但平均情况下也不会比最优方案差多少。

除此之外,还有许多近似的解决方案,比如遗传算法、蚁群算法等等。谷歌有一款开源工具OR-TOOL,当中也包含路线规划的实现,可以研究一下。

总结:

本文提到的算法名及可扩展内容:

穷举法、动态规划法、分枝定界法

归并排序、冒泡排序、Floyd算法

贪心算法

遗传算法、蚁群算法

谷歌开源工具OR-TOOL

旅行商问题穷举算法c语言,什么是旅行商问题——算法NP、P、NPC知识相关推荐

  1. c语言编程最大公约数穷举发,C语言基本算法 :1.求最大公约数与最小公倍数

    C语言基本算法 :1.求最大公约数与最小公倍数 一.最大公约数: 最大公约数目前有三种求法:更相减损术.辗转相除法以及穷举法. 1.更相减损术: 算法介绍:设两个整数数a和b,以较大数减较小数,得出的 ...

  2. c语言变量相等问题穷举法,C语言穷举法经典例题.ppt

    <C语言穷举法经典例题.ppt>由会员分享,可在线阅读,更多相关<C语言穷举法经典例题.ppt(18页珍藏版)>请在人人文库网上搜索. 1.枚举法(穷举法),"笨人之 ...

  3. 穷举最小公倍数c语言,c语言求最大公约数和最小公倍数

    求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b ...

  4. java 穷举法求水仙花数_常用算法-穷举法

    穷举法又称为枚举法,它是在计算机算法设计中用得最多的一种编程思想.它的实现方式是:在已知答案范围的情况下,依次地枚举该范围内所有的取值,并对每个取值进行考查,确定是否满足条件.经过循环遍历之后,筛选出 ...

  5. 穷举法c语言吃饭,C语言穷举法经典例题

    枚举法(穷举法),"笨人之法":把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出.,分析:这是个不定方程--三元一次方程组问题(三个变量,两个方程)x+y+z=1005x ...

  6. 妙趣横生的算法(c语言实现),妙趣横生的算法(C++语言实现) 带目录完整pdf[4MB]

    <妙趣横生的算法(C++语言实现)>内容丰富,生动有趣,寓教于乐,旨在帮助读者学习数据结构和算法的相关知识,从而开阔眼界,培养编程兴趣,提高编程能力,增强求职的竞争力.如果您想提高自己对算 ...

  7. 最近最久未使用页面置换算法C语言,LRU页面置换算法模拟-最近最久未使用置换算法...

    LRU页面置换算法模拟-最近最久未使用置换算法 LRU页面置换算法模拟-最近最久未使用置换算法|课程设计|计算机数据库课程设计 一.设计目的 1.用C语言实现最近最久未使用(LRU)置换算法. 2.了 ...

  8. java实现随机数生成算法_Java 语言实现的随机数生成算法

    广州疯狂软件学院拥有三大课程体系包括:java课程,android课程,ios课程,疯狂软件年终钜惠,报名java就业班,免费赠送基础班,名额有限,本月火热报名中,欢迎有志之士电话或者QQ咨询. [导 ...

  9. bwt比对算法 C语言,DNA比对算法:BWT

    DNA比对算法:BWT BWT算法,实质上是前缀树的一种实现.那么什么是前缀树呢? 一.前缀树 对于问题p in S?如果S=rpq,那么p为S前缀rp的一个后缀. 于是,为了判断p in S 是否成 ...

最新文章

  1. 录音文件下载_音频转文字怎么转?大家都说好用的手机APP:录音转文字助手
  2. Android输入系统(三)InputReader的加工类型和InputDispatcher的分发过程
  3. JZOJ 5253. 排列与交换
  4. 服务器主机linux安装mysql_linux服务器上安装mysql
  5. Variant 与 内存泄露
  6. ROS笔记(26) Movelt!
  7. 5G NR协议栈----总体架构
  8. Android 成用户隐私安全问题严重
  9. SQL Server-外部联接基础
  10. Linux下更新BIOS的方法
  11. 计算机考研如何选?中国人民大学学长两年考研经验+权威预测
  12. apk编辑器制作共存失败的一个可能的原因(第一次手动制作的教训)
  13. 读书|林曦:她把自己的生活,过成了无用但丰盈的美学
  14. 用户正确使用趋势跟随的交易系统的方法
  15. 关于电子邮件客户端设计中QQ邮箱授权码问题。(运行提示535错误,说授权码error。)
  16. 什么是串扰crosstalk
  17. 数据结构 | 二叉树 先根、中根、后根遍历的非递归算法
  18. 思岚科技定位导航技术凸显 成为服务机器人企业首选品牌
  19. MySQL的Logo为 标志_MySQL 的Logo为[     ]标志,海豚代表了速度、动力、精确等MySQL所拥有的特性。_国际贸易基础知识答案_学小易找答案...
  20. 18-《致橡树》-舒婷

热门文章

  1. C++ 函数名前的 '', 参数前的
  2. non-dominated sorting算法的matlab实现
  3. 简析:阿里巴巴最近20个月的拆分史
  4. @在 centos7 下安装 oracle 12c
  5. (菜鸟要飞系列)五,基于Asp.Net MVC5的后台管理系统(添加数据表的分页功能)...
  6. 上班族注意:消除脖子酸痛的方法!!!
  7. 图片拉伸并保护关键部分不变形
  8. 1004. 西西弗斯式的命运
  9. js时间戳转日期函数
  10. 解决三星手机拍照后,图片旋转。