首先,演算法就是一堆步骤 (step),包含了循序渐进,第一步到最后一步逐次执行,以及依照情况分支,当某个情况成立的时候执行走一条路,不成立的时候走另外一条路,也就是If-then-else的流程。最后还包括反覆执行某一些步骤,一直到某个情况成立或不成立才离开这个迴圈,也就是 loop 的流程。在一般WORD或是POWERPOINT里面化流程图的时候,也都包含这几个大项目!搜寻演算法也不外乎是上面这三种方法的组合,在不同的情况下执行不同的步骤。那么「旅行中的商人」是甚么样子的问题,搜寻演算法要如何找到这个问题的解答呢?
旅行中的商人 旅行中的商人 旅行中的商人
旅行中的商人 (Travelling Salesman Problem) 这个问题,是说一个商人要拜访 N 个城市,并且知道城市和城市之间旅行的费用,要怎样子依序拜访各个城市,才能够用最少的旅费,拜访到每个城市,而且每个城市刚好拜访一次。
接着我们就来看看,这个问题需要的解答是:花费最少的旅费拜访每一个城市刚好一次。这个问题的输入资料 (input data) 是:城市和城市之间所需要的旅费。可能的解答以及搜寻演算法需要寻找的可能组合是:各种拜访城市的顺序,譬如说先拜访城市1、城市2、…、一直到城市n,或是先拜访城市1、接着城市3、然后城市4、…、城市n、最后才拜访城市2。每一种拜访的顺序,需要花费的旅费都不相同,搜寻演算法就要在这些组合里面,找到一种拜访顺序,旅费最便宜,就是答案了!
至于这么多种组合,要怎样子列出来呢?假设今天有4个城市要拜访,分别是台北、高雄、北京、上海。然后我们在地图上面把这4个城市标记起来,用直线连起来,在上面写上旅途所需要的花费。在这边还有一步是解决问题的时候满重要的,就是「抽象化」。
抽象化 抽象化 抽象化
抽象化,就是再解决问题的时候,只注意到问题相关的部分,不相关的部分可以先剔除掉,让我们专注在解决问题相关的地方。像刚才的例子里面,我们不用注意每个城市的大小,因此每个城市在地图上,用一个「点」来代表就可以。我们也不用注意每个城市之间有没有经过海、经过山脉、经过河流,我们只要知道城市之间旅费要多少,因此用一个「边」来代表城市之间的连线,然后在上面写上旅费就可以了!因此一张地图,就抽象化成「点」和「边」(verteces and edges, nodes and links),我们只要在这个由点和边所组成的简化的图 (graph) ,就可以解决问题,原来有各种地形细节的地图,就可以先暂时放在一边了。下面就是一个范例的抽象过的图 (graph)。
各种组合 各种组合 各种组合
所以如果有N个城市,要照题目所说的每个城市刚好走访一次,总共有几种走法呢?答案是 $latex /frac{1}{2} (N-1)!$ 。上面N=4的时候,就有 3 种走法。如果台北、高雄、北京、上海分别用T, K, B, S代表的话,这三种走法就是:TBSKT, TBKST, TKBST。这些走法如果要设计一个演算法,也就是一堆步骤来完成的话,可以像是这样子:
(1) 从第1个点开始
(2) 列出这个点还没拜访过的边
(3) 沿着其中一个没拜访过的边走
(4) 如果走回起点,而且每个城市都已经刚好走过一次,那么就计算花费成本,留待最后比较。
(5) 否则,判断是否还有其他没拜访的边,有的话回到步骤2。
(6) 否则,先回到来到这个点之前走过的点,再重覆步骤2。
演算法 演算法 演算法
我们可以看到,演算法的步骤就是三种方式:循序渐进、依照不同情况分支、以及重覆执行。有些问题可以用数学公式计算出来,也可以用演算法的方式,由电脑执行跑出结果,虽然两者都会用到数学,但是使用的方式有一些不同。譬如说PCA (Principle Component Analysis) 可以用矩阵运算来求解答,也可以由一个SOM (self-organized Map) 类神经网路来求出,类神经网路里面的每一个点都是执行固定的步骤,但是所有的神经元依照这些步骤一起运转的时候,PCA的解答就能够从这个类神经网路中计算出来了!
那么这个问题又和NP-complete有甚么关系呢?我们可以发现到,这个问题如果要求出正确的解答,非得要一个一个组合计算花费的成本,然后找出最便宜的一个走法。NP其实是Non-deterministic Polynomial的缩写,意思是只在一个Non-deterministic的Turing Machine上面,花费polynomial的时间复杂度,可以解决这个问题。看到这边不知道会不会被吓到,没听过Turing Machine,Non-deterministic是甚么呢?这个也是说来话长,让我尝试着用白话文来解释一下好了。
跳过去 跳过去 跳过去
首先,Turing Machine是一种「计算」的架构,由Alan A. Turing在1936年所提出。这个机器有个纪录的空间,有个读写头,机器可以辨认的符号表格,状态纪录表格,还有一个行动准则对应表,这个对应表负责检查目前机器处在甚么状态,读写头现在读到甚么符号,然后决定下一个时间,读写头要往左还是往右移,机器的状态要改变成哪一个状态。因为这个机器能够模拟现在每一台电脑的基本架构,以及评估每一个演算法的复杂度,因此电脑科学里面,把各种可以计算的问题做分类的时候,就是依据Turing Machine。
和Non-deterministic对应的就是deterministic了。Deterministic在这边是指Turing Machine里面的行为准则对应表,每一次改变状态的时候,只要前一步的状态确定,下一步的状态是确定可预测的。Non-deterministic的行为准则表,则是前一步的状态即使都一样,下一步的状态是不可预测的,有两种以上的可能。因此non-deterministic Turing Machine的计算能力会比Deterministic Turing Machine的计算能力多。也因此同样是polynomial的时间复杂度,NP的问题会比P来的难。至于NP是否等于P,目前是仍未解决的问题。讲到这边觉得还是不够白话,也许不懂的读者可以先跳过这两段,待日后另外一篇文章再详细解说。
知道了NP怎么来以后,NP-complete的定义就简单了。一个问题如果是NP,而且又是NP-hard,那么这个问题就是NP-complete。之前提到的Job-Shop Problem和今天提到的Travelling Salesman Problem,都是NP-complete的问题。不过可能会问,NP-hard是甚么呢?NP-hard是指某个问题可以化约成另外一个NP-complete的问题,就是NP-hard了。也就是说,如果A问题可以化约成B问题,就代表说,如果B问题解决了,A问题就跟着解决,也就是A问题比B问题难一点的意思。(有学过计算理论的话,补充一下化约过程是要polynomial-reducible) 经由这个化约的过程,我们可以一直化约,把各个问题组织成一个化约关系的树。如下图
TSP就是今天提到的Travelling Salesman Problem,在图中我们可以看到这个问题可以化约成Hamilton Cycle的问题,然后Hamilton Cycle问题又可以化约成Vertex Cover的问题,到最后化约成CNF-SAT问题(Conjunctive Normal Form - SATisfiability)。今天可能没办法一个一个问题慢慢讲,然而这张图代表的就是说,只要CNF-SAT这个问题解决,Vertex Cover就跟着解决,Hamilton Cycle就跟着解决,然后今天的问题TSP (旅行中的商人) 也就跟着解决了!
对偶问题 对偶问题 对偶问题
最后提一下对偶问题 (Dual Problem)。所谓对偶问题,就是两个问题其实是一体两面,解决其中一个问题,另外一个问题就跟着解决,即使两个问题表面上看起来不大一样。举刚才旅行中的商人的例子来说,我们已经把城市和路线,抽象化成点和边了。如果今天要解决的问题,是一只蚂蚁想要爬一个有稜角的石膏像,要走完每一个切面,然后不同切面之间有不同的成本。这个时候我们可以把每个切面,对应到刚才抽象图里面的点,两个相邻的切面,变成刚才相邻的城市。这两个问题就互相变成是Dual Problem了!
对偶问题有些像是文学里面的对联,或是巴哈的螃蟹卡农曲(Crab Canon)是前面弹过来、后面弹过去,都是相同旋律的歌曲(由前往后WAV, 由后往前WAV, 网页)。细胞里面的RNA也有Palindrome,就是头尾两个方向读起来都是一样的序列。对联、对偶、对仗,都是有一样的地方,也有不一样的地方,才显现出美感。一样的地方是因为词性 (part-of-speech) 要相同,不一样的地方是因为字要不一样。这个台语版对穿肠,里面的对联段落算是诙谐有趣,有兴趣的人不妨观赏一下对联之美!
因此对偶问题就好像是「负世界」一般,有点像是镜子里面另外一个世界,有点像是影子的世界,和我们生活的世界有一样的地方,却又有不一样的地方。但最重要的是,解决其中一个问题,另外一个问题就跟着解决。所以对偶问题这个方法也常常用在,转换后的对偶问题比较容易解答的情况,这时候就先把原来的问题转换成对偶问题,解出答案以后,再把答案用同样的方法转换回原来的问题,就变成原来问题的答案了。
今天我们的机率理论有两个重要的规定是:(1) 所有事件机率加起来要等于1。(2) 每一个事件的机率大于等于0。如果哪一天有个人发明了一套新的机率理论,让机率可以是负的,甚至有虚数的机率,那也许又是人类文明的新的一个里程碑 (Negative Probability)。从这篇文章的最前面到现在,我们了解到,至少在电脑科学领域,有这么多等待解决的问题,也有这么多方法。每个解答的出现,都让人类的文明往前一步。对研究有兴趣的人们,就让我们继续努力不懈,人类就能不断地进步了!
Wikipedia参考资料