IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Greedy Randomized Adaptive Search Procedure (GRASP)贪心随机自适应搜索算法 -> 正文阅读

[数据结构与算法]Greedy Randomized Adaptive Search Procedure (GRASP)贪心随机自适应搜索算法

目录

1.元启发式算法

2.GRASP

2.1伪代码

2.2 构造阶段construction

2.3 局部搜索阶段


这个算法好像提到的人不多,不知道是不是我的错觉。

它是1989年被提出的,专门用来解决组合优化问题。如果仔细看了智能算法篇1常见算法的图片,就会发现它也位列其中。

1.元启发式算法

备注:

元启发式算法一般都结合/借助了一些“知识”bias,并不是盲目的进行搜索。

元启发式方法结合了一些biases,这些偏见引导他们只考虑搜索空间的一小部分[6]。因此,他们可以从战略地寻找好的解决方案,并表现出一定的智能水平。下面是biases的分类(掌握这种思维我觉得对于设计算法也很有帮助 ):

  • 随机(random)或词典bias,其中选择的替代解是不做任何考虑的。
  • 贪婪(greedy)或简单的体面(simple decent)的bias,其中选择的解是基于目标函数的。
  • 记忆bias,当前选择解是基于之前选择的解的。
  • 经验或目标bias,其中当前选择的解是基于以前的表现。

2.GRASP

GRASP是针对组合优化问题的多起点元启发式方法,其中每个迭代基本上都包含两个阶段,即:

  1. 构造阶段construction
  2. 局部搜索阶段improvement

构造阶段构造了一个可接受的解。在局部搜索阶段,GRASP剖析这个解的邻域,更新解,直到解达到局部最优。

更直白的说,GRASP首先从问题的组成元素中构造一个解(在构造阶段),然后再“调整”这个解决方案(在局部搜索阶段)。

GRASP重复进行构建和局部搜索阶段,直到达到最大迭代次数,或找到预期的解。通常来说,最大迭代次数影响着解的质量。换句话说:总体而言,迭代次数越多,解的质量就越好。

它将把在这个过程中,获得的最好的解视为最终解。当我们需要在合理的时间内找到一个接近最优的解时(不要求全局最优),GRASP是有用的。

2.1伪代码

注意:第5行,是修复成可行解。因为一开始构造的解不一定可行。

第3行对应着构造阶段,第7行对应着改进阶段。只要有改进,就更新解。

2.2 构造阶段construction

通过多次迭代构造一个可行解,每次加入一个元素。

在每次迭代之前,初始化可行解S为空,并且初始化候选集C并对候选集的每一个元素进行评估,作为进入限制候选列表的依据。每次迭代从候选集中选部分元素构成限制候选列表RCL。每次从限制候选列表RCL中随机选择一个元素与可行解S进行合并,然后更新候选集的元素,同时对里面的每一个元素进行重新评估。

在逐个加入元素的过程中,体现了贪心,随机,自适应的特点,这也是算法名字的由来。为什么贪心,随机,自适应——可以看这篇

简单写写我的理解:

贪婪反映在了其对限制候选列表 (Restricted Candidate List -> RCL)的构建上(伪代码第2行到第5行),因为是按照价值增加的思想添加的。RCT的长度由参数\alpha确定。α = 1,对应完全随机的过程,所有候选元素都可随机选;α = 0,对应完全贪心的过程,只能选取最优的候选元素。

随机体现在选择点加入时是从限制候选列表中,随机进行选择的。

自适应体现在某次加入后,都会对RCL中的元素进行“更新”。

伪代码2:

  • 第1行,一开始解是一个空集。
  • 第2行,初始化候选元素的集合,这里候选元素是指能放进Solution的元素(也就是目前Solution里面没有的),比如1,2,3……。
  • 第3行,对候选集合的每个元素进行评估,计算将元素x放入Solution会导致目标函数f改变量delta_x。
  • 第5行,根据delta_x对各个元素排序,选取部分较好的候选元素组成RCL表(贪心性体现在这里)。
  • 第6行,随机在RCL中选取一个元素放进Solution。(算法的随机性)
  • 第8、9行,更新候选元素集合,然后对每个元素进行重新评估计算delta值。(算法的自适应性体现在这里)

2.3 局部搜索阶段

局部搜索算法以迭代的方式工作,通过在其邻域中用更好的解连续替换当前解。当在邻域中找不到更好的解时,它就终止。

在GRASP中,局部搜索的存在是因为构造阶段生成的解并不总是在邻域内最好的[6]。因此,其目的是改进在构造阶段中生成的解。

简单来说,就是为了改进/提升第一阶段生成初始解的质量的。

那么,我们自然可以想到基于邻域的算法,应该都可以拿来进行改进了。事实上,第二阶段,确实可以结合遗传,邻域搜索进行改进。或者你可以认为GRASP只是一个框架体系。?

参考资料:

1.这个比较全面,推荐

2.【优化算法】Greedy Randomized Adaptive Search算法 超详细解析,附代码实现TSP问题求解

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:36:03  更:2022-04-04 12:39:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:02:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码