拓扑启发式
最简单的启发式是拓扑启发式。它们依赖于视角的结构,从而搜索邻近的解决方案。在旅行商问题中讨论过的用于改变路线的那几种启发式,都属于拓扑启发式,“反其道而行之”启发式也属于这一类。由视角创建的邻近结构通常隐含或暗示着若干种拓扑启发式,你只需要在“近邻”当中搜索即可。例如,本杰里公司既然将冰激凌杯摆列成了网格状,他们就肯定要考虑在某一杯冰激凌四周的冰激凌。计算机科学家将这些“近邻”称为“冯·诺依曼邻居”,目的是纪念约翰·冯·诺依曼(见图2-2)。
图2-2 S的冯·诺依曼邻居
拓扑启发式有效地利用了嵌入在视角中的知识,搜索接近现状的解决方案。除非视角创造了富士山景观,否则拓扑启发式会陷入视角所提供的解决方案集的局部最优点上。在本杰里公司的例子中,如果某一杯口味较差的冰激凌被口味比它还要更差一点的冰激凌所包围,那么这种口味较差的冰激凌就是相对于特定启发式的局部最优点了。
尽管启发式与视角有非常大的区别,但是拓扑启发式也在一定程度上或者说在更加宽泛的意义上刻画了人们以不同方式看待世界的这个思想。拓扑启发式在不同方向上进行搜索。如果两个人在不同的方向上各自寻找解决方案,那么就可以认为他们在以不同的方式看待问题,尽管他们可能以同样的方式,也就是相同的视角来表示问题。
梯度启发式
上文中讨论过,有些问题有明确的数学表达式,但是许多其他问题却没有。刚刚描述的拓扑启发式就不需要数学表达式。只要能够测试解决方案的价值,就可以应用这类启发式。例如,我和儿子们可以将乐高雪橇放在轨道上滑行,看它们能滑多远。在那些可以用数学表达式表示价值的问题中,则可以利用梯度启发式。具体方法是,先计算出价值函数的斜率,然后沿着斜率的最大方向移动。
而且,在很多时候,还可以将梯度启发式应用于价值函数不明确的数学表达式的情况。这也就是说,一个不熟悉微积分的人,也可以表现得“似乎”懂微积分、会计算梯度。例如,我有时会打打篮球,在下场比赛之前,要先分成几支球队。由于对这类竞技游戏通常比较重视,因此希望各支球队的实力能够尽可能地均衡。各支球队的实力越接近,比赛的价值越高。但是经常会分成几支实力不均衡的球队,这导致某支球队总能轻松取胜。出现这种情况之后,我们就会寻找更公平的方法。为了平衡各支球队的实力,经常使用的一种启发式是,让“强队”中球技最好的球员与“弱队”中球技最糟糕的球员互换。这样做的时候,实际上采用的就是梯度启发式。
当一个解决方案有很多属性时,价值函数在每个属性的方向上都有斜率。例如,如果一个玉米煎饼的价值取决于它的大小和温度,那么就可以计算出,它的价值是怎样随着大小与温度的升降而变化的。在可能的解决方案空间中的任何一点上,都存在着一个方向,它会导致价值获得最大的增长。梯度能够告诉我们的就是在某个点上最陡峭的上升方向是什么。8试想一下,你正站在阿巴拉契亚山径的某个位置上,梯度将你指向所在位置附近最陡峭的斜坡。它可能位于你的左边、右边,或者就在你的前面。
说得更直白一些吧,不懂得梯度的人也就不知道哪一个方向是向上的方向。梯度启发式要求我们朝梯度指示的方向,即最陡峭的方向爬升。如果这样做,就能迅速登上山峰。但是,我们也经常会被困在局部最优点当中。只有在“富士山”景观中,梯度启发式才能发挥最大作用:爬上斜坡,登上真正的最高峰。然而,在崎岖景观中,梯度启发式却可能会把我们困在局部高峰。梯度启发式确实能找到一些高峰,但是从全局来看,这些高峰可能并不高。总体而言,梯度启发式不一定比拓扑启发式更好,而且“天下没有免费的午餐定理”依然成立。
梯度启发式的缺点是,它们会限制搜索的多样性。梯度给出了实现最大改进的唯一方向,只要每个人都拥有相同的价值函数,那么这就是最好的前进方向。但是,如果人们希望得到的东西有所不同,那么他们获得最大改进的方向、他们的梯度就可能不同。在这里看到了一个正反馈的例子。不同的价值观导致了不同的启发式。这种情况经常发生。差异往往会产生更多的差异。