退火写法
查看原帖
退火写法
1412942
Marisa_physics楼主2024/8/16 03:28
#include <bits/stdc++.h>
using namespace std;
int n;
bool isAccepted(double probability) 
{
    return ((double)rand() / RAND_MAX) < probability;
}

double delta(double x)
{
    return abs(n-x);
}
double annealing()
{
    double initailSolution=10000000;
    double initailTemp=5000;
    double finalTemp=1e-8;
    double coolingRate=0.95;
    int maxTime=100000000;
    double temp=initailTemp;
    double x=initailSolution;
    for(int i=0;i<maxTime;i++)
    {
        if(temp<=finalTemp) return x;
        double d=((double)(rand())/RAND_MAX*2-1)*temp*delta(x);
        double nx=x+d;
        if(delta(nx)<delta(x) || isAccepted(exp(-(delta(nx)-delta(x))/temp)))
        {
            x=x+d;
        }
        temp*=coolingRate;
    }
    return x;
}

int main()
{
    int a,b;
    cin>>a>>b;
    n=a+b;
    srand((unsigned)(time(0)));
    cout << (int)round(annealing()) << '\n';
    return 0;
}
2024/8/16 03:28
加载中...