BZOJ.3680.吊打XXX(模拟退火/爬山算法)
模拟退火(Simulated Annealing,SA):
(1)初始化一个温度(充分大)、初始解状态S、每个T值的迭代次数。
(2)对i=1,...,L,做(3)至(7)步。
(3)产生新解S'。
(4)计算Δt=C(S')-C(S),其中C(S)为评价函数。
(5)若Δt<0,则接受新解S'作为当前解;否则以exp(-Δt/(kT))的概率接受S'作为当前解(k为玻尔兹曼常数,一般不管它?)
(6)如果满足终止条件,则输出当前解作为最优解,结束程序。
终止条件通常为连续若干个新解都没有被接受时终止算法。
(7)T逐渐减少,且T->0,转(2)。
//1028kb 6256ms
#include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define D (0.96)//as big as possible?
#define Rand() ((rand()<<1)-RAND_MAX)
const int N=10005;
int n;
struct Node{
int w;
double x,y;
}p[N];
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline double Sqr(double x){
return x*x;
}
inline double Dis(double x,double y,int i){
return sqrt(Sqr(x-p[i].x)+Sqr(y-p[i].y));
}
double Calc(double x,double y)
{
double res=0;
for(int i=1; i<=n; ++i)
res+=Dis(x,y,i)*p[i].w;//i->dis*w[i] i对答案产生dis*w[i]的影响
return res;
}
void SA()
{
double ansx=0,ansy=0,ans;
for(int i=1; i<=n; ++i)
ansx+=p[i].x*p[i].w, ansy+=p[i].y*p[i].w;
ansx/=n, ansy/=n, ans=Calc(ansx,ansy);
for(int Time=1; Time<=5; ++Time)//多次!需要记录ans及now。
{//一次大概要1000次。
double T=1000,nowx=ansx,nowy=ansy,now=Calc(ansx,ansy),res,xx,yy;
while(T>1e-12)
{
// xx=ansx+T*(2*(rand()%Max)-Max),yy=ansy+T*(2*(rand()%Max)-Max);//x(y)+[-Max,Max-2] 不能只是用坐标的最大值。。delta应该够大些。
xx=nowx+T*Rand(),yy=nowy+T*Rand();//x(y)+[-RAND_MAX,RAND_MAX-1]
res=Calc(xx,yy);
if(res<ans) ans=res, ansx=xx, ansy=yy;
if(res<now)
nowx=xx, nowy=yy, now=res;
else if(exp((now-res)/T)*RAND_MAX>rand())//exp(-delta/T)>rand()/RAND_MAX
nowx=xx, nowy=yy;
T*=D;
}
}
printf("%.3lf %.3lf",ansx,ansy);
}
int main()
{
srand(20180501);
n=read();
for(int i=1; i<=n; ++i) p[i].x=read(),p[i].y=read(),p[i].w=read();
SA();
return 0;
}
爬山算法:
感觉流程和代码有点。。不写了。
每次将当前情况(所有点)对答案的影响计算出来,答案接受影响*T后的值;T逐渐减小,直至T足够小输出答案。
//1016kb 2584ms
#include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define D (0.97)//尽量大些?
const int N=10005;
int n;
struct Node{
int w;
double x,y;
}p[N];
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
inline double Sqr(double x){
return x*x;
}
inline double Dis(double x,double y,int i){
return sqrt(Sqr(x-p[i].x)+Sqr(y-p[i].y));
}
void Hill_Climb()
{
double ansx=0,ansy=0;
for(int i=1; i<=n; ++i)
ansx+=p[i].x*p[i].w, ansy+=p[i].y*p[i].w;
ansx/=n, ansy/=n;
double T=1000,dis,xx,yy;
while(T>1e-8)
{
xx=yy=0;
for(int i=1; i<=n; ++i){
dis=Dis(ansx,ansy,i);
if(dis<1e-10) continue;//除0。。
xx+=(p[i].x-ansx)*p[i].w/dis,//每个点对答案产生x(y)/r*w[i]的影响。
yy+=(p[i].y-ansy)*p[i].w/dis;
}
ansx+=xx*T, ansy+=yy*T;
T*=D;
}
printf("%.3lf %.3lf",ansx,ansy);
}
int main()
{
n=read();
for(int i=1; i<=n; ++i) p[i].x=read(),p[i].y=read(),p[i].w=read();
Hill_Climb();
return 0;
}
BZOJ.3680.吊打XXX(模拟退火/爬山算法)的更多相关文章
- bzoj 2428: [HAOI2006]均分数据 && bzoj 3680 : 吊打XXX 模拟退火
每次把元素随便扔随机一个初始解,退火时每次随机拿一个元素扔到随机一个集合里,当温度高时因为状态不稳定扔到那个元素和最小的里边. 如果新解优,更新ans. 把原式拆一下,就可以用int存了. bzoj ...
- 洛谷 P1337 平衡点 & bzoj 3680 吊打 XXX —— 模拟退火
题目:https://www.luogu.org/problemnew/show/P1337 https://www.lydsy.com/JudgeOnline/problem.php?id=3680 ...
- bzoj 3680 吊打xxx 模拟退火
第一道模拟退火 重心嘛,就是要找到一个点,使其到所有点距离*该点权值和最小 思路:初始化一个T,mint,当T大于mint时,每次随机一个解,如果解比当前解优,直接转移,否则,以某概率(与T正相关)转 ...
- BZOJ 3680: 吊打XXX (模拟退火)
//yy:今天简单入门学了下ORZ 爬山算法:兔子朝着比现在高的地方跳去.它找到了不远处的最高山峰.但是这座山不一定是珠穆朗玛峰.这就是爬山算法,它不能保证局部最优值就是全局最优值. 模拟退火:兔子喝 ...
- BZOJ 3680: 吊打XXX【模拟退火算法裸题学习,爬山算法学习】
3680: 吊打XXX Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 3192 Solved: 1198[Sub ...
- [BZOJ 3680] 吊打XXX 【模拟退火】
题目链接:BZOJ - 3680 题目分析 这道题是SLYZ的神犇把JSOI的平衡点那道题改了一下题面变成了吊打GTY神犇..Orz 第一次写模拟退火,只能照着别人的代码写,我看的是PoPoQQQ神犇 ...
- BZOJ 3680 吊打XXX
Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞 ...
- 3680: 吊打XXX
3680: 吊打XXX 链接 思路: 模拟退火. 代码: 跑的特别慢... #include<cstdio> #include<algorithm> #include<c ...
- 【BZOJ3680】吊打xxx [模拟退火]
吊打XXX Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description gty又虐了一场比赛,被虐的蒟蒻 ...
随机推荐
- VMware ESXI6.0服务器安装
1.制作一个ESXI6.0的系统安装盘 2.服务器启动后加载VMware ESXi 6.0的ISO文件,开始安装. 3.ESXi引导装入程序,VMware ESXi引导过程,在屏幕上方显示的版本号.内 ...
- Redis实战(八)Redis的配置文件介绍
https://www.cnblogs.com/ysocean/p/9074787.html
- Spark笔记之数据本地性(data locality)
一.什么是数据本地性(data locality) 大数据中有一个很有名的概念就是"移动数据不如移动计算",之所以有数据本地性就是因为数据在网络中传输会有不小的I/O消耗,如果能够 ...
- 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x-packV5.4.2安装
相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+klanaV5.4.2+x-p ...
- jquery-easyui:格式化列
主框架页面: 在主界面区会加载西区菜单点击的URL内容. <!DOCTYPE html> <html> <head> <meta charset=" ...
- JavaEE之JavaWeb简介
- day25作业
1.阻塞 2.就绪 3.阻塞 4.Runnable 5.join() 6.synchronized 7.notify()和notifyAll() 8.Object 1.A 2.D ...
- mysql 用init-connect+binlog实现用户操作追踪做access的ip的log记录
在MYSQL中,每个连接都会先执行init-connect,进行连接的初始化.我们可以在这里获取用户的登录名称和thread的ID值.然后配合binlog,就可以追踪到每个操作语句的操作时间,操作人等 ...
- HDOJ题目分类
模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...
- Python 驱动 MongoDB 示例(PyMongo)
Python 的MongoDB驱动 pymongo ,使用pip Install pymongo安装即可 最近发现网上的很多实例已经过时了,在此自我探究记录下来. 编写一个接口类来支持MongoDB的 ...