搜索 —— 启发式搜索

【概述】

启发式搜索算法,就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。

有时我们会遇到这样的一类题:题目描述的是一道时间复杂度很高的 NP 问题,我们要找到其中的最优解,显然不可能在短时间内找到最优解。

此时我们可以利用启发式搜索算法,来进行求解。

在程序设计竞赛中,启发式搜索的题目并不是很多,但启发式搜索算法在数据建模竞赛中应用的比较广泛。

【随机数据生成】

在开始学习启发式搜索算法之前,首先了解一下随机数据生成。

在 C++ 中,随机数据生成是利用 <cstdlib> 来调用 rand() 与 srand() 函数,来生成伪随机数序列,其中:

  • rand() 函数:返回 0~RAND_MAX 间的随机整数
  • srand(unsigned int seed):根据 seed 的值,来初始化伪随机数序列

在 windows 环境下,RAND_MAX=32767,当利用 srand() 初始化时,如果 seed 的值不变,那么利用 rand() 生成的随机整数将一直相同,因此,我们需要利用一个时刻改变的变量对其进行初始化

在 <ctime> 中,有一个 time(time_t *t) 函数,其可以获取当前系统时间,因此,在实际应用中,常利用以下方式来生成随机序列:

srand(time(0));
int num=rand();
cout<<num<<endl;

【常见的启发式搜索算法】

常见的启发式搜索算法有:A* 算法、蚁群算法、遗传算法、模拟退火、禁忌搜索、爬山法等,但在程序设计竞赛中,常用的是 A*算法、模拟退火、爬山法。

  1. A* 算法:点击这里
  2. 模拟退火:点击这里
  3. 爬山法:点击这里

【例题】

  1. 平衡点 / 吊打XXX(洛谷-P1337)(模拟退火)点击这里
  2. Buried memory(HDU-3007)(爬山法)点击这里
posted @   老程序员111  阅读(183)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示