首页 > 其他 > 详细

HDU2899 Strange fuction(模拟退火)

时间:2020-10-21 09:37:19      阅读:35      评论:0      收藏:0      [点我收藏+]

模拟退火模板,按比例接受

技术分享图片
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const double eps=1e-8;
double ans;
double y;
double cal(double x){return 6*pow(x,7.0)+8*pow(x,6.0)+7*pow(x,3.0)+5*pow(x,2.0)-y*x;}
int f[2]={1,-1};
double solve(double tmp){
    double res=1e18;
    double cur;
    double sx=50.0;
    cur=cal(sx);
    double dc=0.98;
    res=min(res,cur);
    while(tmp>eps){
        double nx=sx+f[rand()%2]*tmp;
        if(nx>100.0||nx<0.0);
        else{
            double nxd=cal(nx);
            res=min(res,nxd);
            if(cur-nxd>eps)sx=nx,cur=nxd;
            else if(exp(-(nxd-cur)/tmp)*RAND_MAX>rand()){
                sx=nx,cur=nxd;
            }
        }
        tmp*=dc;
    }
    return res;
}
int main(){
    //ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        cin>>y;
        ans=solve(100);
        printf("%.4f\n",ans);
    }
}
View Code

 

HDU2899 Strange fuction(模拟退火)

原文:https://www.cnblogs.com/ctyakwf/p/13849840.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!