HDU5017 Ellipsoid 模拟退火

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

#include<stdio.h>
#include<math.h>
#define INF 1e30
double 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值