Day 4 - 搜索进阶与模拟
1|0启发式搜索
下面将简要介绍启发式搜索及其用法。
1|1定义
启发式搜索(英文:
启发式函数的作用是基于已有的信息对搜索的每一个分支选择都做估价,进而选择分支。简单来说,启发式搜索就是对取和不取都做分析,从中选取更优解或删去无效解。
1|2例题
由于概念过于抽象,这里使用例题讲解。
题目大意:有
解题思路:
我们写一个估价函数
估价函数
我们在取的时候判断一下是不是超过了规定体积(可行性剪枝);在不取的时候判断一下不取这个时,剩下的药所有的价值 + 现有的价值是否大于目前找到的最优解(最优性剪枝)。
示例代码:
2|0A* 算法
本页面将简要介绍 A * 算法。
2|1定义
A * 搜索算法(英文:A*
2|2过程
定义起点
A * 算法每次从优先队列中取出一个
如果
上述条件下,如果
当
2|3例题
八数码。
题目大意:在
解题思路:
容易发现
参考代码:
注:对于 k 短路问题,原题已经可以构造出数据使得 A* 算法无法通过,故本题思路仅供参考,A* 算法非正解,正解为可持久化可并堆做法。
k 短路。
按顺序求一个有向图上从结点
解题思路:
很容易发现,这个问题很容易转化成用 A * 算法解决问题的标准程式。
初始状态为处于结点
就这样,我们在预处理的时候反向建图,计算出结点
由于设计的距离函数和估价函数,每个状态需要存储两个参数,当前结点
我们可以在此基础上加一点小优化:由于只需要求出第
参考代码:
2|4参考资料与注释
3|0迭代加深搜索
3|1定义
迭代加深是一种 每次限制搜索深度的 深度优先搜索。
3|2解释
迭代加深搜索的本质还是深度优先搜索,只不过在搜索的同时带上了一个深度
既然是为了找最优解,为什么不用
当搜索树的分支比较多时,每增加一层的搜索复杂度会出现指数级爆炸式增长,这时前面重复进行的部分所带来的复杂度几乎可以忽略,这也就是为什么迭代加深是可以近似看成
3|3过程
首先设定一个较小的深度作为全局变量,进行
实现(伪代码):
3|4注意事项
在大多数的题目中,广度优先搜索还是比较方便的,而且容易判重。当发现广度优先搜索在空间上不够优秀,而且要找最优解的问题时,就应该考虑迭代加深。
4|0模拟
下面将简要介绍模拟算法。
4|1简介
模拟就是用计算机来模拟题目中要求的操作。
模拟题目通常具有码量大、操作多、思路繁复的特点。由于它码量大,经常会出现难以查错的情况,如果在考试中写错是相当浪费时间的。
4|2技巧
写模拟题时,遵循以下的建议有可能会提升做题速度:
- 在动手写代码之前,在草纸上尽可能地写好要实现的流程。
- 在代码中,尽量把每个部分模块化,写成函数、结构体或类。
- 对于一些可能重复用到的概念,可以统一转化,方便处理:如,某题给你 "
时:分" 把它抽取到一个函数,处理成秒,会减少概念混淆。 - 调试时分块调试。模块化的好处就是可以方便的单独调某一部分。
- 写代码的时候一定要思路清晰,不要想到什么写什么,要按照落在纸上的步骤写。
实际上,上述步骤在解决其它类型的题目时也是很有帮助的。
4|3例题详解
一只长度不计的蠕虫位于
解题思路:
直接使用程序模拟蠕虫爬井的过程就可以了。用一个循环重复蠕虫的爬井过程,当攀爬的长度超过或者等于井的深度时跳出。
参考代码:
4|4习题
__EOF__

本文链接:https://www.cnblogs.com/So-noSlack/p/18295642.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文来自博客园,作者:So_noSlack,转载请注明原文链接:https://www.cnblogs.com/So-noSlack/p/18295642
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2023-07-11 第二节 贪心