《How to Solve It》的原文摘录
每当求解一个问题的时候,我们都要认识到我们只是在找该问题的模型的解。而所有问题都只是实际问题的一个简化,否则它们就会像问题本身一样复杂和令人迷惑。求解问题的过程包含两个独立的一般步骤:(1)抽象出问题的模型;(2)用这个模型来找到解。即:
问题→模型→解。
这里的“解”只是模型的解。如果模型有高度精确性,那么由其得出的解会更有意义。相反,如果模型具有太多不能满足的假设条件和大量的估计数据,那这个解可能就毫无意义甚至更糟。 (查看原文 )
如果你都忘了你要证明什么了,那你最好看电视去。因为做这两件事对你来说解题成功率都一样:是0!记得紧紧扣住最终结果。要时常问问你自己所做的是否是朝着你想要的方向走。 (查看原文 )
既然你被叫去解决问题,你就要证明你能解决它。 (查看原文 )
帮助你迈出第一步的方法是理解搜索空间:有哪些变量?他们的可能值是什么?有什么约束?最重要的是:不要偏离原题。 (查看原文 )
如果我们真正地理解了问题,
就会自然而然得到答案,
因为答案和问题总是分不开的。
——克里希那穆提《企鹅读本》 (查看原文 )
解空间是搜索空间(search space)S的一个子集,我们要找的可行解,是那些满足约束条件的解。 (查看原文 )
求解一个问题有多种方法。为了有效地解决问题,特别是当可能解的域非常大时,你就要用系统的方法来组织搜索。 (查看原文 )
顾名思义,穷举搜索(exhaustive search)就是检查空间中的每一解直至找到最好的全局解。也就是说,如果不知道最好的解到底是什么,那么采用穷举搜索时,将无法确认已经找到最优解,除非已经对所有解进行了检查。难怪它叫“穷举”! (查看原文 )
如果要解决的是一个小问题并且有时间去枚举出整个搜索解空间时,保证你能用穷举法找出最优解。但如果面临一个较大的问题,请不要用这种方法,因为你永远也无法列举万所有情况。 (查看原文 )
也可以不对整个解空间进行穷举搜索,而只针对于某个特定解的局部领域。这个过程可用以下四步来说明:
1.在搜索空间中找一个解并评估其质量,将它定义为当前解;
2.变换当前解为一个新解并评估它的价值;
3.如果新解比当前解更好,则将当前解用新解替换,否则抛弃新解;
4.重复第2步第3步直至在给定集中找不到改进解。 (查看原文 )
然而这个解的质量很大程度上取决于你所选取的算法与问题的匹配程度。 (查看原文 )
求解这个问题,重要的是要记住减小搜索区间的方法。解答这个题目使我们了解了这类问题的特征,并且开拓了只考虑部分可能解的新思路。再次强调,关键是不要放弃!不是万不得已的话不要放弃追求完美解的做法。 (查看原文 )
贪婪算法(greedy algorithm)通过一系列步骤构造完整解来解决问题。这个算法之所以流行的原因很明显:简单!贪婪法的基本思想出奇的简单:一个一个地为所有变量赋值,在每一步做出最佳的决定。当然,这个过程假定了一种决策的启发式思想,即在每一步做最好的移动,以获得最大的“好处”,这就是“贪婪”这个名字的来由。但是这种方法也是目光短浅的,因为每一步做出最佳决定并不一定最终能得到全局最优解。 (查看原文 )
有时候把一个看似复杂的问题,分解成若干个较小的问题来求解是一个很好的办法。你可以逐个地求解这些较简单的问题,然后找一种方法将各部分的解组合成一个完整的答案。这种“分而治之”(divide and conquer,简称D&C)的方法,只有在当把这个问题分解、求解各个小问题再组合它们的解所花费的总时间和工作量比起直接包含所有内在复杂性的原始问题少时代价才是有效的。 (查看原文 )
动态规划法(dynamic programming)的原理是:在求解问题的过程中,通过处理位于当前位置和所达目标之间的中间点来找到整个问题的解。整个过程是递归的,每下一个中间点都是已访问过的点的一个函数。 (查看原文 )
本章将要讨论的方法分别基于(1)一个附加参数(叫做温度)用于改变从搜索空间一个点移动到另一个点的概率;(2)一个记忆装置,用于驱使算法探索搜索的新区域。这两种算法分别叫做:模拟退火(Simulated Annealing,简称SA)和禁忌搜索(tabu search)。 (查看原文 )
我们认为人们不愿意做证明题仅仅是因为大多数人没有做过证明题并且不知道从何着手。由此看出,许多问题看起来困难仅仅是因为面临问题时遇到了“我应该从哪儿开始?”的困难。 (查看原文 )
问题和方法的关系应该通过对问题而不是对方法的讨论而得到。长远来说,不这样做弊大于利,因为象所有像 “分发品”,它使得学生不能够独立地思考问题。 (查看原文 )