GRASP,这个算法的名字取得真好。
GRASP在许多组合优化问题中都有应用。
GRASP是一个多起点的迭代过程,每一次迭代由两个阶段组成:一是产生可行解的构造阶段;二是寻找局部最优解的局部搜索阶段。如果局部最优解S比当前搜索到的最优解S*还要优的话,就更新S*。
该算法的基本架构如下:
Max_Iterations是迭代次数
迭代之前先贪心随机构造一个解
然后判断可不可行:若不可行,则进入Repair函数进行修正
对可行解进行局部搜索
局部搜索过程中更新解
构造阶段的伪代码如下:
在每次迭代之前,初始化可行解S为空,并且初始化候选集C并对候选集的每一个元素进行评估,作为进入限制候选列表的依据。每次迭代从候选集中选部分元素构成限制候选列表RCL。每次从限制候选列表RCL中随机选择一个元素与可行解S进行合并,然后更新候选集的元素,同时对里面的每一个元素进行重新评估。
影响GRASP性能的因素
1.参数α的选择
α = 1,对应完全随机的过程
α = 0,对应完全贪心的过程
2.RCL的大小
如果RCL中含有很多元素,就会产生很多不同的解,产生解的范围就比较大。设置RCL的大小可以采用动态调整法,即根据候选集C中满足给定条件的元素个数动态调整RCL的大小。这是GRASP算法中自适应功能的体现。
3.贪心函数
贪心函数用来评估每一个候选元素,结果作为进入RCL的依据。
局部搜索阶段的伪代码如下:
GRASP算法构造阶段得到的可行解质量通常不高,所以要在该可行解的邻域内进行局部搜索。
基本思想是以持续不断的迭代方式在可行解的邻域内寻找替换它的最优解。
影响局部搜索性能的两个因素:
一是邻域结构
二是选择相邻解的策略:有最优适应和首次适应两种。最优适应策略要求所有的相邻解都被考察之后将最优解的相邻解替换可行解。首次适应策略则是,当第一次搜索到比可行解好的相邻解释,则用该相邻解替换可行解,并以此作为新的起点进行局部搜索。
参考资料:
M. G. C. Resende and C. C. Ribeiro (2003) Greedy randomized adaptive search procedures. In F. Glover and G. Kochenberger, editors, Handbook of Metaheuristics, pp. 219–249, Kluwer Academic Publishers, 2003.