欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

搜索 —— 启发式搜索 —— 模拟退火

发布时间:2025/3/17 编程问答 27 豆豆
生活随笔 收集整理的这篇文章主要介绍了 搜索 —— 启发式搜索 —— 模拟退火 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

【概述】

模拟退火(Simulated Annealing,SA),其类似于物理学上金属退火的过程,故称为模拟退火,其是一个随机化与贪心结合的算法,在你 RP 较好或数据范围比较小的时候,可以轻松解决许多难题。

模拟退火的原理与金属退火的原理近似:

  • 将热力学的理论套用到统计学上
  • 将搜寻空间内每一点想像成空气内的分子
  • 搜寻空间内的每一点,也像空气分子一样带有动能,其用于表示该点对命题的合适程度
  • 演算法先以搜寻空间内一个任意点作起始:每一步先选择一个相邻的点,然后再计算从现有位置到达相邻点的概率

【主要思路】

我们模拟物理退火的三个过程:加温、等温、冷却,来归纳一下模拟退火算法的主要思路:

首先,确定一个初始温度 T,这个参数是随机选择的,初始温度选择的越好,算法表现就越好,但具体该选何值,没有一个明确的界定方法,只能依靠 RP 来选,不过据说有些大佬可以根据题目推出最优初始温度

然后,当温度大于一个边界值时,我们将当前状态的答案与下一状态的答案进行比较:

  • 如果 res<newRes,转移答案
  • 如果 res>newRes,有一定概率转移答案

在扩展状态时有一个小方法:nextSta=nowSta+(rand()∗2−RAND_MAX)∗T,这样的原理是:(rand()∗2−RANDMAX) 的范围是从负数到正数的,这样在扩展坐标的时候就可以多方向扩展,不会只在一个方向上更新。

其次,确定转移答案的概率,由于转移答案的概率需要随着时间的推移res 和 newRes 差值的增大而增大,因此常表示为:,其中

最后,我们模拟降温过程,对 T 乘以一个小于但十分接近于 1 的数 delta,以体现时间对答案的影响。

这样,随着温度不断降低,变化幅度也越来越小,接受一个更劣的解的概率也越来越小。

void SA(double nowSta){int T = ****; //初始温度double delta=0.99;int res=getRes(nowSta);//初始状态能得到的答案while (T > EPS) { // EPS是一个大于0的极小值,用于精度的比较,一般取1E-9~1E-15int nextSta = nowSta + (rand() * 2 - RAND_MAX)*T; //扩展状态int newRes = getRes(nextSta); //记录下一个状态能得到的答案double pr = exp((res - newRes) / T) * RAND_MAX;//一定的概率if (res < newRes || pr > rand()){//新的代价小于当前代价,或在一定概率下nowSta = nextSta;//更新当前状态res = newRes;//更新新状态的答案}T *= delta; //降温的过程,将温度减小} }

 

总结

以上是生活随笔为你收集整理的搜索 —— 启发式搜索 —— 模拟退火的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。