–打个比方——将一个铁块加热至熔融态,并以此为最初状态,在此基础上不断降温,最终凝固,原子不再活跃。
–实现原理——刚开始的元素极为活跃,若是随机取到的值比原来的值更优,那么就放进一个临时的变量中,若是随机到的值较差,那么也有一定概率取到这个值,只不过概率随时间慢慢降低(退火降温导致原子不再活跃),最终将取到的临时变量中的值与原最优值进行比较,选择更新。
–实现步骤:
(1)定义初始温度、中止温度、退火速度;
(2)随机取一个值定为最优值;
(3)建立内外函数,内函数用来在等温状态(等概率)下取值,外函数用来退火降温(降低概率);
#include <iostream>//模拟退火
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define T 10000//初始温度
#define EPS 1e-8//中止温度
#define DELTA 0.98//退火速度
#define y x*x*x+x*x+x//定义函数
int main()
{
double diffy, newy, besty, fakey, t = T, x;
int i, j;
srand((unsigned)time(NULL));
x = rand() % 1000;//函数定义域
besty = y;
while (1)
{
fakey = besty;
for (i = 0; i < 1000; i++)
{
x = rand() % 1000;
newy = y;
diffy = newy - besty;
if (diffy < 0)
fakey = newy;
else
{
double rd = rand() / (RAND_MAX + 1.0);
if (exp(diffy / t) > rd)
fakey = newy;
}
}
if (fakey < besty)
besty = fakey;
if (t < EPS)
break;
t *= DELTA;
}
printf("%lf", besty);
return 0;
}