Strange fuction
Sample Input
2
100
200
Sample Output
-74.4291
-178.8534
求函数最小值,模拟退火算法求取。求导取0也可行。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int n,m;
double y;
double func(double x){
return 6*pow(x,7)+8*pow(x,6)+7*pow(x,3)+5*pow(x,2)-y*x;
}
double solve(){
double T=100; //初始温度
double delta=0.98; //降温系数
double x=50.0; //x初值
double now=func(x); //x函数值
double ans=now; //记录答案
double eps=1e-8; //终止温度
while(T>eps){
int f[2]={1,-1};
double newx=x+f[rand()%2]*T; //随机改变x,随T降温而减少
if(newx>=0&&newx<=100){
double newt=func(newx);
ans=min(ans,newt);
if(now-newt>eps){ //新函数值更小,更新x
x=newx;
now=newt;
}
}
T*=delta;
}
return ans;
}
int main()
{
scanf("%d",&n);
while(n--){
scanf("%lf",&y);
printf("%.4f\n",solve());
}
return 0;
}