模拟退火的思考
无论是求最大值还是最小值;能量差值del=now-ans;
del的正负性无关紧要,重要的是del的差值,也就是绝对值大小;
如果当前求的是最大值if(now>ans)ans=now,说明现在的值更优,否则完美以一定概率接受劣质解;
如果del越大说明劣质解偏差较大,我们接受它的概率就要小,否则劣质解偏差小,与当前解接近,我们接受这个解的概率就要更大;
这个概率体现在exp函数内; exp(-fabs(del)/T)*RAND_MAX>rand();
#include<bits/stdc++.h> using namespace std; int ans=0;//模拟退火只能取函数内的值,这个值几乎是不会被考虑进去的,所以不要想着最值在初始值这里会被取,除非把初始值加入函数内; int a[100]; void mnth() { for(double T=3000;T>1e-15;T*=0.995) { int now=a[rand()%10]; double del=now-ans; if(del>0)ans=now; else if(exp(-fabs(del)/T)*RAND_MAX>rand())ans=now; } } int main() { srand(time(NULL)); for(int i=0;i<=9;i++)a[i]=rand()%100; int x=200; for(int i=0;i<10;i++)cout<<a[i]<<" "; cout<<"\n"; while(x--)mnth(); cout<<ans<<endl; return 0; }

浙公网安备 33010602011771号