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

来源:互联网 发布:加密文件夹软件删除 编辑:程序博客网 时间:2024/05/01 22:27
在《从寻找质数谈谈搜寻演算法》一篇文章里面提到质数搜寻演算法,约略提到了一点演算法 (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参考资料

  • Travelling salesman problem
  • NP-complete
  • Turing Machine
  • Dual problem
  • Palindrome
  • PCA (Principle Component Analysis)
  • SOM (Self-Organized Map)
  • part-of-speech
  • Negative Probability  
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 上海医保本丢了怎么办? 新版医保卡丢了怎么办 武汉社保卡掉了怎么办 职工社保卡丢了怎么办 杭州社保卡丢了怎么办 农村医疗卡丢了怎么办 陕西省医保卡丢了怎么办 小孩社保卡掉了怎么办 社区医保本丢了怎么办 宝宝医保卡掉了怎么办 同煤医疗卡丢了怎么办 杭州医保卡丢了怎么办 新的医保卡丢了怎么办 二代医保卡丢了怎么办 老医保卡丢了怎么办 上海医保卡余额用完了怎么办 身份证丢了医疗报销怎么办 取公积金身份证丢了怎么办 身份证丢了怎么办就诊卡 人在外地怎么办农村社保卡 武汉医保卡丢了怎么办 济宁社保卡丢了怎么办 农村医疗本丢了怎么办 常熟医保卡丢了怎么办 农民社保卡丢了怎么办 常熟社保卡坏了怎么办 社保卡丢失补办期看病怎么办 社保卡补办期间看病怎么办 医保卡冻结了出院结算怎么办 住院医保卡钱不够怎么办 住院押金条丢了怎么办 急用新社保卡要怎么办 看病没带社保卡怎么办 医保卡掉了住院怎么办 厦门医保卡丢了怎么办 成都医保卡丢了怎么办 长春医保卡丢了怎么办 县城医保卡丢了怎么办 医保卡丢了怎么办南宁 西安职工医保丢了怎么办 重庆医保卡丢了怎么办