一。介绍
爬山算法是一种局部择优的方法,采用启发式
方法,是对深度优先搜索
的一种改进,它利用反馈信息
帮助生成解的决策。 属于人工智能算法的一种。从当前的节点开始,和周围的邻居节点的值进行比较。 如果当前节点是最大的,那么返回当前节点,作为最大值(既山峰最高点);反之就用最高的邻居节点来,替换当前节点,从而实现向山峰的高处攀爬的目的。如此循环直到达到最高点。
爬山算法 ( 𝐻𝑖𝑙𝑙 𝐶𝑙𝑖𝑚𝑏𝑖𝑛𝑔 ), 是一种局部寻优算法。其本质上是沿着梯度方向进行寻优。关于爬山法的讲解已有无数的优质文章了。本文主要讲解,使用爬山法进行局部寻优时,如何处理局部边界问题,以及遇到局部最优值如何逐步逼近局部最优值,而不是反复横跳。
本文验证案例为: 𝑓(𝑥1,𝑥2)=−(𝑥1−5)2−(𝑥2−5)2 在 [0,10]×[0,10] 上的最大值,以及, 𝑓(𝑥1,𝑥2)=𝑥12+𝑥22 在 [0,10]×[0,10] 上的最大值。很显然我们容易知道上述两个案例的结果分别是 (5,5),(10,10) 。
二。分析
我们先来简单回顾一下,爬山法的一般过程。假定目标函数为 𝑓(𝑥1,𝑥2,⋯,𝑥𝑛) ,
step1: 随机选定初始出发点 𝑋0=(𝑥10,𝑥20,⋯,𝑥𝑛0) ,
step2: 计算函数 𝑓 在 𝑋0 处的梯度 Δ𝑓=(∂𝑓∂𝑥1,∂𝑓∂𝑥2,⋯,∂𝑓∂𝑥𝑛) ,
step3: 向梯度方向更新当前点,
step4:计算容差, 判断是否接受新解。
我们通过数次以上的操作,数据点会越来越逼近局部最优值。很显然,对于step1, step2, step4,相应的操作比较简单。 下面,我着重讲解在局部寻优时,如何处理step3。
传统的梯度下降法,是采用计算出来的梯度 Δ𝑓 乘上一个学习率 𝜎 ,来作为数据点更新的方向,即
𝑋1=𝑋0+𝜎Δ𝑓𝑋0
这样对于有边界约束的函数来说,当出现很大的梯度值时,便会导致越界问题。我采用,如下方式改进。
假设 𝑋𝑚𝑎𝑥=(𝑥𝑀1,𝑥𝑀2,⋯,𝑥𝑀𝑛) , 𝑋𝑚𝑖𝑛=(𝑥𝑚1,𝑥𝑚2,⋯,𝑥𝑚𝑛) 分别为各个变量的取值范围的上下限。设 𝐷 为更新的方向, 𝐷 由如下获得,
𝐷[ǔ