问题解决与计算机算法

我们时时刻刻都在解决不同的问题,隐形或者显性的,长期或者短期,紧急或者迟缓的。

我们是如何解决这些问题的呢?如果我们对这些待解决的问题加以考察就会发现,所有的问题都带有明确的目标导向,我们可以将问题最初的状态成为初始状态,目标结果称为目标状态,中间过程成为中间状态。从初始状态到达目标中间所有可能的路径成为问题的解空间,使问题从一种状态转移到另一种状态的方法可以称为算子,随后问题的解就是这些算子的有效排列。人类解决问题的过程就可以看作是在解空间内进行搜寻,每一条可行路径都对应着问题的解法。

这种看法十分类似于计算机算法当中的搜索算法。以走迷宫问题为例。初始状态是妻子置于初始位,最终问题状态是棋子移动到迷宫的出口,从初始到结束所有可能的上下左右移动的状态组合就构成了问题的解空间。每种通往迷宫出口的路径都是合理的路径。

我们在问题解决的时候并不会对每种可能路径都同等考虑,那样将过于复杂耗时。更多时候我们是凭借经验和知觉选择路径,计算机算法同样如此。有时候我们想要解决的问题的解空间有时候过于巨大,比如围棋,黑白两方的棋子都可以下载棋盘的任何位置,计算机不可能遍历所有路径,因此算法需要对可能路径的搜索进行优化,剪枝大部分路径从而使问题可能计算完成。

算子用于代表我们解决问题的具体步骤和办法。学习新算子第一种方法是发现。当我们在问题空间中随机行走的时候有可能会得到问题的正确解答,如此我们便发现了解决问题有效算子和路径。第二种方法通过他人传授或者观察实例得到。获得新算子的另一种常见途径是类比。在一个问题中行得通的算子在另一个相似甚至完全不同的问题中同样有可能行得通,这样的算子应用就是类比。

实际上,在面对问题的时候,我们的问题有可能不是没有算子,而是由多宗算子可以选择。那么如何找到正确的算子呢?一个普遍的原则是差异降低。也就是说,选择最大限度地减少当前状态与目标状态之间的差异的非重复算子。差异降低原则和机器学习中的梯度递降原则类似:沿着梯度最小的方向,也就是离目标变化最快的方向移动。但同时我们也知道梯度递降的一个问题是可能得到局部最优解而不是全局最优解。而有时候为了得到全局最优解需要选择并非当前最快的路径,梯度递降法就有问题了。在人类解决问题的过程中这样的原则同样适用:在适当的时候选择长期最佳策略而非短期最佳策略更好。

另一个主要方法是手段-目的分析,即创造一个新目标使得算子得以运用。比如说如果发现解决一个问题的关键在于创造某个条件,那么目标就变成了创造这个条件,这样新目标就产生了,运用这个关键条件解决原有问题的算子就得以运用了。和差异降低相比,手段-目的的优点在于其分析不会马上丢弃当前不能得到应用的算子。比如如果一个算子暂时不能得到应用,手段-目标分析会聚焦于如何使算子起作用,即消除组织一个算子得到应用的差异。以消除这种差异为目标的子目标称为算子子目标。

手段-目的分析对于我们解决问题有什么启示呢?手段-目的分析提供了一种非常有用的解决问题的框架。在这种框架之下,我们首先考虑当前状态与目标状态的差异,然后聚焦于消除差异,并将消除这些差异当做子目标,在解决子目标的过程中我们会遇到新的差异,然后我么不断重复子目标-差异消除的过程一直到当前状态和目标状态一致。

这样的模型在解决一般问题的过程中固然有用,但是往往我们会遇到一些困难。比如如何找到目标状态和当前状态的真正差异。假设我的目标是成为一个优秀的工程师,那么成为一个优秀的工程师需要哪些技能,这些技能和我当前的技能的差异在哪里呢等等。在很多情况下我们并不真正清楚目标状态的定义是什么,更不清楚目标状态和当前状态的差异是什么。在了解真是的差异之前就贸然采取行动缩小差异可能是在缘木求鱼。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s