A Star not a Tree?

 

 

查看代码

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#define db double
#define inf 1e15
#define eps 1e-15
using namespace std;
int n;
db ax,ay,ans=inf,best=inf; 
db down=0.98,T0=3000;
struct point{
	db x,y;
}s[105];
db dist(point A,point B){
	return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y)); 
}
db getv(point x){
	db sum=0;	
	for(int i=1;i<=n;i++)sum+=dist(x,s[i]);
	return sum;
}
void solve(){
	for(db t=T0;t>eps;t*=down){
       db nx=ax+(rand()*2-RAND_MAX)*t;
       db ny=ay+(rand()*2-RAND_MAX)*t;
       db v=getv((point){nx,ny});
       db de=v-ans;
       if (de<0 || exp(-de/t)*RAND_MAX>rand()){
    		ax=nx;ay=ny;
    		ans=v;
       } 
       best=min(best,ans);
  }
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%lf%lf",&s[i].x,&s[i].y);		
		ax+=s[i].x,ay+=s[i].y;
	}
	ax/=n;ay/=n;
	ans=getv((point){ax,ay});
	for(int i=1;i<=100;i++)solve();
	printf("%d\n",(int)(best+0.5));
	return 0;
}

模拟退火好题

模拟退火:一种随机化算法

一开始有一个温度T0,温度会乘以下降系数down

 

posted @   liankewei123456  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示