简介

爬山算法是一种局部择优的方法,采用启发式方法,是对深度优先搜索的一种改进,它利用反馈信息帮助生成解的决策。

直白地讲,就是当目前无法直接到达最优解,但是可以判断两个解哪个更优的时候,根据一些反馈信息生成一个新的可能解。

因此,爬山算法每次在当前找到的最优方案 附近寻找一个新方案。如果这个新的解 更优,那么转移到 ,否则不变。

这种算法对于单峰函数显然可行。

Q:都知道是单峰函数了为什么不三分呢?

A:爬山算法的优势在于当正解的写法你并不了解(常见于毒瘤计算几何和毒瘤数学题),或者本身状态维度很多,无法容易地写分治(例 2 就可以用二分完成合法正解)时,可以通过非常暴力的计算得到最优解。

但是对于多数需要求解的函数,爬山算法很容易进入一个局部最优解,如下图(最优解为 ,而爬山算法可能找到的最优解为 )。

具体实现

爬山算法一般会引入温度参数(类似模拟退火)。类比地说,爬山算法就像是一只兔子喝醉了在山上跳,它每次都会朝着它所认为的更高的地方(这往往只是个不准确的趋势)跳,显然它有可能一次跳到山顶,也可能跳过头翻到对面去。不过没关系,兔子翻过去之后还会跳回来。显然这个过程很没有用,兔子永远都找不到出路,所以在这个过程中兔子冷静下来并在每次跳的时候更加谨慎,少跳一点,以到达合适的最优点。

兔子逐渐变得清醒的过程就是降温过程,即温度参数在爬山的时候会不断减小。

关于降温:降温参数是略小于 的常数,一般在 中选取。

例题

给出 维空间中的 个点,已知它们在同一个 维球面上,求出球心。,坐标绝对值不超过

个点的带权类费马点。

优化

很容易想到的是,为了尽可能获取优秀的答案,我们可以多次爬山。方法有修改初始状态/修改降温参数/修改初始温度等,然后开一个全局最优解记录答案。每次爬山结束之后,更新全局最优解。

这样处理可能会存在的问题是超时,在正式考试时请手造大数据测试调参。

劣势

其实爬山算法的劣势上文已经提及:它容易陷入一个局部最优解。当目标函数不是单峰函数时,这个劣势是致命的。因此我们要引进 [[模拟退火|模拟退火]]。