跟波利亚学解题
By 刘未鹏(pongba)
C++的罗浮宫(http://blog.csdn.net/pongba)
TopLanguage(http://groups.google.com/group/pongba)
一些故事
波利亚在他著名的《How To Solve It》中讲了这么一个有趣的心理学实验:
用一个缺了一条边的正方形围栏围住一只动物(狗、黑猩猩、母鸡、人类婴儿),在围栏的另一侧放上一个被试很想要的物体(对动物来说是食物,对人类婴儿来说是有趣的玩具),然后观察他们各自的行为。发现,狗在扒着围栏吠了几声发现无法通过的时候,不久便学会了从围栏的缺口的那一边绕出去,母鸡则朝着围栏一个劲的扑腾,不会想到绕弯子。此外,人类婴儿很快就学会了绕过障碍;而黑猩猩也学得很快(黑猩猩是和人类最近的灵长类亲属)。这个实验有力的证明了,动物解决问题的能力是进化而来的、天生的、硬编码在大脑的神经元网络里面的。
事实上,不仅解决问题方面是如此,人类整个认知系统中绝大部分功能从本质上都是硬编码的,能在后天习得的只是“程度”的不同,而不是“本质”的不同。《动机心理学》中有一个令人印象深刻的一个例子:
先给小鼠喝某种甜味水(称为“可口水”),然后用X射线促使其产生反胃感,能使小鼠形成对这种味道的水的厌恶和回避(经典条件反射)。但如果不是在水里面加味道,而是在它喝水的时候伴随强光刺激(即让它喝“光噪水”),然后同样刺激其反胃,却无法使它养成对“光噪水”的厌恶。另一方面,如果不是促使其反胃(身体不适),而是用电击惩罚,则它无法形成对“可口水”的厌恶,而是形成对“光噪水“的厌恶。显然,小鼠对事件之间的关联的归因也具有着某种硬编码好了的倾向。在这个例子中,老鼠的大脑里面硬编码了“将身体不适(内部事件)归因于食物而不是闪光”、”将电击(外部事件)归因于闪光而非食物” 这种逻辑。
而人类也有类似的归因倾向。金出武雄在《像外行一样思考,像专家一样实践》中也提到,他认为人类的直觉实际上也是计算,捷径式的计算,只不过由于我们目前还不了解人类大脑内神经元的全部结构(或者说“感性”的物质基础)这才把“感性”当成人类所特有的;金出武雄的这种观点跟心理学中的认知捷径不谋而合。实际上,越是高等的动物,大脑中用于处理特定问题的硬编码神经元回路就越是多和复杂。例如,达尔文早在《人类和动物的情绪表达》中就先知先觉的提出了动物情绪的适应价值;《Mean Genes》列出了用于解决生存繁衍问题的特定认知倾向;《决策与判断》里面则列出了人类在解决更具一般性的决策问题中的一些系统性的、可预测的认知偏差;而《Predictably Irrational》更是把这个认识提高到方法论的层面,主张人类的非理性实际上是完全可预知的。事实上,所有这些观点都建立在一个基本事实的基础上,即人类大脑中的千亿神经元是由在漫长的进化过程中被塑造出来的分工明确的、ad hoc的一组子系统构成的。
越是高等的动物,解题能力越高,猩猩能够进行某种顿悟,在脑子里就构想出通过堆放墙角的箱子来帮助获取高高吊着的香蕉;而出于进化之树顶端的人类则具有非比寻常的大脑,在人类整个进化的过程中,解决问题的能力一直在进化,所以说人脑中的神经元最重要的部分是为了解题而存在的也不为过。不同的人只是在解题能力程度上不同,并没有本质上能与不能的差异。
波利亚在《How To Solve It》中另外还举了下面这个例子:
一个原始人站在一条小溪前,他想要越过这条小溪,但溪水经过昨天一夜,已经涨了上来;因此他面临一个问题:如何越过这条小溪。他联想起以前曾经从一棵倒下并横在河上的树木上走过去,于是他的问题变成了如何找到这样一颗倒下并横在溪流上的树木。他环顾四周,发现溪流上没有这样的横着的树木,但他发现周围倒是有不少生长着的树木;于是问题再次变成了:如何使这些树木躺到溪流上。
在这个想像的故事中我们看到了一个问题是如何被一步步归约的:首先,原始人通过对一个已知的类似问题的联想认识到一个重要的性质:如果有一棵树横在河上,我就可以借助这棵树过河。这就将一个无法直接解决的问题转化为了一个新的、已知的、并容易解决的问题。值得注意的是这里“联想”是极其重要的一个环节,联想可以将手上的问题与已知的类似问题联系起来,并从后者中吸取能够利用的方法。联想也能够将与问题有关的定理或性质从大脑的知识系统中提取出来。基本上,如果一个联想能够得到某个性质,而这个性质能够或者将问题往上归约一层,或者将条件往下推导一层,这个联想就是有用的。事实上,如果你仔细注意以下解题的过程,你也许会发现,所有的启发式思维方法(heuristics)实质上都是为了联想服务的,而联想则是为了从我们大脑的知识系统中提取出有价值的性质或定理,从而补上从条件到结论、从已知到未知之间缺失的链环。
一段历史
实际上,人类自从进入理性文明以来,不仅在不断的解题,还在不断的对自身的解题方法进行反省和总结。在这条路上,有一个真正光荣与辉煌的梦想,那就是发现人类解题的所有一般性法则,并借此建造出一台能够解决人类能够解决的所有问题的一般解题机。与物理中的建造永动机不一样,这个梦想并非遥不可及的,自从古希腊哲学家对人类心智的反省思考以来,许多著名的数学和哲学家为此建造了阶梯,Pappus,亚历山大学派最后一位伟大的几何学家,就曾在他恢弘的八卷本《数学汇编》中描述了其中的一种法则,他将它称为“分析与综合”,大意如下:
首先我们把需要求解的问题本身当成条件,从它推导出结论,再从这个结论推导出更多的结论,直到某一个点上我们发现已经出现了真正已知的条件。这个过程称为分析。有了这条路径,我们便可以从已知条件出发,一路推导到问题的解。
波利亚在他的三卷本中把这种做法叫做Working Backwards(倒过来解)。
笛卡尔也曾经试图将人类思维的规则总结为36条(最终完成了21条)。莱布尼兹,现代计算机实质上的发明者,也说到:
在我看来,没有什么能比探索发明的源头还要重要,它远比发明本身更重要。
再后来,捷克数学家波尔查诺也试图总结人类思维的本质规律,他在他的著作《科学的理论》中写道:
我根本不奢望自己能够提供任何超于其他天才所使用过的科学探索方法之外的新方法,从这个意义上,你别指望能在书中看到什么新的东西。但是,我会尽我的全力去总结所有伟大的思想者们共有的、思维的原则和方法,我认为即便是他们自己在思考的时候也未必全都意识到自己在使用什么方法。
再后来,就到了近代,随着科学技术的进步,心理学最活跃的子学科——认知科学——开始辉煌起来,人类开始向思维乃至自我意识的物质基础发起进攻。两位多才多艺的计算机科学家兼认知科学家,Herbert Simon(另外还是经济学家)和Allen Newell写出了世界上第一个一般性解题机的程序(GPS),虽然GPS只能解决很狭窄的一类问题,但这是第一个将“问题解决策略”和“知识”分离开来的程序。显然,在知识之外,人类的思维是有着一些一般性的指导规则的。事实上,波利亚在《数学与猜想》中写道,欧拉是最重数学思维的教学的,欧拉认为如果不能把解决数学问题背后的思维过程教给学生的话,数学教学就是没有意义的。
一些方法
这些一般性的思维方法,就是波利亚用了整整三本书,六卷本(《How To Solve It》、《数学的发现》、《数学与猜想》)来试图阐明的。波利 亚的书是独特的,从小到大,我们看过的数学书几乎无一不是欧几里德式的:从定义到定理,再到推论。是属于“顺流而下”式的。这样的书完全而彻底的扭曲了数学发现的真实过程。举个例子,《证明与反驳:数学发现的逻辑》在附录一中讲了一个非常有趣的例子:柯西当年试图将函数的连续性从单个函数推广到无穷级数上面去,即证明由无穷多个连续函数构成的收敛级数本身也是一个连续的函数,柯西给出了一个巧妙的证明,似乎漂亮地解决了这个问题。然而傅立叶却给出了一个噩梦般的三角函数的收敛级数,它的和却并不是连续的。这令柯西大为头疼,以至于延迟了他的数学分析教程的出版好些年。后来,赛德尔解决了这个问题:原来柯西在他看似无懈可击的证明中非常隐蔽(他自己也不知觉的情况下)引入了一个潜在的假设,这个假设就是后来被称为的“一致收敛”条件。当时我看到这里就去翻我们的数学分析书,发现“一致收敛”这个概念第一次出现的时候是这样写的:定义:一致收敛...
所以说,从这个意义上,《数学,确定性的丧失》从历史的角度再现了真实的数学发展过程,是一本极其难得的好书。而事实上,从真实的数学 历史发展的角度去讲授数学,也是数学教学法的最佳方法。不过,《数学,确定性的丧失》的弱点是并没有从思维的角度去再现数学发现的思维过程,而这正是波利亚所做的。
总结波利亚在书中提到的思维方法,尤其是《How To Solve It》中的启发式思考方法,有这样一些:
以上是我认为最重要的,也是最具一般性的、放之四海都可用的思维法则。一些更为“问题特定”的,或更为现代的启发法,可以参见《如何解题:现代启发式方法》以及所有的算法书。不过,在结束这一节之前,还有两个有趣的启发法值得一提:
除了波利亚的书之外,陶哲轩的《Solving Mathematical Problems》也对解题的启发式思路作了极有意义的介绍,他在书的第一章遵循波利亚的思路从一个具体的题目出发,介绍了如何运用波利亚在书中提到的各种启发式方法来对解题进行尝试。
一点思考
1. 联想的法则
人类的大脑是一个复杂而精妙的器官,然而某种程度上,人类的大脑也是一个愚蠢的器官。如果你总结过你解过的一些有意义的好题目,你会发现它们有一个共同点:没有用到你不知道的知识,然而那个最关键的、攸关成败的知识点你就是想不到。所以你不禁要问,为什么明明这个知识在我脑子里(也就是说,明明我是“能够”解决这个问题的),但我就是没法想到它呢?“你是怎么想到的?”这是问题解决者最常问的一个问题。甚至对于熟练的解题者来说,这个问题的答案也并不总是很明确的,很可能他们自己也不清楚那个关键的想法是怎么“蹦”出来的。我们在思考一个问题的时候,自己能意识到的思维部分似乎是很少的,绝大多数时候我们能感知到的就是一个一个的转折点在意识层面显现,我们的意识就像一条不连续的线,在其上的每一段之间那个空档内发生了什么我们一无所知,往往我们发现被卡在一个地方,我们苦思冥想,然后一个知识(也许是一个性质,也许是一个定理)从脑子里冒了出来,或者说,被我们意识到,然后我们沿着这条路走一段,然后又卡住,然后又等待一个新的关键知识的出现。而至于这些知识是怎么冒出来的?我们可以对它们的“冒出来”提供怎样的帮助?我们可以在意识层面做一些工作,帮助我们的下意识联想到更多重要的知识吗?那些灵光一现的瞬间,难道只能等待它们的出现?难道我们不能通过一些系统化的步骤去“捕获”或“生成”它们?又或者我们能不能至少做些什么工作以使得它们更容易发生呢?
正如金出武雄在《像外行一样思考,像专家一样实践》中所说的,人类的灵感一定是有规律的,认知科学目前至少已经确认了人类思维的整个物质基础——神经元。而既然它们是物质,自然要遵循物质的运行规律。只不过我们目前还没有窥破它们,但至少我们可以确信的是,它们在那里。事实上,不需要借助于认知科学,单单是通过对我们自己思维过程的自我观察,也许就已经能够总结出一些重要的规律了,也许,对自身思维过程的反观真的是人有别于其它动物的本质区别。
《专注力》当中有这样一个例子:一天夜里,你被外面的吵闹声叫醒了,你出去一看,发现有一群人,其中有一个人开着很名贵的轿车,他跟你说他们正在玩一个叫“拾荒者”的游戏,由于一些原因,他必须要赢这个游戏,现在他需要一块1.5m*1m的木板,如果你能帮忙的话,愿以一万美元酬报。你怎么办?被测试的大多数人都没有想到,只要把门拆给他就可以了(如果你想到了,祝贺你:-)),也许你会说现在的门都是钢的,没关系,那你有没有想到床板、立柜的门、大桌子的桌面之类的?这个问题测试的就是心理学上所谓的“范畴陷阱”,“木板”这个名词在你脑子里的概念中如果是指“那些没有加工的,也许放在木材厂门口的,作为原材料的木板”的话,那么“木板”就会迅速在你的下意识里面建立起一个搜索范畴,你也会迅速的反应到“这深更半夜叫我上哪去找木板呢?”如果你一下就想到了,那么很大的可能性是“木板”这个概念在你脑子里的范畴更大,更抽象,也许包含了所有“木质的、板状的东西”。
这就是联想的法则。
我们的大脑无时无刻不在对事物进行归类,实际上,不仅是事物,一切知识,都在被自动的归类。在有关对世界的认知方面,被称为认知图式,我们根据既有的知识结构来理解这个世界,会带来很大的优势。实际上,模块化是一个重要的降低复杂性的手段。然而,知识是一把双刃剑,一方面,它们提供给了我们解决问题的无以伦比的捷径优势,“砖头是砌墙的”,于是我们遇到砌墙这个问题的时候就可以迅速利用砖头。然而另一方面,知识却也是思维的桎梏。思维定势就是指下意识遵循既有知识框架思考的过程。上面的那个木板的例子也是思维定势的例子。每一个知识都是一个优势,同时又是一个束缚。著名的科幻作家阿瑟·克拉克有一句名言:如果一位德高望重的老科学家说某个事情是不可能的,那么他很可能是错的。所以,如何在获取知识优势的同时,防止被知识束缚住,是一门技术。
掌握这门技术的钥匙,就是抽象。在吸收知识的时候进行抽象,同时在面对需要用到知识的新问题时也要对问题进行抽象。就以大家都知道的“砖头”有多少种用途为例,据说这道题目是用于测试人的发散思维的,能联想到的用途越多,思维定势就越小。实际上,借助于抽象这个利器,这类题目(乃至更广的一类问题)是可以系统性的进行求解的,我们只需对砖头从各个属性维度进行抽象。譬如,砖头是——长方形的(长方形的东西有什么用途?还有哪些东西也是长方形的,它们都有什么用途?)、有棱角的(问题同上)、坚硬的、固体、有一定大小的体积的、红色的、边界线条平直的、有一定重量的...对于每一个抽象,我们不妨联想还有其他什么物体也是具有同样抽象性质的,它们具有同样的用途吗?当然,除了抽象之外,还有“修改”,我们可以在各个维度上对砖头的属性进行调整,以期得到新的属性:譬如大小可以调整、固体可以调整为碎末、棱角可以打磨、重量也可以调整、形状也可以调整...然后看看新的属性可以如何联想开去。
除了这个简单的例子之外,我们也不妨看一看一些算法上的例子,同样一个算法,不同的人来理解,也许你脑子里记得的是某个特定的巧妙技巧(也许这个技巧在题目的某步关键的地方出现,从而带来了最令人意外的转折点),然而另一人个记得得也许是“递归”这种手法,还有另外一个人记得的也许是“分治”这种更一般化的解题思路。从不同的抽象层面去掌握这道题目的知识信息,以后遇到类似的问题,你能够想起这道题所提供的知识的可能性是有极大的差异的。《Psychology of ProblemSolving》的第11章举了这样一个例子:先让被试(皆为大学生)阅读一段军事材料,这个材料是说一小撮军队如何通过同时从几个不同方向小规模攻击来击溃一个防守严实的军事堡垒的。事实上这个例子的本质是对一个点的同时的弱攻击能够集聚成强大的力量。然后被试被要求解决一个问题:一个医生想要用X射线杀死一个恶性肿瘤,这个肿瘤只可以通过高强度的X射线杀死,然而那样的话就会伤及周围的良好组织。医生应该怎么办呢?在没有给出先前的军队的例子的被试中只有10%想到答案,这是控制基线。然后,在先前学习了军队例子的被试中,这个比例也仅仅只增加到30%,也就是说只有额外20%的人“自动”地将知识进行了转移。最后一组是在提醒之下做的,达到了75%,即比“自动”转移组增加了45%之多。这个例子说明,知识的表象细节会迷惑我们的眼睛,阻碍我们对知识的运用,在这个例子中是阻碍问题之间的类比。
而抽象,则正是对非本质细节去枝减叶的过程,抽象是我们在掌握知识和解决问题时候的一把有力的奥卡姆剃刀。所以,无论是在解题还是在学习的过程中,问自己一个问题“我是不是已经掌握了这个知识最深刻最本质的东西”是非常有益的。
2. 知识,知识
如果你是一个熟练的解题者,你也许会发现,除了一些非常一般性的、本质的思维法则之外,将不同“能力”的解题者区分开来的,实际上还是知识。知识是解题过程中的罗塞塔碑石。一道几何题为什么欧几里德能够做出来我们不能,是因为欧几里德比我们所有人都更了解几何图形有哪些性质,借助于一个性质,他很容易就能抵达问题的彼岸;反之,对于不知道某个性质的我们,倒过来试图“发现”需要这样的性质有时几乎是不可能的。有人说数学是在黑暗中摸索的学科,是有道理的。并不是所有的问题都能够通过演绎、归纳、类比等手法解出来的。这方面,费马大定理就是一个绝好的例子,《费马大定理:一个困惑了世间智者358年的谜》一书描述了费马大定理从诞生到被解决的整个过程,事实上,通过对费马大定理本身的考察,几乎是毫无希望解决这个问题的,我们根本不能推导出“好,这里我只需要这样一个性质,就可以解决它了”,也许大多数时候我们可以,但那或者是因为我们有已知的知识,或者这样的归约很显然。而对于一些致命的问题,譬如费马大定理,最重要的归约却是由别人在根本不是为了解决费马大定理的过程中得出来的。运气好的话,我们在既有的知识系统中会有这样的定理可以用于归约,运气不好的话,就得去摸索了。
所幸的是,绝大多数问题并不像费马大定理这样难以解决。而且绝大多数问题需要用到的知识,在现有的知识系统里面都是存在的。我们只要掌握得足够好,就有希望联想起来,并用于解题。
当然,也有许多题目,求解它们的那个关键的知识可以通过考察题目本身蕴涵的条件来获得,这类题目就是测试思维本身的能力的好题目了。而如果这个性质根本无法通过对题目本身的考察得出来,那么这个题目测试的就是知识储备以及联想能力。
3. 好题目、坏题目
在我看来,好题目即测试一个人思维的习惯的题目(因为知识性的东西是更容易弥补的,尤其是在这样一个年代;而好习惯不是一朝一夕养成的),它应有这样一些性质:
而坏题目呢:
出题的误区:
4. 一个好习惯
在解题的过程中,除了必要条件——知识储备——之外,对于一些并不涉及什么你不知道的定理的题,很大程度上就要看思维能力或者习惯了。而在思考一个问题的时候,最容易犯的一类错误就是忘了考虑某种可能性,不管这种可能性是另一种做法(譬如只顾着构造一个能一步得出结果的算法,没记得还可以从错误情况逼近。譬如只顾着正着推导,却忘了可以反过来推。只顾着反过来推,居然忘了可以考察简单特例。试了各种手法,却发现忘了考虑题目的某个条件。觉得试遍了所有可能性,已经走不下去了,然后其实在思维的早些时候就已经落入了思维陷阱。等等)事实上,即便是一个熟练的解题者也容易犯顾此失彼的问题,因为我们一旦意识到一个看似能够得到结论的解法,整个注意力就容易被吸引过去,而由于推导的路径是很长的,所以很容易在一条路上走到黑,试图再往下走一步就得出解。却忘了回过头来看看再更高的层面上还有没有其它手法,思路上有没有其他可能性。
而对于像我这样目前尚不谙熟所有思维方法的人来说,则更容易犯这样的错误。为了避免这样的错误,一个有效的办法就是将自己的思考过程(中的重要环节)清晰的写在纸上(称为“看得见的思考”),这有如下几个好处:
一句结尾
“我想我就在这里结束”——如果你知道我在说什么的话:-)
联系客服