GRASP优化算法原理梳理和应用细节

简介: GRASP优化算法原理梳理和应用细节

1、简介-Introduction



GRASP(Greedy Randomized Adaptive Searh Procedures)是一个用于求解组合优化问题的multi-start元启发式算法,每一次迭代都包含以下两个阶段:构造(construction)和局部搜索(local search)。在构造阶段会构建一个可行解,在局部搜索阶段会对可行解的邻域进行搜索直到找到局部最优解。


上述是基本GRASP的思路,可以采用下述几种方式对算法进行优化:Reactive GRASP,cost perturbation,bias function,memory and learning,path-relinking。同时,GRASP可以采用同步策略,使用多线程方法加快最优解寻优速度。




2、算法流程和概念引入


GRASP的整体流程如下图所示:


42b1061ab2544d2e8cbefb359ddd7418.png

其中Max_Iteration表示最大的迭代次数,seed表示随机数种子,第5行代码表示若找到更好的解则对当前最优解进行更新。


下图是构造(construction)阶段流程的伪代码:

f9510bcb5f704a7f9137f625a3b12238.png


在贪婪构建解的过程中,伪代码第5行中需要构建有限候选集合-RCL,使用贪心函数来构建RCL,简答来说就是将某个没有加入到解中的元素添加当前解之中,衡量元素加入到解前后的变动成本,之后设置一个阈值或者数量限制,将变动成本(或总成本)最小的一些元素选入到RCL中。之后从RCL中随机选择一个元素来继续构建解方案,之后在下一次构建时再重新进行RCL的构建,直到所有的元素均在解方案之中。


下图是局部搜索(Local Search)阶段流程的伪代码:


1e7bdcc4141c4b7bb6151519c178529a.png


局部搜索(LS)对构造的解Solution进行邻域N(Solution)的搜索,若找到优于Solution的解,则进行最优解的替换,直到找到局部最优解。


在使用邻域搜索时,使用的策略包括best-improving和first-improving两种,有相关研究发现使用first-improving在跳出局部最优解和求解时间方面比较有优势。




3、RCL的构建细节和技巧


GRASP算法比较重要的部分是每一次优化初始解的构建,一个好的初始输入可以使得LS搜索更加有效率,增加最优解找到的几率和缩短求解时间。而在解构造的过程中,RCL的构建和保留又是至关重要的一个环节。下面详细描述几种不同方式的RCL构建方式。


3.1 静态构建RCL


定义 c(e)表示加入一个元素  e到解之后的变动成本,RCL中包含拥有最优 c(e)的一定数量  p的所有的元素 e。通常的做法是依靠变动成本c(e)的质量来确定数量 p。下面引入一个阈值参数 α \alpha α来限定数量 p。规定可以加入到RCL中的元素必须满足下式:


c(e)[cmin,cmin+α(cmaxcmin)]



可以发现当参数 α = 0 \alpha = 0 α=0,RCL中只有一个最优元素,则构造过程变为一个完全贪婪构造;当 α = 1 \alpha = 1 α=1时,RCL包含所有可行的元素,则构造过程变为一个完全随机构造。所以依靠参数 α \alpha α便可以控制构造过程的随机性和贪婪性的比例。根据文献中的实践,参数 α \alpha α的取值为0.8时,可以得到较好的构造解。




3.2 基于均匀分布构建RCL


由于使用单一的参数 α \alpha α往往不能找到高质量的解,所以提出采用一系列不同的 α \alpha α值来增大随机性,扩大搜索的广度。首先定义

Ψ=α1,...,αm表示一系列参数 α \alpha α的可能取值,均匀分布的意思是这些不同取值的 α \alpha α被选到的概率均为  1/m。


3.3 非均匀离散分布构建RCL


和上述均匀分布类似,但不同取值的 α \alpha α被选到的概率基于实现分配,同时这些概率互不相同,下述是一种分配方式:

18cebdb8956a4377a18a0a998e522a23.png


3.4 Reactive GRASP


在这种方式下,参数 α \alpha α的取值不是固定的,而是根据求解的结果进行动态自适应调整的。


同样令 Ψ=α1,...,αm表示参数 α \alpha α所有可能的取值,而选择每一个取值的概率初始化为pi=1/m,i=1,..,m。令 z^* 表示当前解的目标函数值,令  Ai表示使用每一个 α i \alpha_i αi所求得的目标函数值的平均值,初始化 A i A_i Ai的值为初始解的值。在每一次局部搜索结束之后,首先更新 Ai的值,之后计算 qi=z∗/Ai,for i=1,...,m,最后更新选择每一个 α i \alpha_i αi被选到的概率:pi=qi/∑j=1mqj。




4、Bias Function


