旅行中的商人与负世界 Traveling saleman

在《 从寻找质数谈谈搜寻演算法 》一篇文章里面提到质数搜寻演算法,约略提到了一点演算法 (Algorithm) 以及 搜寻(search) 演算法。简单地说,搜寻演算法就是要在一堆可能是答案的输入资料 (input data) 当中,找出符合条件的答案。之前在《 排程问题与CPU Scheduling 》里面提到了Job-Shop Problem是一个很难的排程问题 (Scheduling Problem),是NP-complete。本篇就简单介绍一下搜寻演算法、「旅行中的商人」这个问题如何使用搜寻演算法、NP-complete的定义、以及最后提一下对偶问题(Dual Problem)。

algorithm

首先,演算法就是一堆步骤 (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)。

graph2 

各种组合         各种组合         各种组合 

 所以如果有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参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值