漫画:什么是旅行商问题?

原文地址 mp.weixin.qq.com
作者:小灰


需要规划出怎样的路线呢?举个例子:

有一个快递员,要分别给三家顾客送快递,他自己到达每个顾客家的路程各不相同,每个顾客之间的路程也各不相同。

那么,想要把快递依次送达这三家,并最终回到起点,哪一条路线所走的总距离是最短的呢?

旅行商问题

和小灰所遇到的问题类似,旅行商问题所描述的是这样一个场景:

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

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

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

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),也可以翻译成 NP 完全问题。上面所讲的旅行商问题,被科学家证明属于 NPC 问题。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值