在标准GRASP框架之中,构建完RCL集合之后,会从中随机选取一个元素来继续构建解方案,但是其实可以采取更加有效的方式,例如以一定概率首先选取更好的元素,来bias这个选择的过程。要应用Bias Function首先需要根据贪心函数求得的 c ( e ) c(e) c(e)给所有的元素 e e e一个等级 r ( e ) r(e) r(e),之后可以采取的Bias Function有以下几种:


   random bias:bias(r)=1;

   linear bias:  bias(r)=1/r;

   log bias: bias(r)=log−1(r+1)

   exponential bias: bias(r)=e−r

   polynomial bias of order n:  bias(r)=r−n



利用上述某种规则计算出来所有元素的bias值之后,选择某个元素        e的概率计算如下所示:


image.png

5、Path Relinking


路径重连算法从一个或者多个精英解出发,通过对比精英解之间的共有特性来构建新的解,以求能够得到更好的解。在选定两个精英解初始解(initial solution)和导向解(guiding solution)之后,路径重连算法通过探索初始解的邻域,寻找这些邻域中和导向解有相似部分的邻域进行计算,最终判断是否能获得更优的解。路径重连详细内容够可以参见微博: 路径重连(Path Relinking)算法简介。



6、并行GRASP(parallelism)


采用多线程的编程方式来加快最优解的寻找速度,可以有以下两种方式来应用并行策略,一种为独立线程方式mtltiple-walk independent thread strategy,另一种为合作线程方式mtltiple-walk cooperative thread strategy。



6.1 mtltiple-walk independent thread strategy


这是一种比较容易实现的多线程求解方式,对于每个优化过程开一个独立的线程进行运算,开一个总的线程来记录最优解即可。这种方式由于不需要线程之间共享信息,所以比较容易设计和实现。在某个线程找到更优解之后,所有的线程都暂停求解,更新每一个线程中的最优解为当前找到的最优解。



6.2 mtltiple-walk cooperative thread strategy


这种多线程方式涉及到线程之间共享信息,所以操作会更加复杂。一种共享信息的方式是通过路径重连算法来实现。实现方式是:给所有的线程建立一个共享的精英解池,之后在每一个线程应用路径重连技术的时候,都会从共享精英解池中选取精英解和自己的当前解进行路径重连探索。
















相关文章
|
2天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
105 80
|
2天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
27 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
1天前
|
算法 Java 数据库
理解CAS算法原理
CAS(Compare and Swap,比较并交换)是一种无锁算法,用于实现多线程环境下的原子操作。它通过比较内存中的值与预期值是否相同来决定是否进行更新。JDK 5引入了基于CAS的乐观锁机制,替代了传统的synchronized独占锁,提升了并发性能。然而,CAS存在ABA问题、循环时间长开销大和只能保证单个共享变量原子性等缺点。为解决这些问题,可以使用版本号机制、合并多个变量或引入pause指令优化CPU执行效率。CAS广泛应用于JDK的原子类中,如AtomicInteger.incrementAndGet(),利用底层Unsafe库实现高效的无锁自增操作。
理解CAS算法原理
|
3天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
15 6
|
8天前
|
机器学习/深度学习 前端开发 算法
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
37 3
|
8天前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
23 2
|
20天前
|
算法
基于WOA鲸鱼优化的购售电收益与风险评估算法matlab仿真
本研究提出了一种基于鲸鱼优化算法(WOA)的购售电收益与风险评估算法。通过将售电公司购售电收益风险计算公式作为WOA的目标函数,经过迭代优化计算出最优购电策略。实验结果表明,在迭代次数超过10次后,风险价值收益优化值达到1715.1万元的最大值。WOA还确定了中长期市场、现货市场及可再生能源等不同市场的最优购电量,验证了算法的有效性。核心程序使用MATLAB2022a实现,通过多次迭代优化,实现了售电公司收益最大化和风险最小化的目标。
|
20天前
|
算法
通过matlab对比遗传算法优化前后染色体的变化情况
该程序使用MATLAB2022A实现遗传算法优化染色体的过程,通过迭代选择、交叉和变异操作,提高染色体适应度,优化解的质量,同时保持种群多样性,避免局部最优。代码展示了算法的核心流程,包括适应度计算、选择、交叉、变异等步骤,并通过图表直观展示了优化前后染色体的变化情况。
|
22天前
|
存储 人工智能 缓存
【AI系统】布局转换原理与算法
数据布局转换技术通过优化内存中数据的排布,提升程序执行效率,特别是对于缓存性能的影响显著。本文介绍了数据在内存中的排布方式,包括内存对齐、大小端存储等概念,并详细探讨了张量数据在内存中的排布,如行优先与列优先排布,以及在深度学习中常见的NCHW与NHWC两种数据布局方式。这些布局方式的选择直接影响到程序的性能,尤其是在GPU和CPU上的表现。此外,还讨论了连续与非连续张量的概念及其对性能的影响。
46 3
|
1天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
23 0