http://202.202.96.70:8080/courseware/0836/content/0003/tc01.htm
经常有人问起我的专业。在简单解释一番之后,听的人如坠五里云雾,我自己也感觉不甚了了。于是想把我研究领域里的一些东西整理出来,算是一份学习的总结。
首先来看看这个旅行商问题(Traveling Salesman Problem):四处旅行的推销员想找出一条通过所有城镇并回到原出发点的最短路线:
比如由城市1出发,先去城市2,再去城市3;也可以先去城市3,再去城市2。而这两种走法的距离是不一样的。题目简单易懂,但是可能的路线有n!之多。怎样找出总路程最短的一种走法呢?除了穷举法之外,没有最佳的方法。因此这种问题属于NP完全问题(NP完全问题将在后面解释)。
有人要嗤之以鼻了:这种问题值得研究吗?远点就远点吧,大不了多走几天。其实它的研究是很有用处的。比如运输公司进行货物配送,最短路程就意味着最少的油钱和时间。又比如将这些城市换成生产线上的组装工序,将城市间的距离换成组装费用,那么问题就变成了找到最低成本的组装方案。
那位看官又说了:实在不行就一个个试呗,把每种走法都算一遍,找个最短的走吧。殊不知城市少还好办,如果数量增加,计算量立刻成指数增长。比如采用穷举法,当有21个城市时,计算机运算时间是20小时;当有22个城市时,运算时间是17。5天;而当有25个城市时,运算时间将达到600年。
那是不是就一点办法都没有了呢?也不是的。最短路程找不到,我们可以退而求其次,找找比较短的路程嘛。这样一来就好办多了,人们想出了许多有趣的方法来求比较短的路程,它们个个都令人拍案叫绝。
上回说到可怜的旅行商想找出走遍所有城市的最短路径。让我们用计算机帮他搜索一下。
这就需要用到本篇文章中要介绍的第一门学科了:《人工智能》。人类的许多活动,如解算题、猜谜语、进行讨论、编制计划和编写计算机程序,甚至驾驶汽车和骑自行车等等,都需要"智能"。如果机器能够执行这种任务,就可以认为机器已具有某种性质的"人工智能"。现在我们就要利用人工智能,用计算机模拟人的思维来搜索最短路径。
想像一下,我们人思考问题时,有两种方法:一种是精确搜索,就是试验所有的可能性,找出最精确的一个方案。但它在搜索过程中不改变搜索策略,不利用搜索获得的中间信息,它盲目性大,效率差,用于小型问题还可以,用于大型问题根本不可能;另一种叫做启发式搜索,它在搜索过程中加入了与问题有关的启发性信息,用以指导搜索向着一个比较小的范围内进行,加速获得结果。对于旅行商问题这种NP完全问题,精确式搜索是不可能实现的,只能采用下面的几种启发式搜索方法:
1、近邻法(nearest neighbor)
推销员从某个城镇出发,永远选择前往最近且尚未去过的城镇,最后再返回原先的出发点。这方法简单,也许是多数人的直觉做法,但是近邻法的短视使其表现非常不好,通常后段的路程会非常痛苦。
2。插入法(insertion)
先产生连接部分点的子路线,再根据某种法则将其它的点逐一加入路线。比如最近插入法(nearest insertion),先针对外围的点建构子路线,然后从剩余的点里面评估何者加入后路线总长度增加的幅度最小,再将这个点加入路线。又比如最远插入法(farthest,insertion),是从剩余的点里面选择距离子路线最远的点,有点先苦后甜的滋味。
3、模拟退火算法(Recuit Algorithm)
模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。根据Metropolis准则,粒子在温度T时趋于平衡的概率为e-ΔE/(kT),其中E为温度T时的内能,ΔE为其改变量,k为Boltzmann常数。用固体退火模拟组合优化问题,将内能E模拟为目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法:由初始解i和控制参数初值t开始,对当前解重复“产生新解→计算目标函数差→接受或舍弃”的迭代,并逐步衰减t值,算法终止时的当前解即为所得近似最优解。
4、遗传算法
遗传算法是仿真生物遗传学和自然选择机理,通过人工方式所构造的一类搜索算法,从某种程度上说遗传算法是对生物进化过程进行的数学方式仿真。生物种群的生存过程普遍遵循达尔文进化准则,群体中的个体根据对环境的适应能力而被大自然所选择或淘汰。进化过程的结果反映在个体的结构上,其染色体包含若干基因,相应的表现型和基因型的联系体现了个体的外部特性与内部机理间逻辑关系。通过个体之间的交叉、变异来适应大自然环境。生物染色体用数学方式或计算机方式来体现就是一串数码,仍叫染色体,有时也叫个体;适应能力是对应着一个染色体的一个数值来衡量;染色体的选择或淘汰则按所面对的问题是求最大还是最小来进行。
5、神经网络算法
根据一个简化的统计,人脑由百亿条神经组成—每条神经平均连结到其它几千条神经。通过这种连结方式,神经可以收发不同数量的能量。神经的一个非常重要的功能是它们对能量的接受并不是立即作出响应,而是将它们累加起来,当这个累加的总和达到某个临界阈值时,它们将它们自己的那部分能量发送给其它的神经。大脑通过调节这些连结的数目和强度进行学习。尽管这是个生物行为的简化描述。但同样可以充分有力地被看作是神经网络的模型。
看了上面的介绍是不是已经眼冒金星,哈欠连天了?其实这些还都只是些理论模型,要想用计算机程序来实现,还需要大量更加枯燥乏味的工作。
前面谈到的旅行商问题是一种典型的NP完全问题。先不谈他具体是什么意思,先来看看他的重要地位:美国麻州的克雷(Clay)数学研究所于2000年5月24日在巴黎法兰西学院宣布了一件被媒体炒得火热的大事:对七个“千僖年数学难题”的每一个悬赏一百万美元。以下是这七个难题。
“千僖难题”之一:P(多项式算法)问题对NP(非多项式算法)问题。
“千僖难题”之二:霍奇(Hodge)猜想。
“千僖难题”之三:庞加莱(Poincare)猜想。
“千僖难题”之四:黎曼(Riemann)假设。
“千僖难题”之五:杨-米尔斯(Yang-Mills)存在性和质量缺口。
“千僖难题”之六:纳维叶-斯托克斯(Navier-Stokes)方程的存在性与光滑性。
“千僖难题”之七:贝赫(Birch)和斯维讷通-戴尔(Swinnerton-Dyer)猜想。
NP完全问题排在百万美元大奖的首位,足见他的显赫地位和无穷魅力。数学上著名的NP问题,完整的叫法是NP完全问题,也即“NP COMPLETE”问题,简单的写法,是NP=P?的问题。问题就在这个问号上,到底是NP等於P,还是NP不等於P。证明其中之一,便可以拿百万美元大奖。这个奖还没有人拿到,也就是说,NP问题到底是Polynomial,还是Non-Polynomial,尚无定论。
NP里面的N,不是Non-Polynomial的N,是Non-Deterministic,P代表Polynomial倒是对的。NP就是Non-deterministic Polynomial的问题,也即是多项式复杂程度的非确定性问题。
什么是非确定性问题呢?有些计算问题是确定性的,比如加减乘除之类,你只要按照公式推导,按部就班一步步来,就可以得到结果。但是,有些问题是无法按部就班直接地计算出来。比如,找大质数的问题。有没有一个公式,你一套公式,就可以一步步推算出来,下一个质数应该是多少呢?这样的公式是没有的。再比如,大的合数分解质因数的问题,有没有一个公式,把合数代进去,就直接可以算出,它的因子各自是多少?也没有这样的公式。
这种问题的答案,是无法直接计算得到的,只能通过间接的“猜算”来得到结果。这也就是非确定性问题。而这些问题的通常有个算法,它不能直接告诉你答案是什么,但可以告诉你,某个可能的结果是正确的答案还是错误的。这个可以告诉你“猜算”的答案正确与否的算法,假如可以在多项式时间内算出来,就叫做多项式非确定性问题。而如果这个问题的所有可能答案,都是可以在多项式时间内进行正确与否的验算的话,就叫完全多项式非确定问题。完全多项式非确定性问题可以用穷举法得到答案,一个个检验下去,最终便能得到结果。但是这样算法的复杂程度,是指数关系,因此计算的时间随问题的复杂程度成指数的增长,很快便变得不可计算了。
人们发现,所有的完全多项式非确定性问题,都可以转换为一类叫做满足性问题的逻辑运算问题。既然这类问题的所有可能答案,都可以在多项式时间内计算,人们於是就猜想,是否这类问题,存在一个确定性算法,可以在指数时间内,直接算出或是搜寻出正确的答案呢?这就是著名的NP=P?的猜想。
解决这个猜想,无非两种可能,一种是找到一个这样的算法,只要针对某个特定NP完全问题找到一个算法,所有这类问题都可以迎刃而解了,因为他们可以转化为同一个问题。另外的一种可能,就是这样的算法是不存在的。那么就要从数学理论上证明它为什么不存在。
前段时间轰动世界的一个数学成果,是几个印度人提出了一个新算法,可以在多项式时间内,证明某个数是或者不是质数,而在这之前,人们认为质数的证明,是个非多项式问题。可见,有些看来好象是非多项式的问题,其实是多项式问题,只是人们一时还不知道它的多项式解而已。
NP问题
NP是Non-deterministic Polynomial的缩写,NP问题通俗来说是其解的正确性能够被很容易检查的问题,这里"很容易检查"指的是存在一个多项式检查算法。
例如,著名的推销员旅行问题(Travel Saleman Problem or TSP):假设一个推销员需要从香港出发,经过广州,北京,上海,等n个城市,最后返回香港。任意两个城市之间都有飞机直达,但票价不等。现在假设公司只给报销$C块钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于推销员旅行问题显然是NP的。
因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于$C的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排!这将是个天文数字。
NP-complete问题是所有NP问题中最难的问题。它的定义是,如果你可以找到一个解决某个NP-complete问题的多项式算法,那么所有的NP问题都将可以很容易地解决。
通常证明一个问题A是NP-complete需要两步,第一先证明A是NP的,即满足容易被检查这个性质;第二步是构造一个从某个已知的NP-complete问题B到A的多项式变换,使得如果B能够被容易地求解,A也能被容易地解决。这样一来,我们至少需要知道一个NP-complete问题。
第一个NP complete问题是SAT问题,由COOK在1971年证明。SAT问题指的是,给定一个包含n个布尔变量(只能为真或假)X1,X2...,Xn的逻辑析取范式,是否存在它们的一个取值组合,使得该析取范式被满足?可以用一个具体例子来说明这一问题,假设你要安排一个1000人的晚宴,每桌10人,共100桌。主人给了你一张纸,上面写明其中哪些人因为江湖恩怨不能坐在同一张桌子上,问是否存在一个满足所有这些约束条件的晚宴安排?这个问题显然是NP的,因为如果有人建议一个安排方式,你可以很容易检查它是否满足所有约束。COOK证明了这个问题是NP-complete的,即如果你有一个好的方法能解决晚宴安排问题,那你就能解决所有的NP问题。
这听起来很困难,因为你必须面对所有的NP问题,而且现在你并不知道任何的NP-complete问题可以利用。COOK用非确定性图灵机(Non-deterministic Turing Machine)巧妙地解决了这一问题。
正式地,NP问题是用非确定性图灵机来定义的,即所有可以被非确定性图灵机在多项式时间内解决的问题。非确定性图灵机是一个特殊的图灵机,它的定义抓住了“解容易被检查”这一特性。非确定性图灵机有一个“具有魔力的”猜想部件,只要问题有一个解,它一定可以猜中。例如,只要存在哪怕一个满足约束的晚宴安排方式,或是一个满足旅行预算的行程安排,都无法逃过它的法眼,它可以在瞬间猜中。在猜出这个解以后,检查确认部分和一台普通的确定性图灵机完全相同,也即是等价于任何一个实际的计算机程序。
COOK证明了,任意一个非确定性图灵机的计算过程,即先猜想再验证的过程,都可以被描述成一个SAT问题,这个SAT问题实际上总结了该非确定性图灵机在计算过程中必须满足的所有约束条件的总和(包括状态转移,数据读写的方式等等),这样,如果你有一个能解决该SAT问题的好的算法,你就可以解决相应的那个非确定性图灵机计算问题,因为每个NP问题都不过是一个非确定性图灵机计算问题,所以,如果你可以解决SAT,你就可以解决所有NP问题。因此,SAT是一个NP-complete问题。
有了一个NP-complete问题,剩下的就好办了,我们不用每次都要和非确定性图灵机打交道,而可以用前面介绍的两步走的方法证明其它的NP-complete问题。迄今为止,人们已经发现了成千上万的NP-complete问题,它们都具有容易被检查的性质,包括前面介绍的推销员旅行问题。当然更重要的是,它们是否也容易被求解,这就是著名的P vsNP的问题。
<!-- InstanceEndEditable -->