模拟退火的思考

无论是求最大值还是最小值;能量差值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; 
}

 

posted @ 2022-04-03 20:57  matt-11  阅读(32)  评论(0)    收藏  举报