转--总结波利亚在书中提到的思维方法

来源:互联网 发布:115账号出租 淘宝 编辑:程序博客网 时间:2024/06/05 04:31

总结波利亚在书中提到的思维方法,尤其是《How To Solve It》中的启发式思考方法,有这样一些:
时刻不忘未知量(即时刻别忘记你到底想要求什么,问题是什么。)莱布尼兹曾经将人的解题思考过程比喻成晃筛子,把脑袋里面的东西都给抖落出来,然后正在搜索的注意力会抓住一切细微的、与问题有关的东西。事实上,要做到能够令注意力抓住这些有关的东西,就必须时刻将问题放在注意力层面,否则即使关键的东西抖落出来了也可能没注意到。 
用特例启发思考。一个泛化的问题往往给人一种无法把握、无从下手、或无法抓住里面任何东西的感觉,因为条件太泛,所以看起来哪个条件都没法入手。一个泛化的问题往往有一种 “不确定性”(譬如元素的个数不确定,某个变量不确定等等),这种不确定性会成为思维的障碍,通过考虑一个合适的特例,我们不仅使得问题的条件确定下来从而便于通过试错这样的手法去助探问题的内部结构,同时很有可能我们的特例中实质上隐藏了一般性问题的本质结构,于是我们便能够通过对特例的考察寻找一般问题的解。 
反过来推导。反过来推导是一种极其重要的启发法,正如前面提到的,Pappus在他的宏篇巨著中将这种手法总结为解题的最重要手法。实际上,反向解题隐含了解题中至为深刻的思想:归约。归约是一种极为重要的手法,一个著名的关于归约的笑话这样说:有一位数学家失业了,去当消防员。经过了一些培训之后,正式上任之前,训练的人考他:如果房子失火了怎么办?数学家答出了所有的正确步骤。训练人又问他:如果房子没失火呢?数学家答:那我就把房子点燃,这样我就把它归约为了一个已知问题。人类思维本质上善于“顺着”推导,从一组条件出发,运用必然的逻辑关系,得出推论。然而,如果要求的未知量与已知量看上去相隔甚远,这个时候顺着推实际上就是运用另一个启发式方法——试错——了。虽然试错是最常用,又是也是最有效的启发法,然而试错却并不是最高效的。对于许多题目而言,其要求的结论本身就隐藏了推论,不管这个推论是充分的还是必要的,都很可能对解题有帮助。如果从结论能够推导出一个充要推论,那么实际上我们就将问题进行了一次“双向”归约,如果原问题不容易解决,那么归约后的问题也许就容易解决了,通过一层层的归约,让逻辑的枝蔓从结论上一节节的生长,我们往往会发现,离已知量越来越近。此外,即便是从结论推导出的必要非充分推论(“单向”归约),对问题也是有帮助的——任何不满足这个推论的方案都不是问题的解:譬如通过驻点来求函数的最值,我们通过考察函数的最值(除了函数边界点外),发现它必然有一个性质,即在这个点上函数的一阶导数为0,虽然一阶导数为0的点未必是最值点,但我们可以肯定的是,任何一阶导数不为0的点都可以排除,这就将解空间缩小到了有穷多个点,剩下的只要做做简单的排除法,答案就出现了。再譬如线性规划中经典的单纯形算法(又见《Algorithms》),也是通过对结论的考 察揭示出只需遍历有限个顶点便必然可以到达最值的。此外很多我们熟知的经典题目也都是这种思路的典范,譬如《How To Solve It》上面举的例子:通过一个9升水的桶和一个4升水的桶在河里取6升水。这个题目通过正向试错,很快也能发现答案,然而通过反向归约,则能够不偏不倚的命中答案。另一些我们耳熟能详的题目也是如此,譬如:100根火柴,两个人轮流取,每个人每次只能取1~7根,谁拿到最后一根火柴谁赢;问有必胜策略吗,有的话是先手还是后手必胜?这个问题通过试错就不是那么容易发现答案了。同样,这个问题的推广被收录在《编程之美》里面:两堆橘子,各为m和n个,两人轮流拿,拿的时候你只能选择某一堆在里面拿(即不能跨堆拿),你可以拿1~这堆里面所有剩下的个橘子,谁拿到最后一个橘子谁赢;问题同上。算法上面很多聪明的算法也都是通过考察所求结论隐藏的性质来减小复杂度的,譬如刚才提到的单纯形问题,譬如经典面试题“名人问题”、“和最小(大)的连续子序列”等等。倒推法之所以是一种极为深刻的思维方法,本质上是因为它充分利用了题目中一个最不易被觉察到的信息——结论。结论往往蕴含着丰富的条件,譬如对什么样的解才是满足题意的解的约束。一般来说,借助结论中蕴含的知识,我们便可以更为“智能地”搜索解空间。举一个直白的例子,有人要你在地球上寻找一栋满足如下条件的建筑:__层高(填空自己填),__风格,__年代始建,... (省略若干约束条件)。对于这样一个问题,最平凡的解法是穷举地球上每一栋建筑,直到遇到一个满足条件的为止。而更“智能”的(或者说更“启发”的)方法则是充分利用题目里面的约束信息,譬如假若条件里面说要60层楼房,你就不会去非洲找,如果要拜占庭风格的,你估计也不会到中国来找,如果要始建于很早的年代的,你也不会去非常新建的城市里面去找,等等。倒推法是如此的重要,以至于笛卡尔当时认为可以把一切问题归结为求解代数方程组,笛卡尔的万能解题法就是首先将问题转化为代数问题,然后设出未知数,列出方程,最后解这组(个)方程。其中设未知数本质上就是一种倒推:通过设出一个假想的结论x,来将题目对x的需求表达出来,然后顺势而下推导出x。仔细想想设未知数这种手法所蕴含的深刻思想,也就难怪笛卡尔会认为它是那个解决所有问题的一般性钥匙了。 
试错。试错估计是世界上被运用最广泛的启发法,你拿到一个题目,里面有一些条件,你需要求解一个未知量。于是你对题目这里捅捅那里捣捣,你用上所有的已知量,或使用所有你想到的操作手法,尝试着看看能不能得到有用的结论,能不能离答案近一步。事实上,如果一个问题的状态空间是有限的话,往往可以通过穷举所有可能性来找到那个关键的性质。譬如这样一个问题:有一个囚犯,国王打算处决他,但仁慈的国王给了他一个生还的机会。现在摆在他面前有两个瓶子,一个里面装了50个白球,一个装了50个黑球,这个囚犯有一个机会可以随便怎样重新分配这些球到两个瓶子中(当然,要保证不空),分配完了之后囚犯被蒙上眼睛,国王随机取一个瓶子给他,他在里面摸出一个球(因为蒙着眼睛,所以也是随机抽取),如果白球,则活,否则挂掉。问,这个囚犯如何分配,才能最大化生还几率。结合特例和试错法,这个题目的答案是很容易发现的。这样的题目还有很多。实际上,历史上很多有名的发现也都是无意间发现的(可以看作是试错的一种)。 
调整题目的条件(如,删除、增加、改变条件)。有时候,通过调整题目的条件,我们往往迅速能够发现条件和结论之间是如何联系的。通过扭曲问题的内部结构,我们能发现原本结构里面重要的东西。譬如这样一个题目(感谢alai同学提供):A国由1000000个岛组成,岛与岛之间只能用船作为交通工具,有些岛之间有船来往,从任意一个岛都可以去到另外任一个岛,当然其中可能要换船。现在有一个警察要追捕一个逃犯,开始时他们在不同的岛上,警察和逃犯都是每天最多乘一次船,但这个逃犯还有点迷信,每个月的13日不乘船,警察则不迷信。警察每天乘船前都知道逃犯昨天在哪个岛上,但不知道他今天会去哪个岛。请证明,警察一定可以抓到逃犯(即到达同一个岛)。通过拿掉题目中一个关键的条件,观察区别,然后再放上那个条件,我们就能“感觉”到题目的内在结构上的某种约束,进而得到答案。 
求解一个类似的题目。类似的题目也许有类似的结构,类似的性质,类似的解方案。通过考察或回忆一个类似的题目是如何解决的,也许就能够借用一些重要的点子。然而如何在大脑中提取出真正类似的题目是一个问题。所谓真正类似的题目,是指那些抽象结构一样的题目。很多问题表面看是类似的,然而抽象结构却不是类似的;另一些题目表面看根本不像,然而抽象层面却是一致的。表面一致抽象不一致会导致错误的、无效的类比;而表面不一致(抽象一致)则会阻碍真正有用的类比。《Psychology of Problem Solving》里面对此有详细 的介绍。后面也会提到,为了便于脑中的知识结构真正能够“迁移”,在记忆掌握和分析问题的时候都应该尽量抽象的去看待,这样才能够建立知识的本质联系,才能够最大化联想空间。 
列出所有可能跟问题有关的定理或性质。这个不用说,我们在最初学习解题的时候就是这么做的了。 
考察反面,考察其他所有情况。很多时候,我们在解题时容易陷入一种特定的手法,比如为什么一定要是构造式的来解这个题目呢?为什么不能是逼近式的?为什么一定要一步到位算出答案?为什么不能从一个错误的答案调整到正确答案?为什么这个东西一定成立?不成立又如何?等等。经典例子:100个人比赛,要决出冠军至少需要赛多少场。 
将问题泛化,并求解这个泛化后的问题。刚才不是说过,应该通过特例启发思考吗?为什么现在又反倒要泛化呢?实际上,有少数题目,泛化之后更容易解决。即,解决一类问题,比解决这类问题里面某个特定的问题还要容易。波利亚称之为“发明者悖论”,关于“发明者悖论”,《数学与猜想》第一卷的开头有一个绝妙的例子,可惜这里空间太小,我就不摘抄了- _-||| 
以上是我认为最重要的,也是最具一般性的、放之四海都可用的思维法则。一些更为“问题特定”的,或更为现代的启发法,可以参见《如何解题:现代启发式方法》以及所有的算法书。不过,在结束这一节之前,还有两个有趣的启发法值得一提:
下意识孵化法。这个方法有点像老母鸡孵小鸡的过程:我们先把问题的吃透,放在脑子里,然后等着我们的下意识把它解出来。不过,不宜将这个方法的条件拉伸过远,实际上,除非能够一直保持一种思索的状态(金出武雄所谓“思维体力”),或者问题很简单,否则一转头去做别的事情之后,你的下意识很容易就把问题丢开了。据说庞加莱有一次在街上,踏上一辆马车的那一瞬间,想出了一个重要问题的解。其他人也像仿效,结果没一个人成功。实际上,非但马车与问题无关,更重要的是,庞加莱实际上在做任何事的时候除了投入有限的注意力之外,其他思维空间都让给了那个问题了。同样,阿基米德从浴缸里面跳出来也是如此;如若不是经过了极其痛苦和长时间的思索,也不会如此兴奋。如果你也曾经花过几天的时间思考一个问题,肯定也是会有类似的经历的。 
烫手山芋法。说白了,就是把问题扔给别人解决。事实上,在这个网络时代,这个方法有着无可比拟的优越性。几乎任何知识性的问题,都可以迅速搜索或请教到答案。不过,如何在已知知识之外发掘出未知知识,如何解决未知问题,那就还是要看个人的能力了。数学界流传一个与此有关的笑话:如果你有一个未解决问题,你有两个办法,一,自己解决它。二,让陶哲轩对它感兴趣。 
除了波利亚的书之外,陶哲轩的《Solving Mathematical Problems》也对解题的启发式思路作了极有意义的介绍,他在书的第一章遵循波利亚的思路从一个具体的题目出发,介绍了如何运用波利亚在书中提到的各种启发式方法来对解题进行尝试。总而言之,充分挖掘题目中蕴含的知识,是解题的最关键步骤。本质上,所有启发式方法某种意义上都是为此服务的。这些知识,有些时候以联想的方式被挖掘出来,此时启发式方法充当的便是辅助联想的手段。有时候则以演绎和归纳的手法被挖掘出来,此时启发式方法则充当助探(辅助探索)工具。
一点思考
1. 联想的法则
人类的大脑是一个复杂而精妙的器官,然而某种程度上,人类的大脑也是一个愚蠢的器官。如果你总结过你解过的一些有意义的好题目,你会发现它们有一个共同点:没有用到你不知道的知识,然而那个最关键的、攸关成败的知识点你就是想不到。所以你不禁要问,为什么明明这个知识在我脑子里(也就是说,明明我是“能够” 解决这个问题的),但我就是没法想到它呢?“你是怎么想到的?”这是问题解决者最常问的一个问题。甚至对于熟练的解题者来说,这个问题的答案也并不总是很明确的,很可能他们自己也不清楚那个关键的想法是怎么“蹦”出来的。我们在思考一个问题的时候,自己能意识到的思维部分似乎是很少的,绝大多数时候我们能感知到的就是一个一个的转折点在意识层面显现,我们的意识就像一条不连续的线,在其上的每一段之间那个空档内发生了什么我们一无所知,往往我们发现被卡在一个地方,我们苦思冥想,然后一个知识(也许是一个性质,也许是一个定理)从脑子里冒了出来,或者说,被我们意识到,然后我们沿着这条路走一段,然后又卡住,然后又等待一个新的关键知识的出现。而至于这些知识是怎么冒出来的?我们可以对它们的“冒出来”提供怎样的帮助?我们可以在意识层面做一些工作,帮助我们的下意识联想到更多重要的知识吗?那些灵光一现的瞬间,难道只能等待它们的出现?难道我们不能通过一些系统化的步骤去“捕获”或“生成”它们?又或者我们能不能至少做些什么工作以使得它们更容易发生呢?正如金出武雄在《像外行一样思考,像专家一样实践》中所说的,人类的灵感一定是有规律的,认知科学目前至少已经确认了人类思维的整个物质基础——神经元。而既然它们是物质,自然要遵循物质的运行规律。只不过我们目前还没有窥破它们,但至少我们可以确信的是,它们在那里。事实上,不需要借助于认知科学,单单是通过对我们自己思维过程的自我观察,也许就已经能够总结出一些重要的规律了,也许,对自身思维过程的反观真的是人有别于其它动物的本质区别。《专注力》当中有这样一个例子:一天夜里,你被外面的吵闹声叫醒了,你出去一看,发现有一群人,其中有一个人开着很名贵的轿车,他跟你说他们正在玩一个叫“拾荒者”的游戏,由于一些原因,他必须要赢这个游戏,现在他需要一块1.5m*1m的木板,如果你能帮忙的话,愿以一万美元酬报。你怎么办?被测试的大多数人都没有想到,只要把门拆给他就可以了(如果你想到了,祝贺你:-)),也许你会说现在的门都是钢的,没关系,那你有没有想到床板、立柜的门、大桌子的桌面之类的?这个问题测试的就是心理学上所谓的“范畴陷阱”,“木板”这个名词在你脑子里的概念中如果是指“那些没有加工的,也许放在木材厂门口的,作为原材料的木板”的话,那么“木板”就会迅速在你的下意识里面建立起一个搜索范畴,你也会迅速的反应到“这深更半夜叫我上哪去找木板呢?”如果你一下就想到了,那么很大的可能性是“木板”这个概念在你脑子里的范畴更大,更抽象,也许包含了所有“木质的、板状的东西”。这就是联想的法则。我们的大脑无时无刻不在对事物进行归类,实际上,不仅是事物,一切知识,都在被自动的归类。在有关对世界的认知方面,被称为认知图式,我们根据既有的知识结构来理解这个世界,会带来很大的优势。实际上,模块化是一个重要的降低复杂性的手段。然而,知识是一把双刃剑,一方面,它们提供给了我们解决问题的无以伦比的捷径优势,“砖头是砌墙的”,于是我们遇到砌墙这个问题的时候就可以迅速利用砖头。然而另一方面,知识却也是思维的桎梏。思维定势就是指下意识遵循既有知识框架思考的过程。上面的那个木板的例子也是思维定势的例子。每一个知识都是一个优势,同时又是一个束缚。著名的科幻作家阿瑟·克拉克有一句名言:如果一位德高望重的老科学家说某个事情是不可能的,那么他很可能是错的。所以,如何在获取知识优势的同时,防止被知识束缚住,是一门技术。
掌握这门技术的钥匙,就是抽象。在吸收知识的时候进行抽象,同时在面对需要用到知识的新问题时也要对问题进行抽象。就以大家都知道的“砖头”有多少种用途为例,据说这道题目是用于测试人的发散思维的,能联想到的用途越多,思维定势就越小。实际上,借助于抽象这个利器,这类题目(乃至更广的一类问题)是可以系统性的进行求解的,我们只需对砖头从各个属性维度进行抽象。譬如,砖头是——长方形的(长方形的东西有什么用途?还有哪些东西也是长方形的,它们都有什么用途?)、有棱角的(问题同上)、坚硬的、固体、有一定大小的体积的、红色的、边界线条平直的、有一定重量的... 对于每一个抽象,我们不妨联想还有其他什么物体也是具有同样抽象性质的,它们具有同样的用途吗?当然,除了抽象之外,还有“修改”,我们可以在各个维度上对砖头的属性进行调整,以期得到新的属性:譬如大小可以调整、固体可以调整为碎末、棱角可以打磨、重量也可以调整、形状也可以调整... 然后看看新的属性可以如何联想开去。
除了这个简单的例子之外,我们也不妨看一看一些算法上的例子,同样一个算法,不同的人来理解,也许你脑子里记得的是某个特定的巧妙技巧(也许这个技巧在题目的某步关键的地方出现,从而带来了最令人意外的转折点),然而另一人个记得得也许是“递归”这种手法,还有另外一个人记得的也许是“分治”这种更一般化的解题思路。从不同的抽象层面去掌握这道题目的知识信息,以后遇到类似的问题,你能够想起这道题所提供的知识的可能性是有极大的差异的。《Psychology of Problem Solving》的第11章举了这样一个例子:先让被试(皆为大学生)阅读一段军事材料,这个材料是说一小撮军队如何通过同时从几个不同方向小规模攻击来击溃一个防守严实的军事堡垒的。事实上这个例子的本质是对一个点的同时的弱攻击能够集聚成强大的力量。然后被试被要求解决一个问题:一个医生想要用X射线杀死一个恶性肿瘤,这个肿瘤只可以通过高强度的X射线杀死,然而那样的话就会伤及周围的良好组织。医生应该怎么办呢?在没有给出先前的军队的例子的被试中只有10%想到答案,这是控制基线。然后,在先前学习了军队例子的被试中,这个比例也仅仅只增加到30%,也就是说只有额外20%的人“自动”地将知识进行了转移。最后一组是在提醒之下做的,达到了75%,即比“自动”转移组增加了45%之多。这个例子说明,知识的表象细节会迷惑我们的眼睛,阻碍我们对知识的运用,在这个例子中是阻碍问题之间的类比。而抽象,则正是对非本质细节去枝减叶的过程,抽象是我们在掌握知识和解决问题时候的一把有力的奥卡姆剃刀。所以,无论是在解题还是在学习的过程中,问自己一个问题“我是不是已经掌握了这个知识最深刻最本质的东西”是非常有益的