题意:https://blog.csdn.net/Haipai1998/article/details/81566939 求解一个方程的最值
#include<bits/stdc++.h>
using namespace std;
double y;
const double eps=1e-10;
const double dd=0.88,PI=acos(-1.0);
double x1[8],E;
double f(double x)
{
x1[1]=x;
for(int i=2;i<=7;i++)
x1[i]=x1[i-1]*x;
return 6*x1[7]+8*x1[6]+7*x1[3]+5*x1[2]-y*x;
}
int sign(double x)
{
return fabs(x)<x?0:x<0?-1:1;
}
double myrand()
{
return rand()%10000/10000.0; ///rand_MAX=2^15-1;
}
void SA(double &ans)
{
double T=100;///步长
E=f(ans);///最初的最大值
//cout<<E<<endl;
while(T>eps)
{/// 循环条件大于eps
double next;
double mmax=1e20; ///保存100个点中最小距离最大的点
for(int i=0;i<100;++i)
{/// 随机100个点去扩展
double t;
double ang=myrand()*2*PI;///随机一个角度
t=ans+cos(ang)*T;
if(sign(t)<0) t=0.0;///不超过矩阵范围
if(sign(t-100)>0) t=100;
double nE=f(t);
if(sign(nE-mmax)<0)
{
next=t;
mmax=nE;
}
}
if(sign(mmax-E)<0 || exp((mmax-E)/T<myrand()))
{ /// 如果比当前值要大 或者 比当前值小,但是满足放弃当前局部最优解的条件.exp中的函数一定要满足和T成反比例
E=mmax;
ans=next;
}
T*=dd;/// 乘的数越大,循环次数越多,理论上越逼近全局最优解,但时间会剧增,
}
}
int main()
{
//freopen("t.txt","r",stdin);
int T;
double ans;
scanf("%d",&T);
while(T--)
{
scanf("%lf",&y);
ans=0.0;
SA(ans);
printf("%.4lf\n",E);
}
return 0;
}