搜索 —— 启发式搜索

【概述】

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

有时我们会遇到这样的一类题:题目描述的是一道时间复杂度很高的 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)(爬山法)点击这里
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页