HDU5017 Ellipsoid 模拟退火

来源:互联网 发布:配置usb端口出现错误 编辑:程序博客网 时间:2024/04/29 12:34

这是第一次接触模拟退火,感觉挺棒的。

#include<stdio.h>#include<math.h>#define INF 1e30double a,b,c,d,e,f;double getz(double x,double y){double A=c;double B=d*y+e*x;double C=a*x*x+b*y*y+f*x*y-1;double delta=B*B-4.0*A*C;if(delta<0)return INF;else{double z1,z2;z1=(-B+sqrt(delta))/A/2.0;z2=(-B-sqrt(delta))/A/2.0;if(fabs(z1)<fabs(z2))return z1;else return z2;}}double dx[8]={-1,-1,-1,0,0,1,1,1};double dy[8]={-1,0,1,-1,1,-1,0,1};double dis(double x,double y,double z){return sqrt(x*x+y*y+z*z);}int main(){while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f)!=EOF){double step=1,r=0.99;double cx=1,cy=0,nx,ny,cz,nz;cz=getz(cx,cy);double ans=dis(cx,cy,cz),temp;while(step>1e-10){for(int i=0;i<8;i++){nx=cx+dx[i]*step;ny=cy+dy[i]*step;nz=getz(nx,ny);temp=dis(nx,ny,nz);if(temp<ans){cx=nx;cy=ny;ans=temp;}}step*=r;}printf("%.7lf\n",ans);}return 0;}


0 0
原创粉丝点击