用正交分解法算出来总是不对(注释里面的是正交分解),求教
查看原帖
用正交分解法算出来总是不对(注释里面的是正交分解),求教
472169
liuxiangbin楼主2021/9/14 20:27
/*
author: 刘向斌
created:2021-9-14 19:04:58 
*/
#include<bits/stdc++.h>
#define RD T*(rand()*2-RAND_MAX)
using namespace std;

int times=1,n;
double x[1010],y[1010],w[1010];
long double eps=1e-14,D=0.97;
//long double cal(long double a,long double b){
//	long double ans1=0,ans2=0,tmp;
//	for(int i=1;i<=n;i++){
//		tmp=sqrt((a-x[i])*(a-x[i])+(b-y[i])*(b-y[i]));
//		ans1+=w[i]*(a-x[i])/tmp;
//		ans2+=w[i]*(b-y[i])/tmp;
//	}
//	return sqrt(ans1*ans1+ans2*ans2);
//}
long double cal(long double x0,long double y0){
    long double res=0,dx,dy;
    for(int i=1;i<=n;++i){//函数求值
        dx=x[i]-x0;dy=y[i]-y0;
        res+=sqrt(dx*dx+dy*dy)*w[i];
    }
    return res;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	long double T,ansx,ansy,ans,best,bx=0,by=0,tx,ty,res;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x[i]>>y[i]>>w[i];
		bx+=x[i];by+=y[i];
	} 
	best=ans=cal(bx/=n,by/=n);
	srand(time(NULL));
	while(times--){
		ansx=bx;ansy=by;ans=best;
		T=1e5;
		while(T>eps){
			tx=ansx+RD;ty=ansy+RD;
			res=cal(tx,ty);
			if(best>res){
				bx=tx;by=ty;best=res;
			}
			if(ans>res||exp((ans-res)/T)>(long double)rand()/RAND_MAX){
				ans=res;ansx=tx;ansy=ty;
			}
			T*=D;
		}
	}
	printf("%.3Lf %.3Lf\n",bx,by);
	return 0;
}
2021/9/14 20:27
加载中...