模拟退火算法

一、模拟退火

  模拟物理的金属退火,使某一个状态慢慢趋于稳定,与爬山算法相类似的一类求解近似解的问题。

二、算法里的公式

  若迭代出的解一定优于当前解,则当前解被覆盖。而当迭代的解不优于当前解得时候,我们用一个概率去接受它。

  e^df/kT 

  k为常数,编程中常常设置为1

  T为温度

  e为指数函数

  df为负数,因为如果概率要保证0<e^df/kT < 1,那么df必定要为负数

  T下降的系数为0.993-0.998

三、代码模板

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 double n;
 4 const double eps = 1e-14;
 5 double T = 20000;
 6 double dT = 0.985;
 7 double k = 1;
 8 double dx,dy;
 9 double x,y;
10 double func(double z)
11 {
12     return fabs(z * z - n);
13 }
14 void SA()
15 {
16     srand(time(NULL));
17     x = 0;
18     y = func(x);
19     while(T > eps){
20         //随机偏移量
21         dx = x + (rand() * 2 - RAND_MAX) * T;
22         while(dx < 0)
23             dx = x + (rand() * 2 - RAND_MAX) * T;
24         dy = func(dx);
25         if(dy < y)
26             x = dx,y = dy;
27         //一定概率去接收目前较小的答案
28         else if(exp((y - dy) / (k * T)) * RAND_MAX > rand())
29             x = dx,y = dy;
30         T *= dT;
31     }
32 }
33 int main()
34 {
35     cin >> n;
36     SA();
37     cout << fixed << setprecision(14) << x;
38     return 0;
39 }
上一篇:【Maclean Liu技术分享】拨开Oracle优化器迷雾探究Histogram之秘


下一篇:矩阵函数的常见求法