模拟退火
一个基于随机的算法,多用于求解最优解问题。
对于一个多峰函数,该算法会在函数上不断跳跃并记录最优。
#include<bits/stdc++.h>
#define dou double
const dou lim = 1e-15, D = 0.9996;
using namespace std;
dou ansx, ansy, ansd;
dou clac(dou x, dou y){
}
void SA(){
dou t = 3000;
while(t > lim){
dou X = ansx + (2 * rand() - RAND_MAX) * t;
dou Y = ansy + (2 * rand() - RAND_MAX) * t;
dou dis = clac(X, Y);
dou d = ansd - dis;
if(d < 0){
ansx = X, ansy = Y, ansd = dis;
}else if(exp(-d / t) * RAND_MAX > rand()){
ansx = X, ansy = Y;
}
t *= D;
}
}
int main(){
srand(time(NULL));
dou sx, sy, st = clock();
ansx = sx, ansy = sy;
ansd = clac(ansx, ansy);
while((clock() - st) / CLOCKS_PER_SEC < 0.8) SA();
return 0;
}
主要参数包括\(t,D,lim\)。
\(t控制跳跃的幅度\)
\(D,lim控制跳跃的次数\)
标签:ansx,ansy,lim,模拟退火,ansd,dou From: https://www.cnblogs.com/Peng1984729/p/18198596