模拟退火求调 只过了第一个点
查看原帖
模拟退火求调 只过了第一个点
258178
Benzenesir楼主2022/5/21 15:11

code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <time.h>
#include <math.h>

using namespace std;
const int maxN=2001;
int n;
double t=3000;
double t0=1e-14;
double down=0.996;
double sumx,sumy;
double ans;
double ex,ey;
double x,y;

struct node {
	double x,y;
	int data;
}a[maxN];

double power(double x,double y){
	double p=0;
	for(int i=1;i<=n;i++){
		double temp=(x-a[i].x)*(x-a[i].x)+(y-a[i].y)*(y-a[i].y); 
		p+=sqrt(temp);
	}
	
	return p;
}


void ltfd(){
	double t=2000;
	
	//ex=sumx,ey=sumy;
	while(t>t0){
		//rand() 0~RAND_MAX
		//rand()*2-RAND_MAX -RAND_MAX~RAND_MAX-1
		
		double x1=x+(rand()*2-RAND_MAX)*t; 
		double y1=y+(rand()*2-RAND_MAX)*t;
		
		double now=power(x1,y1);
		double de=now-ans;
		if(de<0){
			ans=now;
			x=x1,y=y1;
			ex=x1,ey=y1;
		//	cout << ex << " " << ey << endl;
		}
		else if(exp(-de/t)*RAND_MAX>rand()){
			x=x1,y=y1;
		}
		t*=down;
	}
}

void SA(){
	ltfd();
	ltfd();
	ltfd();
	ltfd();
	ltfd();
	
}




int main(){
	srand(20020202);
	ios::sync_with_stdio(false);//cin加速 
	cin >> n ;
	for(int i=1;i<=n;i++){
		cin >> a[i].x >> a[i].y >> a[i].data ;
		sumx+=a[i].x ,sumy+=a[i].y ;
	} 
	sumx/=n,sumy/=n;
	ans=power(sumx,sumy);
	x=sumx,y=sumy;
	SA();
	//cout << ex << " " << ey << endl;
	printf("%.3lf %.3lf",ex,ey);
	
	return 0;
}

2022/5/21 15:11
加载中...